Имя: Пароль:
1C
 
Как лучше реализовать очередь? V7.7
0 Khant
 
02.11.04
07:10
Доброе утро господа и дамы.
Собрался доделать систему учёта.
Одним из пунктов надо будет реализовать очередь исполнителей.
Суть задачи такая. Исполнители (справочник) при выходе на дежурство, отмечаются у диспетчера, он их ставит в очередь. При получении заказа диспетчер оформляет наряд и передаёт его исполнителя первого из очереди. После исполнения заказа исполнитель регистрируется у диспетчера и встаёт в конец очереди.
Также могут быть причины по которым, исполнитель не выбирается для исполнения заказа, но и не теряет своей очереди.
Система сетевая, диспетчеров может быть несколько, а очередь одна на всех.
1 OFF
 
02.11.04
07:19
Фиксировать время отметки у диспетчера
2 Rovan
 
гуру
02.11.04
08:45
(0) Объект всех времен и народов - спрвочник с сортировкой по коду (или по др. реквищиту)
3 Naumov
 
02.11.04
08:48
Регистр: всал в очередь - движениеПриходж
Ушел из очереди - в расход его.
и хронология автоматически поддерживается.
4 Оборотень
 
02.11.04
08:55
(3) а каким методом здесь FIFO организовать?
5 Шапокляк
 
02.11.04
09:06
А каким документом приход по регистру делаешь, он типа партия будет
6 Оборотень
 
02.11.04
09:09
(4) во ... додумался ... в регистре два измерения - Исполнитель и время
делаем запрос сортируем по времени и потом самого раннего - на выход ...
Блин как все просто :)
7 Шапокляк
 
02.11.04
09:11
А у измерения Время какой тип будет?
8 Оборотень
 
02.11.04
09:19
(7) например строка или число - не принципиально - наверное строка лучше будет :)
9 Шапокляк
 
02.11.04
09:43
2004/01/11/09/27/13 и 2004/31/10/23/54/25 как расположатся?
Лучше уж документы - они по времени более прилично сортируются
10 Оборотень
 
02.11.04
09:53
(9) точно!!! тогда достаточно одного измерения Исполнитель, а документ можно получить через ТекущийДокумент в запросе :)
11 Оборотень
 
02.11.04
09:57
(9) кроме того дату/время можно написать и так
2004/11/01/09/27/13 и 2004/10/31/23/54/25 - смысл не меняется, но с сортировкой все ОК :)
12 Naumov
 
02.11.04
10:03
(10) Какой текущий документ, в каком запросе?
Делаем измерение типа документ и тогда
простое (нам ведь только актуальное значение треба)
Тз=СоздатьОбъект("ТаблицаЗначений");
Регистр.<нужный регистр>.Выгрузитьитоги(ТЗ);
Получим ТЗ со списком находящихся в очереди. при необходимости можно отсортировать по документу (но при выгрузке она уже должна быть отсортированной)
13 Оборотень
 
02.11.04
10:17
(12) Можно и через итоги, А можно и так:
ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Исполнитель = Регистр.Очередь.Исполнитель;
   |ТекущийДокумент = Регистр.Очередь.ТекущийДокумент;
   |Группировка ТекущийДокумент упорядочить по ТекущийДокумент.ДатаДок, ТекущийДокумент.ВремяДок;
   |"//}}ЗАПРОС
   ;
14 Оборотень
 
02.11.04
10:22
+ (13)

В запросе не хватает
...
   |Флаг = Регистр.Очередь.Флаг;
   |Функция ФлагКонОст = КонОст(Флаг);
...
15 Naumov
 
02.11.04
10:26
Угу, дарагой, откуда скажи ты без периода ТекущийДокумент получишь?
Это поле можно получить только анализируя обороты, а не остатки, т.е. не пройдет твой запрос.
Ну а то, что любой запрос, использующий период, выполняется в 77 дважды скорости твоему алгоритму не добавит.
16 Оборотень
 
02.11.04
10:41
(15) временное умопомешательство было ... согласен без второго измерения по Документам фигня получается ...
Сорри дарагой!!!
17 Naumov
 
02.11.04
10:48
:)
18 Khant
 
02.11.04
10:48
Вариант (4) мне определённо нравится, только я думал сделать не регистр, а добавить в справочник исполнителей такое поле типа строка время постановки на очередь и сортировать список исполнителей по этому полю. И выбрасывать из списка если это поле 0. Дал наряд обнулил поле. Поставил в очередь сделал отметку о времени Т.е. очередь это будет форма списка справочника отсортированная и отобранная по этому полю. Только вот встаёт проблемка, если список очередь одновременно смотрят два или более диспетчеров на своих комьютерах. И один из них выписал наряд (обнулил поле время у элемента справочника)- как в списках у других диспетчеров это событие отразится автоматически? или как им сигнализировать о том, что надо обновить форму списка?
19 Naumov
 
02.11.04
10:53
Сама обновиться
20 Khant
 
02.11.04
10:57
очепятка в (18) ссылка не на (4) а на (6)
21 vS
 
02.11.04
11:02
(12) ВыгрузитьИтоги(ТЗ, 1) чтобы по хронологии документов
22 Khant
 
02.11.04
11:10
(19) а точно сама обновиться? У меня что то большие сомнения.
Второй компьютер будет только через неделю тогда смогу проэксперименировать. Жаль время терять.
А кто-нибудь пользовался эмуляторами виртуальных машин и сетей типа VMWare, для отладки внутри одного компьютера сетевых программ. Стоит ли заводить эту бодягу если у меня Celeron 533/128Mb
23 Оборотень
 
02.11.04
11:11
(18) она обновится через небольшой интервал времени. Помню где-то у 1С есть частота обновления таблиц. Так что есть небольшой шанс коллизии.
Регистр ИМХО надежнее, но встает проблема с обновлением списка свободных исполнителей. Зато можно проследить историю - типа какой исполнитель что делал, как быстро и т.д. Да вот и ещё в конце смены прийдется делать документ сброса очереди (чтобы исполнители исчезли из списка свободных) или что-то в этом роде.
Так что дело вкуса :)
24 Khant
 
02.11.04
11:45
Насчёт того, что регистр надёжнее - достаточно спорное утверждение. Я не вижу причин по которым это было бы надёжнее. Преимущество решения с регистром я вижу в том, что сохранится история движения очереди, при необходимости е
25 Khant
 
02.11.04
11:50
Насчёт того, что регистр надёжнее - достаточно спорное утверждение. Я не вижу причин по которым это было бы надёжнее.
Насчеёт преимущества решения с регистром действительно есть, сохранится история движения очереди, при необходимости её последовательность можно будет восстановить для каких-нибудь разбирательств. Но я пока не могу представить для чего это может понадобиться.
А вот недостаток вижу серьёзный - оператор будет порождать уйму лишних документов постановка на очередь, отдача наряда, снятие с очереди, и кроме того проблема с обновлением списка очередников у разных диспетчеров.
26 Khant
 
02.11.04
11:58
А в решении с добавлением поля времени в справочнике исполнители, видимо в условную процедуру ПриВыбореИсполнителя() придётся вставить код проверяющий, не выбрал ли кто нибудь уже этого исполнителя. Ну получит диспетчер сообщение, что выбранный исполнитель уже отправлен на задание другим диспетчером и выберет другого.  Стоп. Чего это я несу, ха. Перед тем как отдать заявку диспетчер будет связывается с первоочередным исполнителем и передавать ему заказ, а уж затем будет вносить его в наряд. Коллизии возникнуть не должно.
27 Khant
 
02.11.04
12:01
А не предусмотрено ли в 1С каких нибудь сигналов между запущенными процессами разных пользователей одной базы, которые можно было бы поиспользовать?
28 Naumov
 
02.11.04
12:04
(27) Через константу передашь все что угодно.
или справочник, через файл в конце концов.
29 sudo_su
 
02.11.04
12:16
(22) На целероне в принципе можно поднять vmware и поставить туды 98й вин. Сеть работает.
30 Оборотень
 
02.11.04
12:34
(28) Опять упираемся в частоту обновления открытых форм (например справочника) ...
можно сделать Форма.Обновить() перед изменением реквизита, если я ничего не путаю, ... и вот свежие данные.
31 Оборотень
 
02.11.04
12:52
Мысль возникла, может лажа, а может и нет ...
Делается ОДИН документ и в нем 3-и закладки
"Поставить в очередь", "Отдать заявку", "Снять с очереди"
Снимаем галку автоматического удаления движений и реализуем механизм допроведения (в регистре должен быль реквизит Дата/Время типа строка в форме наподобие этой 2004/11/02/12/05/25). В зависимости от закладки делаем движение регистра по кнопочке на форме.
Операторы открывают каждый свой док и сидят в нем весь день ... - вот и решение с кучей документов.

"Пусть безумная идея ... " В.Высоцкий
32 Khant
 
02.11.04
15:00
(28) Через константу, файл или справочник передать можно, а вот как в этом случае сообщить процессу другого юзера, что произошло событие и надо смотреть файл, константу, справочник.
33 Оборотень
 
02.11.04
15:16
Никак :(
Нет такой фишки
34 Wasya
 
02.11.04
16:01
Создается справочник очередь реквизиты: Сотрудник, ВремяПрихода, ВремяУхода 2х уровневый
В нем две папки Очередь, Работа
На форме списка две кнопки Добавить, Работа
Модуль формы списка:
Процедура Добавить()
   Спр=СоздатьОбъект("Справочник.Очередь");
   Спр.Новый();
   ТЧ="";
   ТМ="";
   ТекущееВремя(ТЧ,ТМ);
   Спр.ВремяПрихода=Формат(Число(ТЧ),"Ч(0)2")+":"+Формат(Число(ТМ),"Ч(0)2");
   Спр.Родитель=Константа.Очередь;
   Спр.Записать();
   ОткрытьФорму(Спр.ТекущийЭлемент());
КонецПроцедуры
Процедура Работа()
   ТекЭл=ТекущийЭлемент();
   Спр=СоздатьОбъект("Справочник.Очередь");
   Если Спр.НайтиЭлемент(ТекЭл)=1 Тогда
       Спр.Родитель=Константа.Работа;
       ТЧ="";
       ТМ="";
       ТекущееВремя(ТЧ,ТМ);
       Спр.ВремяУхода=Формат(Число(ТЧ),"Ч(0)2")+":"+Формат(Число(ТМ),"Ч(0)2");
       Спр.Записать();
       Форма.Обновить(0);
   КонецЕсли;
КонецПроцедуры
35 Khant
 
02.11.04
21:02
(34) Отлично, классно это мне ещё больше нравится, сразу всех видно кто на задании, кто в очереди и ещё можно сделать папку горячий резерв, то бишь кто не в очереди, но при необходимость можно из дома поднять. Теперь главное, чтобы система не подкачала и обновляла список у всех диспетчеров быстро. Получу гонорар буду должен процент Wasya-е.
36 Naumov
 
02.11.04
21:36
(32) Событие нужно периодически проверять
Процедуру обработки можно задать используя метод ОбработкаОжидания(..)