Как организовать очередь?

1. newborn 28.10.21 00:26 Сейчас в теме
Предыстория:
Надо изменить 1С:Касса.
Стоит задача печатать чеки на нескольких терминалах. Есть таблица значений, где эти элементы справочников этих терминалов собраны, и суммы, которые надо провести через терминал.
Но в модулях программы всё построено на асинхронных вызовах и обработке оповещения. В результате если я последовательно буду вызывать методы печати на терминалы для этих справочников, то у меня может оказаться, что предыдущая операция для одного терминала закончится позже, чем последующая операция для другого терминала. И что пойдёт в банк вообще будет невозможно проконтролировать.
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно. А в случае асинхронных вызовов я точно не знаю, какие терминалы уже обработаны а какие ещё нет.
ЗАДАЧА:
Как на 1С средствами встроенного языка организовать очередь, чтобы операции с каждым последующим терминалом не начиналась, пока не закончится операция с предыдущим?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. spacecraft 28.10.21 09:28 Сейчас в теме
(1) очередь можно сделать на РС. Непериодический независимый РС использовать как флаг выполнения задачи терминалом. Перед началом проверить на пустой РС, далее записать в него значение, после выполнения - удалить запись из РС.
Для сброса зависших заданий, предусмотреть периодическое очищение РС.
7. newborn 28.10.21 10:09 Сейчас в теме
(5) На регистрах - это как-то слишком затратно, мне кажется. Время записи в регистр может быть слишком большим.
8. Sashares 35 28.10.21 10:27 Сейчас в теме
(7)
Время записи в регистр может быть слишком большим.

С чего вдруг такой вывод?
9. spacecraft 28.10.21 10:36 Сейчас в теме
(7) при работе с непериодическим независимым РС будут минимальные затраты. Если конечно доступность к самой базе адекватно по времени.
10. newborn 28.10.21 10:41 Сейчас в теме
(9) Конфигурация 1С:Касса, в общем случае может работать в облаке. В этом случае время реакции при записи в регистр может быть слишком большим.
11. spacecraft 28.10.21 10:46 Сейчас в теме
(10) в любом случае нужно делать это на сервере. А там хоть облако, хоть не облако. Доступ с сервера к базе должно быть минимальное.
12. spacecraft 28.10.21 10:48 Сейчас в теме
(10) в любом случае придется делать это через запись в базу. Хоть в РС, хоть еще куда. По другому нормально не сделать.
Если только не создавать отдельный сервис, в котором и производить пробитие на терминалах. Но это будет и не проще и не быстрее.
2. PlatonStepan 38 28.10.21 02:47 Сейчас в теме
Вести очередь со статусами-семафорами
3. newborn 28.10.21 03:02 Сейчас в теме
(2) Как?
Можешь показать пример кода, чтобы я понял идею.
если честно, я бьюсь над этой проблемой уже третий день (и ночь). Башка не работает.
13. PlatonStepan 38 29.10.21 07:15 Сейчас в теме
(3) Если хочешь очень быстро, то попробуй через регистрацию в планах обмена.
Но это не самый простой способ, надо создать план обмена, описать зависимость узлов от терминалов.
В плане обмена на каждый терминал создать узел, а в состав плана обмена добавить справочники.

При событии печати
<НачатьТранзакцию>
проверяешь, есть данные чека у объекта и есть ли регистрация для кого-то ?
если нет, то для узла фиксируешь изменение, и тут же фиксируешь по нему отправку (для НомерОтправленного)
<ЗафиксироватьТранзакцию>

При обработке оповещения получаешь данные о чеке,
<НачатьТранзакцию>
фиксируешь данные чек по объекту,
находишь узел регистрации объекта и фиксируешь для него НомерПринятого = НомерОтправленного, чтобы отработанные не копились.
<ЗафиксироватьТранзакцию>

UPD:
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно


Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться
14. newborn 29.10.21 12:32 Сейчас в теме
(13)
(13)
UPD:
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно


Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться


Потому что если чек не завершился успешно, то над отменить все частично-успешные операции по этому чеку
15. PlatonStepan 38 31.10.21 07:53 Сейчас в теме
(14)
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно

Ну в такой схеме, что описана 1 чек - одна операция на одном терминале.

Или у вас 1 чек раскидывается на множество позиций во множестве терминалов :)
16. newborn 31.10.21 17:24 Сейчас в теме
(15)
Или у вас 1 чек раскидывается на множество позиций во множестве терминалов :)

Именно так. Сумму чека можно разбить на несколько частей и провести по разным терминалам, а оставшуюся часть наличкой. Да, такое редко бывает, но принципиально не запрещено.
В общем-то я выкрутился на оповещениях, но мозги поломать пришлось.
4. ImHunter 327 28.10.21 07:25 Сейчас в теме
6. newborn 28.10.21 10:08 Сейчас в теме
(4) Как можно сделать на бизнес-процессах?
Ребята, дайте хотя бы примерный код.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот