![]() |
![]() |
![]() |
|
Как лучше реализовать очередь? 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) Событие нужно периодически проверять
Процедуру обработки можно задать используя метод ОбработкаОжидания(..) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |