При работе с электронным документооборотом (ЭДО) через модуль Диадока программисты часто сталкиваются с необходимостью кастомизации стандартных печатных форм — для упрощения этой задачи есть модуль полноценного электронного документооборота ЭДО для 1С. Одной из самых распространенных задач является вывод номеров ГТД и страны происхождения в Универсальном корректировочном документе (УКД). Сложность заключается в том, что формат ФНС для УКД, в отличие от основного УПД, не содержит жестко заданных полей для этих данных. Рассмотрим, как решить эту задачу с помощью заполнения информационного поля ИнфПолФХЖ2.
Проанализируем структуру XML-файла УКД. Согласно требованиям ФНС, корректировочный документ предназначен для фиксации изменения стоимости или количества товаров. Формат файла обмена не предусматривает специальных тегов для номеров таможенных деклараций в табличной части. Однако на практике покупателям часто требуется видеть эти данные в печатной форме (PDF-визуализации) для корректного ведения учета — для автоматизации импорта этих данных есть обработка загрузки документов ЭДО в 1С с заполнением ГТД.
Модуль Диадока использует механизм XSLT-преобразований для формирования печатной формы из XML-данных. Если данных нет в XML, они не появятся на печати. Для передачи произвольных данных в формате предусмотрен блок дополнительных сведений — ИнфПолФХЖ2 (Информационное поле факта хозяйственной жизни). Именно сюда мы и будем записывать данные о ГТД.
Разберем ситуацию: если вы используете "Универсальный" или "Про" модуль Диадока, все изменения необходимо вносить в Подключаемый модуль (ПМ). Это внешняя обработка (обычно с расширением .epf), которая позволяет переопределять стандартную логику формирования документов без изменения основного кода Диадока.
Выясним, где именно происходит формирование структуры. Основная точка входа — функция ПодготовитьЭлектронныйДокумент. Внутри этой функции модуль собирает данные из метаданных 1С и упаковывает их в структуру, которая позже превратится в XML.
Рассмотрим по шагам процесс добавления данных о ГТД в коллекцию дополнительных сведений для каждой строки товара. В подключаемом модуле нам нужно найти место, где формируется структура РасширениеДляСведенияОТоваре. Посмотрим на пример кода, который реализует это заполнение:
// В процедуре заполнения данных о товаре (обычно внутри цикла по строкам документа)
НоваяСтрокаТовара = ДанныеДляПечати.Строки.Добавить();
// ... заполнение основных полей (Наименование, Цена, Количество) ...
// Теперь заполняем дополнительные сведения для этой строки
Если ЗначениеЗаполнено(СтрокаИсточник.НомерГТД) Тогда
// Создаем структуру для поля ИнфПолФХЖ2
ЗаписьИнфПол = Новая Структура("Имя, Значение");
ЗаписьИнфПол.Имя = "НомерГТД";
ЗаписьИнфПол.Значение = Строка(СтрокаИсточник.НомерГТД);
// Добавляем в коллекцию ИнформационноеПоле2 (именно так оно называется в объектах модуля)
НоваяСтрокаТовара.ИнформационноеПоле2.Добавить(ЗаписьИнфПол);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаИсточник.СтранаПроисхождения) Тогда
ЗаписьСтрана = Новая Структура("Имя, Значение");
ЗаписьСтрана.Имя = "СтранаПроисхождения";
ЗаписьСтрана.Значение = Строка(СтрокаИсточник.СтранаПроисхождения);
НоваяСтрокаТовара.ИнформационноеПоле2.Добавить(ЗаписьСтрана);
КонецЕсли;
Важно помнить, что имена полей (Имя) должны соответствовать тем ключам, которые ожидает XSLT-шаблон печатной формы. Обычно для ГТД используются ключи НомерГТД или ТекстИнформационноеПоле1. Если после заполнения данные все равно не появляются, возможно, ваш шаблон требует специфического имени ключа — в этом случае стоит обратиться в техподдержку Диадока для уточнения настроек вашего шаблона.
Как упоминалось в сообщениях на форуме, иногда приходится "расковыривать" внутренние обработки Диадока, такие как ПечатныеФормы. Рассмотрим, как это сделать правильно:
%TEMP%. Проанализируйте содержимое этих файлов..epf). Для этого используйте метод ДвоичныеДанные.Записать(ПутьКФайлу).Проанализируем ситуацию, когда данные в XML попадают, но не отображаются. Это означает, что стандартная печатная форма Диадока для УКД не "знает", что ей нужно выводить ИнфПолФХЖ2. По умолчанию многие операторы ЭДО выводят дополнительные поля только в заголовке документа, а не в строках. Чтобы ГТД отобразилась в каждой строке УКД, вам может потребоваться заказать разработку индивидуальной печатной формы у специалистов Диадока.
Если вы не хотите глубоко внедряться в логику заполнения строк, можно использовать событие ПослеФормированияСтруктурыЭлектронногоДокумента. В этот момент у вас уже есть готовый объект документа со всеми строками, и вы можете пробежать по ним циклом, добавляя нужные узлы.
Процедура ПослеФормированияСтруктурыЭлектронногоДокумента(ОбъектЭД, ИсточникДанных) Экспорт
// Проверяем, что это УКД
Если ТипЗнч(ОбъектЭД) = Тип("Структура") И ОбъектЭД.ТипДокумента = "УКД" Тогда
Для Каждого СтрокаТовара Из ОбъектЭД.ТабличнаяЧасть Цикл
// Ищем данные в исходном документе 1С (ИсточникДанных)
// И добавляем в коллекцию ИнформационноеПоле2
НовыйЭлемент = СтрокаТовара.ИнформационноеПоле2.Добавить();
НовыйЭлемент.Имя = "НомерГТД";
НовыйЭлемент.Значение = "10005030/121223/0001234";
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он отделяет логику формирования основного XML от логики добавления "визуальных" полей, что упрощает дальнейшее обновление модуля Диадока.
Подведем итог: для вывода ГТД в УКД через Диадок не нужно пытаться найти стандартные поля ГТД в структуре корректировки — их там нет по формату ФНС, но решить проблему поможет обработка формирования XML УПД и УКД для Диадока с ГТД. Правильный путь — использование коллекции ИнформационноеПоле2 (которая в XML превращается в ИнфПолФХЖ2) внутри табличной части документа. Реализуется это через Подключаемый модуль, что позволяет сохранить обновляемость основной конфигурации и самого модуля ЭДО. Помните, что визуальное отображение этих данных в PDF напрямую зависит от настроек XSLT-шаблона на стороне сервера Диадока.