Предыстория:
Надо изменить 1С:Касса.
Стоит задача печатать чеки на нескольких терминалах. Есть таблица значений, где эти элементы справочников этих терминалов собраны, и суммы, которые надо провести через терминал.
Но в модулях программы всё построено на асинхронных вызовах и обработке оповещения. В результате если я последовательно буду вызывать методы печати на терминалы для этих справочников, то у меня может оказаться, что предыдущая операция для одного терминала закончится позже, чем последующая операция для другого терминала. И что пойдёт в банк вообще будет невозможно проконтролировать.
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно. А в случае асинхронных вызовов я точно не знаю, какие терминалы уже обработаны а какие ещё нет.
ЗАДАЧА:
Как на 1С средствами встроенного языка организовать очередь, чтобы операции с каждым последующим терминалом не начиналась, пока не закончится операция с предыдущим?
Надо изменить 1С:Касса.
Стоит задача печатать чеки на нескольких терминалах. Есть таблица значений, где эти элементы справочников этих терминалов собраны, и суммы, которые надо провести через терминал.
Но в модулях программы всё построено на асинхронных вызовах и обработке оповещения. В результате если я последовательно буду вызывать методы печати на терминалы для этих справочников, то у меня может оказаться, что предыдущая операция для одного терминала закончится позже, чем последующая операция для другого терминала. И что пойдёт в банк вообще будет невозможно проконтролировать.
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно. А в случае асинхронных вызовов я точно не знаю, какие терминалы уже обработаны а какие ещё нет.
ЗАДАЧА:
Как на 1С средствами встроенного языка организовать очередь, чтобы операции с каждым последующим терминалом не начиналась, пока не закончится операция с предыдущим?
По теме из базы знаний
- Распутывая узлы интеграции: Построение архитектуры слабосвязанных систем, или Кролики наступают
- Как превратить бизнес-заказчиков и разработчиков в единую команду?
- Управление знаниями 6 лет спустя после IE14
- Применение 1С:Аналитики и Дата акселератора, или Как получить в 1С прозрачность и скорость обработки данных для прямого доступа и контроля руководителя
- Что нам стоит обмен настроить, или Как кролик спас «зоопарк»
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) очередь можно сделать на РС. Непериодический независимый РС использовать как флаг выполнения задачи терминалом. Перед началом проверить на пустой РС, далее записать в него значение, после выполнения - удалить запись из РС.
Для сброса зависших заданий, предусмотреть периодическое очищение РС.
Для сброса зависших заданий, предусмотреть периодическое очищение РС.
(3) Если хочешь очень быстро, то попробуй через регистрацию в планах обмена.
Но это не самый простой способ, надо создать план обмена, описать зависимость узлов от терминалов.
В плане обмена на каждый терминал создать узел, а в состав плана обмена добавить справочники.
При событии печати
<НачатьТранзакцию>
проверяешь, есть данные чека у объекта и есть ли регистрация для кого-то ?
если нет, то для узла фиксируешь изменение, и тут же фиксируешь по нему отправку (для НомерОтправленного)
<ЗафиксироватьТранзакцию>
При обработке оповещения получаешь данные о чеке,
<НачатьТранзакцию>
фиксируешь данные чек по объекту,
находишь узел регистрации объекта и фиксируешь для него НомерПринятого = НомерОтправленного, чтобы отработанные не копились.
<ЗафиксироватьТранзакцию>
UPD:
Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться
Но это не самый простой способ, надо создать план обмена, описать зависимость узлов от терминалов.
В плане обмена на каждый терминал создать узел, а в состав плана обмена добавить справочники.
При событии печати
<НачатьТранзакцию>
проверяешь, есть данные чека у объекта и есть ли регистрация для кого-то ?
если нет, то для узла фиксируешь изменение, и тут же фиксируешь по нему отправку (для НомерОтправленного)
<ЗафиксироватьТранзакцию>
При обработке оповещения получаешь данные о чеке,
<НачатьТранзакцию>
фиксируешь данные чек по объекту,
находишь узел регистрации объекта и фиксируешь для него НомерПринятого = НомерОтправленного, чтобы отработанные не копились.
<ЗафиксироватьТранзакцию>
UPD:
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно
Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться
(13)
(13)
Потому что если чек не завершился успешно, то над отменить все частично-успешные операции по этому чеку
(13)
UPD:
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно
Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно
Что-то не догоняю, зачем последовательно и зачем отменять успешные? Тогда организация очереди по другому должна делаться
Потому что если чек не завершился успешно, то над отменить все частично-успешные операции по этому чеку
(14)
Ну в такой схеме, что описана 1 чек - одна операция на одном терминале.
Или у вас 1 чек раскидывается на множество позиций во множестве терминалов :)
Кроме того, в случае ошибки на одном из терминалов надо отменить операции на всех других терминалах, которые уже прошли успешно
Ну в такой схеме, что описана 1 чек - одна операция на одном терминале.
Или у вас 1 чек раскидывается на множество позиций во множестве терминалов :)
(15)
Именно так. Сумму чека можно разбить на несколько частей и провести по разным терминалам, а оставшуюся часть наличкой. Да, такое редко бывает, но принципиально не запрещено.
В общем-то я выкрутился на оповещениях, но мозги поломать пришлось.
Или у вас 1 чек раскидывается на множество позиций во множестве терминалов :)
Именно так. Сумму чека можно разбить на несколько частей и провести по разным терминалам, а оставшуюся часть наличкой. Да, такое редко бывает, но принципиально не запрещено.
В общем-то я выкрутился на оповещениях, но мозги поломать пришлось.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот