Работа с поштучным учетом в ЕГАИС 3.0 ставит перед разработчиком непростую задачу: необходимо не просто хранить информацию об акцизных марках, но и учитывать их сложную иерархическую вложенность. Часто товар поставляется в коробках, которые в свою очередь могут быть упакованы в микс-короба или паллеты. Проанализируем, как правильно спроектировать структуру данных, организовать поиск по дереву упаковок и избежать проблем с производительностью при больших объемах данных.
Рассмотрим стандартную ситуацию: в ТТН ЕГАИС приходит информация о дереве вложенности. Автор темы предлагает использовать таблицу связности (Adjacency List) непосредственно в документе, используя реквизиты СтрокаНакладной, НомерКоробки и НомерКоробкиРодителя. Разберем плюсы и минусы такого подхода.
Использование табличных частей документа удобно для быстрой загрузки XML, однако оно накладывает серьезные ограничения на поиск вложенных элементов. В языке запросов 1С отсутствуют рекурсивные запросы (Common Table Expressions, CTE), что делает получение «всех детей» для коробки верхнего уровня сложной задачей, если глубина вложенности заранее неизвестна или велика.
Практическая рекомендация: Если ваша конфигурация позволяет, лучше использовать специализированный регистр сведений или иерархический справочник. В типовых решениях (ERP, УТ 11) для этих целей применяется регистр «Акцизные марки ЕГАИС», где каждая марка привязана к своему идентификатору упаковки (SSCC).
Выясним, как получить дерево вложенности, если мы все же используем таблицу связности. Если нам нужно найти все марки внутри одной большой паллеты, мы сталкиваемся с тем, что обычным запросом это сделать невозможно без фиксированного количества соединений (JOIN). Проанализируем два способа решения:
В ИЕРАРХИИ. Платформа 1С сама эффективно вычислит все вложенные узлы.Посмотрим на пример структуры запроса для трех уровней вложенности:
ВЫБРАТЬ
Упаковки1.НомерКоробки КАК Уровень1,
Упаковки2.НомерКоробки КАК Уровень2,
Упаковки3.НомерКоробки КАК Уровень3,
Марки.Штрихкод КАК Марка
ИЗ
ТЧ_Упаковки КАК Упаковки1
ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Упаковки КАК Упаковки2 ПО Упаковки1.НомерКоробки = Упаковки2.НомерКоробкиРодителя
ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Упаковки КАК Упаковки3 ПО Упаковки2.НомерКоробки = Упаковки3.НомерКоробкиРодителя
ЛЕВОЕ СОЕДИНЕНИЕ ТЧ_Марки КАК Марки ПО (Марки.НомерКоробки = Упаковки1.НомерКоробки ИЛИ Марки.НомерКоробки = Упаковки2.НомерКоробки ИЛИ Марки.НомерКоробки = Упаковки3.НомерКоробки)
ГДЕ
Упаковки1.НомерКоробки = &ИскомаяПаллета
Важно помнить, что номера коробок в ЕГАИС — это 18-значные коды транспортных упаковок SSCC. При проектировании системы необходимо учитывать следующие правила:
НомерКоробки есть несколько разных Родителей, это свидетельствует об ошибке в данных поставщика. Такую ситуацию нужно обрабатывать на этапе валидации.Разберем, как должна вести себя система при сканировании товаров. Если при приемке вы сканируете марку, которая находится внутри иерархии, 1С должна автоматически определить всю цепочку «родителей». Это необходимо для:
Проанализируем ситуацию с «миксовыми» коробками. Если одна и та же коробка встречается в разных строках накладной (с разным товаром), ваша структура данных должна это поддерживать через связь с товарной позицией. Однако иерархия самих упаковок при этом должна оставаться строгим деревом, а не сетью.
При получении крупных ТТН (например, на 10 000+ марок) обработка дерева в оперативной памяти через объект ТаблицаЗначений может вызвать значительные задержки. Рассмотрим шаги по оптимизации:
Во-первых, используйте потоковое чтение XML (ЧтениеXML). Не загружайте всё дерево сразу в память. Сначала запишите «плоские» данные во временные таблицы базы данных, а затем стройте иерархию запросами.
Во-вторых, применяйте индексированные временные таблицы в запросах. Поиск по строковым идентификаторам SSCC — ресурсоемкая операция. Перевод этих идентификаторов в числовые ссылки или использование хеширования может существенно ускорить процесс сопоставления.
В-третьих, реализуйте режим доверительной приемки. Если вы доверяете поставщику, система должна позволять принимать упаковку верхнего уровня (паллету) без обхода всего дерева вложенных марок, просто фиксируя статус «Принято» для всей иерархии в регистре сведений.
Мы выяснили, что наиболее надежным и производительным способом работы с иерархией ЕГАИС в 1С является использование регистров сведений для хранения связей «Марка-Упаковка» и «Упаковка-Родитель». Для сложных задач поиска по дереву эффективно применять временные иерархические справочники, что позволяет использовать мощь встроенного оператора В ИЕРАРХИИ. Помните о необходимости строгой валидации данных на этапе загрузки, чтобы исключить циклы и множественное родительство упаковок.