При переходе на поштучный учет в ЕГАИС (формат TTNSingle_v3) одной из самых сложных задач для разработчика 1С становится правильное формирование иерархии упаковок. В отличие от предыдущих версий, где марки могли перечисляться простым списком, третья версия требует четкого описания вложенности: марки внутри коробов, короба внутри паллет. Рассмотрим, как реализовать это с помощью механизмов XDTO, разберем структуру типов и напишем корректный код для формирования узла boxInfo.
Для начала проанализируем схему данных. В формате ЕГАИС v3 за описание транспортной упаковки отвечает тип boxtype, который находится в пространстве имен http://fsrar.ru/WEGAIS/CommonV3. Важно понимать, что этот тип является рекурсивным. Это означает, что объект типа boxtype может содержать в себе список объектов такого же типа boxtype.
Ключевые поля объекта boxtype:
Выясним причину частых ошибок: многие разработчики пытаются добавить марки сразу в паллету, игнорируя промежуточные короба, или путают коллекции amcl и bl. Для корректной отправки через УТМ иерархия должна строго соответствовать физической агрегации товара.
Прежде чем наполнять файл данными, нам необходимо инициализировать объекты через ФабрикаXDTO. Разберем по шагам, как подготовить типы данных для работы. Предположим, что у вас уже загружены соответствующие XSD-схемы в конфигурацию или в дерево схем.
// Определяем пространства имен
НП_CommonV3 = "http://fsrar.ru/WEGAIS/CommonV3";
ТипУпаковки = ФабрикаXDTO.Тип(НП_CommonV3, "boxtype");
// Создаем объект для паллеты
ОбъектПаллета = ФабрикаXDTO.Создать(ТипУпаковки);
ОбъектПаллета.boxnum = "123456789012345678"; // Номер SSCC паллеты
Важно помнить: для каждого уровня вложенности (каждой коробки) необходимо создавать новый экземпляр объекта через ФабрикаXDTO.Создать(). Использование одного и того же объекта приведет к перезаписи данных или ошибкам структуры.
Проанализируем ситуацию, когда нам нужно упаковать несколько коробок в одну паллету, а внутри коробок разместить акцизные марки. Это наиболее полная структура boxInfo. Рассмотрим пример кода, который реализует такую вложенность.
// 1. Создаем паллету
Паллета = ФабрикаXDTO.Создать(ТипУпаковки);
Паллета.boxnum = "SSCC_PALLET_001";
// 2. Цикл по коробкам, которые входят в эту паллету
Для Каждого СтрокаКоробка Из СписокКоробок Цикл
Коробка = ФабрикаXDTO.Создать(ТипУпаковки);
Коробка.boxnum = СтрокаКоробка.НомерШтрихкода;
// 3. Цикл по маркам внутри текущей коробки
Для Каждого СтрокаМарка Из СтрокаКоробка.СписокМарок Цикл
// В типе boxtype свойство amcl — это список строк (марок)
Коробка.amcl.Добавить(СтрокаМарка.КодМарки);
КонецЦикла;
// 4. Добавляем заполненную коробку в список вложенных упаковок паллеты (bl)
Паллета.bl.Добавить(Коробка);
КонецЦикла;
// 5. Итоговую паллету добавляем в позицию ТТН
// ПозицияТТН.InformF2.MarkInfo.boxInfo.Добавить(Паллета);
В этом примере мы видим использование метода Добавить() для двух разных коллекций: amcl (список марок) и bl (список объектов boxtype). Именно так строится дерево агрегации в XML-файле.
При работе с TTNSingle_v3 следует учитывать несколько критически важных моментов, связанных с правилами ФСРАР:
bl инициализировать или заполнять не нужно. Если в паллете лежат только коробки, свойство amcl у паллеты останется пустым.CommonV3 марки внутри amcl должны соответствовать формату PDF417 или новым коротким маркам (DataMatrix).Рассмотрим подробнее ситуацию, когда товар не упакован в паллету, а идет просто коробками. В этом случае в boxInfo позиции ТТН вы будете добавлять объекты boxtype, где заполнен boxnum и список amcl, а список bl будет отсутствовать.
После того как объектная модель в 1С сформирована, мы преобразуем её в XML. Если структура boxInfo создана неверно, УТМ выдаст ошибку валидации схемы. Проанализируем типичное сообщение об ошибке: "The element 'bl' has invalid child element". Это часто означает, что вы попытались добавить в список bl строку вместо объекта типа boxtype.
Для проверки выгруженного файла рекомендуем использовать метод ЗаписатьXML() и визуально проверять иерархию в текстовом редакторе. Корректный фрагмент должен выглядеть примерно так:
<pref:boxInfo>
<pref:boxtype>
<pref:boxnum>PALLET_1</pref:boxnum>
<pref:bl>
<pref:boxtype>
<pref:boxnum>BOX_1</pref:boxnum>
<pref:amcl>
<pref:am>МАРКА_1</pref:am>
<pref:am>МАРКА_2</pref:am>
</pref:amcl>
</pref:boxtype>
</pref:bl>
</pref:boxtype>
</pref:boxInfo>
Важный совет: При работе с XDTO всегда следите за тем, чтобы Namespace (пространство имен) при создании типа точно совпадало с тем, что ожидается в схеме. Даже лишний слэш в конце URL http://fsrar.ru/WEGAIS/CommonV3 сделает тип неопознанным для фабрики, и вы получите пустой узел в XML.
Мы разобрали основной механизм создания вложенных упаковок. Используя этот подход, вы сможете формировать ТТН любой сложности, обеспечивая полную прослеживаемость алкогольной продукции в соответствии с требованиями ЕГАИС v3.