#2282: Архитектурное решение «Резервирование кодов маркировки»

Контекст

При получении от эмитента коды маркировки записываются в базе 1С в регистр сведений ПулКодовМаркировкиСУЗ регламентным заданием «Отправка и получение данных ИС МП».
Параллельно задание «БИТ.МДТ. Обработка очереди эмиссии по заказам» заполняет регистры битмдт_ItemIDs и битмдт_MarkEvents.

Мобильное приложение получает коды для печати из регистра КодыМаркировкиЗаданийНаПроизводство, который заполняется заданием «БИТ.МДТ. Проведение заданий на участок» и затем копируется на устройства.
Коды резервируются в разрезе заданий, устройств и назначений (например, для печати кодов вложений и агрегатов с одной станции).
Если принтеры не поддерживают определённые символы, часть кодов отбрасывается — для Yeacode потери достигают 25% от заказанных кодов.

Регламентное задание резервирует коды по принципу FIFO, с учётом настройки «Максимум дней с эмиссии кода для резервирования в задание».
Таким образом, при наличии незарезервированных пулов резервирование может пройти без ожидания новых кодов от «Честного ЗНАКа».

Свободные коды появляются:

  • из-за увеличения количества кодов в заказе на эмиссию (настройка «Коэффициент увеличения числа кодов в заказе на эмиссию»);
  • при отмене заданий, что освобождает нераспечатанные коды.

На практике пользователи формируют задания с запасом, поэтому чаще всего коды из локального пула становятся недостаточны и система ждёт эмиссию новых.

Проблема

  1. Большая задержка между проведением задания и появлением кодов на панели оператора.
  2. Высокая нагрузка на сервер 1С и СУБД.
  3. Раздутый размер базы данных.

Причины:

  1. Тяжёлые запросы при поиске свободных кодов в больших пулах
  2. Дублирование данных при копировании кодов между регистрами
  3. Асинхронная работа резервирования и эмиссии — иногда происходит запаздывание или холостая работа

Решение

  1. Перейти на модель «заказ-под-заказ» при резервировании кодов. Для экстренных случаев разработать подсистему поддержания страхового запаса кодов.
  2. Отбрасывать неподходящие коды уже на этапе записи в ПулКодовМаркировкиСУЗ
  3. Хранить не полный набор кодов, а блоки кодов в новом регистре битмдт_БлокиКодовЗаданийНаПроизводство, с разделением по назначению и устройствам.
    1. Наполнять его заданием «Обработка очереди эмиссии по заказам»
    2. Проведение задания проверяет только достаточность кодов и при необходимости создаёт новые заказы на эмиссию
  4. Мобильные устройства продолжают работать с той же таблицей, но данные теперь формируются «на лету».
  5. Для ускорения добавить в битмдт_MarkIDs реквизиты КодМаркировки и ХешСуммаКодаМаркировки.
    1. Нужны для эффективного соединения с ПулКодовМаркировкиСУЗ.
    2. Минусы:
      1. При обновлении потребуется реструктуризация в пределах часа
      2. Возможен рост таблицы на ~50%, но это не самая большая таблица в БД, а большой РС КодыМаркировкиЗаданийНаПроизводство можно удалить.
    3. Наполнение — обработчиком обновления, работающим с конца (несколько суток для крупных клиентов).

Будут описаны отдельно

  1. Переходные сценарии (старые заказы, незавершённое резервирование)
  2. Работа с виртуальной агрегацией
  3. Работа с КИТУ (повторное использование приведет к фрагментации блоков)