Как заставить Контур.Диадок выгружать УПД в формате 970 для заполнения GTIN в 1С:Управление торговлей 10.3

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

При работе с маркированным товаром в рамках объемно-сортового учета (ОСУ) перед многими компаниями встает задача передачи кода GTIN в электронных УПД. В соответствии с актуальными требованиями законодательства и Приказом ФНС № ЕД-7-26/970@, старый формат документов (820) уступает место новому формату (970). Однако разработчики, использующие интеграционный модуль Контур.Диадок в конфигурациях на обычных формах (таких как Управление торговлей 10.3 или Управление производственным предприятием 1.3), сталкиваются с серьезным препятствием: модуль продолжает генерировать XML во внутреннем формате 820, где напрямую прописать теги под формат 970 невозможно.

В этой статье мы подробно разберем, почему так происходит, где скрыты неочевидные настройки совместимости форматов в старых конфигурациях 1С, и как правильно доработать подключаемый модуль (ПМ) Диадока для автоматического заполнения GTIN.

Выясняем причину: двухэтапная конвертация Диадока

Даже если в пользовательском интерфейсе Диадока (в настройках организации или в карточке контрагента) жестко установлен формат отправки «ФНС 970», интеграционная обработка Диадока по умолчанию работает по скрытой двухэтапной схеме:

  1. Модуль на стороне 1С собирает структуру электронного документа и формирует внутренний XML в старом формате 820.
  2. Непосредственно перед отправкой на серверы Диадока этот файл транслируется (конвертируется «на лету») в формат 970.

Из-за такого подхода в событии обработки ПодготовитьЭлектронныйДокумент подключаемого модуля коллекция строк товаров Items все еще имеет структуру 820-го формата. Попытки напрямую присвоить значение свойству Item.GTIN игнорируются или вызывают ошибки, поскольку такого реквизита в исходной структуре 820 попросту нет. Нам необходимо заставить модуль Диадока сразу формировать документ во внутреннем формате 970.

Решение проблемы: отключение режима совместимости форматов

Для отключения двухэтапной конвертации и принудительного перевода генератора на формат 970 в коде модуля Диадока предусмотрена технологическая настройка РежимСовместимостиФорматов820и970. Если этот параметр имеет значение Авто, применяется двухэтапная схема. Чтобы перевести модуль на чистый формат 970, значение этого параметра нужно изменить на НеИспользуется.

Рассмотрим, где хранится эта настройка. В современных конфигурациях (на управляемых формах) её можно найти в дополнительных сведениях организации. Однако в старых конфигурациях на обычных формах (например, в 1С:УТ 10.3) разработчики Диадока применили крайне нестандартное архитектурное решение.

Эта настройка записывается во внутренний регистр сведений Значения свойств объектов, но привязывается она к элементу справочника «Валюты» — конкретно к валюте «руб» (рубль)! Посмотрим, как переключить этот параметр по шагам:

  1. Откроем регистр сведений Значения свойств объектов (через меню «Операции» -> «Регистры сведений»).
  2. Найдем запись, где в качестве объекта выступает валюта руб. (или рубль РФ), а в качестве свойства указано DDPro_РежимСовместимостиФорматов820и970 (имя свойства может незначительно отличаться в зависимости от версии модуля, ищите свойства с префиксом DDPro_).
  3. Если записи нет, ее можно создать вручную или найти через форму настройки свойств валюты «руб».
  4. Изменим значение этого свойства с Авто на НеИспользуется.

После сохранения этой настройки внутренний генератор обработки Диадока начнет формировать структуру документа напрямую по схеме 970-го формата. Теперь мы можем безопасно обратиться к свойствам формата 970 в подключаемом модуле.

Заполнение поля GTIN через Подключаемый модуль (ПМ)

Рассмотрим подробнее процесс доработки подключаемого модуля Диадока. Начиная с версий обработки Диадок 4.6x, разработчики добавили удобную возможность связи XML-структур с объектами базы данных. Теперь нам не нужно тратить ресурсы на поиск номенклатуры по наименованию или артикулу. Ссылка на объект 1С сохраняется непосредственно в служебных данных строки.

Мы можем извлечь ссылку на номенклатуру напрямую из структуры строки таблицы с помощью функции ЗначениеИзСтрокиВнутр():


НоменклатураСсылка = ЗначениеИзСтрокиВнутр(Item.СлужебнаяИнформация.Номенклатура);

Ниже приведем готовый пример кода для интеграции в ваш Подключаемый модуль (ПМ) Диадока в событие ПодготовитьЭлектронныйДокумент:


Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
    Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
        Возврат ПодготовитьЭлектронныйДокумент(Параметры);
    КонецЕсли;
КонксФункции

Функция ПодготовитьЭлектронныйДокумент(Параметры)
    // Проверяем наличие структуры результатов интеграционного модуля
    Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда
        
        // Нам нужны только документы УПД (СЧФДОП)
        Если Параметры.ВидДокументаРазвернутый.ID = "ID_УПД" Тогда
            
            Content = Параметры.Результат.Content;
            Items = Content.Table.Items;
            
            // Обходим строки табличной части документа
            Для Каждого Item Из Items Цикл
                
                Попытка
                    // Извлекаем ссылку на номенклатуру 1С из служебных данных строки
                    СсылкаНаНоменклатуру = ЗначениеИзСтрокиВнутр(Item.СлужебнаяИнформация.Номенклатура);
                    
                    Если ЗначениеЗаполнено(СсылкаНаНоменклатуру) Тогда
                        // Получаем GTIN номенклатуры (реализуйте функцию в соответствии с вашей архитектурой хранения штрихкодов)
                        ТекущийGTIN = ПолучитьGTINДляНоменклатуры(СсылкаНаНоменклатуру);
                        
                        Если ЗначениеЗаполнено(ТекущийGTIN) Тогда
                            // Записываем GTIN в структуру нового формата 970
                            Item.GTIN = СокрЛП(ТекущийGTIN);
                        КонецЕсли;
                    КонецЕсли;
                Исключение
                    // Записываем ошибку в журнал регистрации для отладки, чтобы не прерывать отправку остальных документов
                    ЗаписьЖурналаРегистрации("Диадок.ЗаполнениеGTIN", УровеньЖурналаРегистрации.Предупреждение, , , ОписаниеОшибки());
                КонецПопытки;
                
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЕсли;
КонецФункции

Функция ПолучитьGTINДляНоменклатуры(НоменклатураСсылка)
    // Пример получения GTIN из регистра сведений "Штрихкоды" или индивидуального реквизита номенклатуры
    // GTIN в системе маркировки обычно представляет собой 14-значный код (EAN-13 с ведущим нулем)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |   РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |   Штрихкоды.Владелец = &Номенклатура
    |   И ДЛИНА(Штрихкоды.Штрихкод) >= 13";
    
    Запрос.УстановитьПараметр("Номенклатура", НоменклатураСсылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        
        ВозвращенныйШтрихкод = СокрЛП(Выборка.Штрихкод);
        
        // Если штрихкод 13-значный (EAN-13), дополняем его ведущим нулем до 14 символов GTIN
        Если СтрДлина(ВозвращенныйШтрихкод) = 13 Тогда
            Возврат "0" + ВозвращенныйШтрихкод;
        Иначе
            Возврат ВозвращенныйШтрихкод;
        EndЕсли;
    КонецЕсли;
    
    Возврат "";
КонецФункции

Проанализируем предложенный алгоритм. Принудительное переключение формата через отключение режима совместимости позволяет обойтись без сложного, ресурсоемкого и ненадежного парсинга готового XML-файла «построчно». Мы работаем непосредственно с объектной моделью документа, которую предоставляет интеграционный модуль Диадока, что гарантирует сохранность структуры схемы XML и корректность прохождения валидации на серверах оператора ЭДО.

Используя данный метод, вы сможете оперативно решить проблему выгрузки GTIN для ваших клиентов без длительного ожидания ответов от перегруженной технической поддержки Контура.

← На главную