При работе с электронным документооборотом (ЭДО) через модуль Диадок (СКБ Контур), особенно когда выполняется массовая рассылка документов по ЭДО, часто возникает ситуация, когда контрагент требует специфического отображения данных в графе «Основание передачи». По умолчанию модуль формирует XML-файл согласно приказу ФНС, разделяя данные договора на три тега: наименование, номер и дата. Иногда проблему может решить глобальная смена форматов исходящих электронных документов и настроек ЭДО, однако на практике часто требуется включить дополнительную информацию, например, номер спецификации, в определенном формате.
Рассмотрим подробно, как программно вмешаться в процесс формирования электронного УПД, проанализируем структуру данных и разберем наиболее безопасные способы доработки модуля без потери возможности его обновления.
Для начала разберем, как данные попадают в электронный документ. Если рассматривать формирование файла типа xml для формализованных электронных передаточных документов (удобно через обработка настройки структуры УПД для ЭДО), то важно понимать, что согласно формату УПД (820 приказ), за сведения об основании отвечает группа тегов ОснПер. В объектной модели Диадока это соответствует структуре TransferBase. Она включает в себя следующие поля:
Проанализируем ситуацию: если мы просто запишем всю строку «Договор №... от... Спецификация...» в поле «Наименование», это может привести к дублированию данных в печатной форме у контрагента, так как его система может автоматически добавлять слова «№» и «от» на основании других тегов. Поэтому важно определить, в какой именно тег мы будем вносить изменения.
Наиболее правильным и технологичным способом является доработка модуля Диадок через подключаемые модули (ПМ). Это внешняя обработка, которая позволяет перехватить структуру документа перед отправкой. Это избавляет нас от необходимости править основную обработку Диадока и позволяет легко обновляться.
Разберем алгоритм создания такой доработки. Нам необходимо создать процедуру, которая будет модифицировать коллекцию оснований TransferInfo. Рассмотрим пример кода, который можно разместить в модуле объекта ПМ:
Процедура ОбработкаУПД820(СсылкаНаДокумент, Протоконтент) Экспорт
// Проверяем, что работаем с нужным контрагентом, если требование индивидуальное
Если СсылкаНаДокумент.Контрагент.ИНН = "7700000000" Тогда
МодернизироватьОснования(СсылкаНаДокумент, Протоконтент);
КонецЕсли;
КонецПроцедуры
Процедура МодернизироватьОснования(СсылкаНаДокумент, Протоконтент)
// Протоконтент.TransferInfo.TransferBases — это коллекция оснований
Для Каждого Основание Из Протоконтент.TransferInfo.TransferBases Цикл
// Пример формирования сложной строки для наименования
НовоеНаименование = "Договор поставки";
ДопИнфо = "Спецификация №2 от 08.08.2024г.";
// Записываем дополнительную информацию в поле DocumentInfo
Основание.DocumentInfo = ДопИнфо;
// Либо модифицируем само наименование, если контрагент хочет видеть все в одной строке
Основание.DocumentName = НовоеНаименование + " (" + ДопИнфо + ")";
КонецЦикла;
КонецПроцедуры
Важно помнить, что использование подключаемого модуля требует наличия соответствующей лицензии в расширенном функционале Диадока. Если лицензия активна, модуль подключается в настройках (Настройки — Расширенные — Подключаемый модуль).
Если задача стоит только в изменении визуального отображения в печатной форме, которую генерирует Диадок (макет ПечатныеФормы), то следует обратить внимание на функцию формирования строки основания — её редактирование возможно через редактор макетов печатных форм в пользовательском режиме. В качестве основы для доработки можно использовать универсальную печатную форму УПД или специализированное решение, такое как УПД с выводом оснований для подписантов.
В модулях Диадока за это часто отвечает функция СтрокаДокументыОснованияУПД. Посмотрим на пример логики формирования этой строки:
Функция СтрокаДокументыОснованияУПД(TransferBases)
Результат = "";
Разделитель = "";
Для Каждого TransferBase Из TransferBases Цикл
Результат = Результат + Разделитель + TransferBase.DocumentName
+ ?(ЗначениеЗаполнено(TransferBase.DocumentNumber), " № " + TransferBase.DocumentNumber, "")
+ ?(ЗначениеЗаполнено(TransferBase.DocumentDate), " от " + Формат(TransferBase.DocumentDate, "ДФ=dd.MM.yyyy"), "")
+ ?(ЗначениеЗаполнено(TransferBase.DocumentInfo), ", " + TransferBase.DocumentInfo, "");
Разделитель = "; ";
КонецЦикла;
Возврат Результат;
КонецФункции
Выясним причину, почему данные могут отображаться неверно: если вы заполнили DocumentInfo, но в функции формирования строки этот параметр игнорируется, контрагент не увидит вашу спецификацию в печатном виде, хотя в XML она будет присутствовать.
В некоторых случаях, когда нет возможности использовать подключаемые модули, программисты прибегают к временным решениям. Рассмотрим ситуацию, когда мы через расширение конфигурации увеличиваем длину поля Номер в карточке договора или используем поле НаименованиеДляПечати.
Если в поле номера договора в 1С записать строку вида 235-24 от 15.07.2024г. (Спецификация №2), то стандартный механизм Диадока подставит эту длинную строку в тег НомОсн. Это не совсем корректно с точки зрения методологии XML, но часто решает проблему «здесь и сейчас», если принимающая сторона (например, крупный ритейлер типа «Ленты») настроила свои фильтры именно на поиск в поле номера.
Проанализируем еще один вариант решения через дополнительные сведения. В формате УПД предусмотрены дополнительные текстовые поля `ИнфПолФХЖ` (Информационное поле факта хозяйственной жизни). Если контрагент готов принимать данные в этих тегах, вы можете настроить их заполнение в стандартных настройках модуля Диадок без программирования, просто сопоставив реквизит документа 1С с доп. полем ЭДО.
Подведем итоги:
TransferBases.ПечатныеФормы или подключаем внешнюю печатную форму.