Как эффективно организовать работу с иерархией упаковок и марками ЕГАИС в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Работа с поштучным учетом в ЕГАИС 3.0 ставит перед разработчиком непростую задачу: необходимо не просто хранить информацию об акцизных марках, но и учитывать их сложную иерархическую вложенность. Часто товар поставляется в коробках, которые в свою очередь могут быть упакованы в микс-короба или паллеты. Проанализируем, как правильно спроектировать структуру данных, организовать поиск по дереву упаковок и избежать проблем с производительностью при больших объемах данных.

Архитектура хранения данных: Таблицы связности против справочников

Рассмотрим стандартную ситуацию: в ТТН ЕГАИС приходит информация о дереве вложенности. Автор темы предлагает использовать таблицу связности (Adjacency List) непосредственно в документе, используя реквизиты СтрокаНакладной, НомерКоробки и НомерКоробкиРодителя. Разберем плюсы и минусы такого подхода.

Использование табличных частей документа удобно для быстрой загрузки XML, однако оно накладывает серьезные ограничения на поиск вложенных элементов. В языке запросов 1С отсутствуют рекурсивные запросы (Common Table Expressions, CTE), что делает получение «всех детей» для коробки верхнего уровня сложной задачей, если глубина вложенности заранее неизвестна или велика.

Практическая рекомендация: Если ваша конфигурация позволяет, лучше использовать специализированный регистр сведений или иерархический справочник. В типовых решениях (ERP, УТ 11) для этих целей применяется регистр «Акцизные марки ЕГАИС», где каждая марка привязана к своему идентификатору упаковки (SSCC).

Решение проблемы иерархических запросов в 1С

Выясним, как получить дерево вложенности, если мы все же используем таблицу связности. Если нам нужно найти все марки внутри одной большой паллеты, мы сталкиваемся с тем, что обычным запросом это сделать невозможно без фиксированного количества соединений (JOIN). Проанализируем два способа решения:

  1. Создание временного иерархического справочника. Это один из самых изящных способов обойти ограничение запросов. Мы можем программно создать элементы в специально созданном служебном иерархическом справочнике (в режиме обмена данными), заполнить его данными из ТТН и выполнить стандартный запрос с оператором В ИЕРАРХИИ. Платформа 1С сама эффективно вычислит все вложенные узлы.
  2. Использование фиксированного количества уровней. Если бизнес-процесс жестко ограничен (например, не более 3-4 уровней: Паллета -> Коробка -> Марка), можно использовать запрос с левыми соединениями.

Посмотрим на пример структуры запроса для трех уровней вложенности:


ВЫБРАТЬ
    Упаковки1.НомерКоробки КАК Уровень1,
    Упаковки2.НомерКоробки КАК Уровень2,
    Упаковки3.НомерКоробки КАК Уровень3,
    Марки.Штрихкод КАК Марка
ИЗ
    ТЧ_Упаковки КАК Упаковки1
    ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Упаковки КАК Упаковки2 ПО Упаковки1.НомерКоробки = Упаковки2.НомерКоробкиРодителя
    ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Упаковки КАК Упаковки3 ПО Упаковки2.НомерКоробки = Упаковки3.НомерКоробкиРодителя
    ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Марки КАК Марки ПО (Марки.НомерКоробки = Упаковки1.НомерКоробки ИЛИ Марки.НомерКоробки = Упаковки2.НомерКоробки ИЛИ Марки.НомерКоробки = Упаковки3.НомерКоробки)
ГДЕ
    Упаковки1.НомерКоробки = &ИскомаяПаллета

Особенности работы с кодами SSCC и валидация данных

Важно помнить, что номера коробок в ЕГАИС — это 18-значные коды транспортных упаковок SSCC. При проектировании системы необходимо учитывать следующие правила:

Логика «Разупаковки» и проверки при приемке

Разберем, как должна вести себя система при сканировании товаров. Если при приемке вы сканируете марку, которая находится внутри иерархии, 1С должна автоматически определить всю цепочку «родителей». Это необходимо для:

  1. Контроля целостности: Если марка принадлежит коробке, которая числится закрытой, система должна предложить «вскрыть» упаковку в информационной базе.
  2. Частичной приемки: Если в коробке не хватает одной бутылки, вся упаковка должна быть расформирована, так как ее SSCC-код больше не гарантирует неизменность содержимого.

Проанализируем ситуацию с «миксовыми» коробками. Если одна и та же коробка встречается в разных строках накладной (с разным товаром), ваша структура данных должна это поддерживать через связь с товарной позицией. Однако иерархия самих упаковок при этом должна оставаться строгим деревом, а не сетью.

Оптимизация производительности при больших объемах

При получении крупных ТТН (например, на 10 000+ марок) обработка дерева в оперативной памяти через объект ТаблицаЗначений может вызвать значительные задержки. Рассмотрим шаги по оптимизации:

Во-первых, используйте потоковое чтение XML (ЧтениеXML). Не загружайте всё дерево сразу в память. Сначала запишите «плоские» данные во временные таблицы базы данных, а затем стройте иерархию запросами.

Во-вторых, применяйте индексированные временные таблицы в запросах. Поиск по строковым идентификаторам SSCC — ресурсоемкая операция. Перевод этих идентификаторов в числовые ссылки или использование хеширования может существенно ускорить процесс сопоставления.

В-третьих, реализуйте режим доверительной приемки. Если вы доверяете поставщику, система должна позволять принимать упаковку верхнего уровня (паллету) без обхода всего дерева вложенных марок, просто фиксируя статус «Принято» для всей иерархии в регистре сведений.

Итоги

Мы выяснили, что наиболее надежным и производительным способом работы с иерархией ЕГАИС в 1С является использование регистров сведений для хранения связей «Марка-Упаковка» и «Упаковка-Родитель». Для сложных задач поиска по дереву эффективно применять временные иерархические справочники, что позволяет использовать мощь встроенного оператора В ИЕРАРХИИ. Помните о необходимости строгой валидации данных на этапе загрузки, чтобы исключить циклы и множественное родительство упаковок.

← На главную