Как создать файл XML TTNSingle_v3 из 1С с помощью XDTO: работа с паллетами и коробами

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

При переходе на поштучный учет в ЕГАИС (формат TTNSingle_v3) одной из самых сложных задач для разработчика 1С становится правильное формирование иерархии упаковок. В отличие от предыдущих версий, где марки могли перечисляться простым списком, третья версия требует четкого описания вложенности: марки внутри коробов, короба внутри паллет. Рассмотрим, как реализовать это с помощью механизмов XDTO, разберем структуру типов и напишем корректный код для формирования узла boxInfo.

Понимание структуры boxtype и пространства имен

Для начала проанализируем схему данных. В формате ЕГАИС 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 следует учитывать несколько критически важных моментов, связанных с правилами ФСРАР:

  1. Уникальность boxnum: Номера упаковок не должны повторяться внутри одного документа. ЕГАИС проверяет уникальность SSCC.
  2. Отсутствие пустых узлов: Если в коробке лежат только марки, свойство bl инициализировать или заполнять не нужно. Если в паллете лежат только коробки, свойство amcl у паллеты останется пустым.
  3. Тип данных для марок: В схеме CommonV3 марки внутри amcl должны соответствовать формату PDF417 или новым коротким маркам (DataMatrix).

Рассмотрим подробнее ситуацию, когда товар не упакован в паллету, а идет просто коробками. В этом случае в boxInfo позиции ТТН вы будете добавлять объекты boxtype, где заполнен boxnum и список amcl, а список bl будет отсутствовать.

Отладка и проверка XML

После того как объектная модель в 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.

← На главную