В процессе работы с электронным документооборотом (ЭДО) часто возникает задача адаптации выгружаемых XML-файлов под специфические требования контрагентов. Например, когда покупателю требуется передавать несколько оснований сделки (договоры, спецификации, приложения) внутри одной структуры <СодФХЖ1>, в то время как типовая конфигурация по умолчанию формирует только одно основание.
В данной статье мы подробно разберем, как решить эту задачу в рамках конфигурации «1С:Бухгалтерия». Мы проанализируем несколько различных подходов: от классической доработки общего модуля конфигурации до более современных и безопасных альтернатив, таких как расширения конфигурации и использование штатного функционала ручной корректировки XML-данных.
Если нам необходимо полностью автоматизировать процесс для определенных контрагентов, лучшим решением будет вмешательство в алгоритм формирования структуры данных. Выясним, где именно в системе происходит сборка пакета данных перед отправкой в модуль ЭДО.
За генерацию XML-файла отвечает механизм XDTO (XML Data Transfer Objects). Перед тем как данные преобразуются в XML, программа собирает их в структуру СведенияСделки. Нам нужно перехватить эту структуру, определить контрагента и добавить необходимые поля.
Проанализируем по шагам процесс доработки в конфигураторе:
ОбщийМодуль.ОбменСКонтрагентамиВнутренний (в зависимости от версии БСП и модуля ЭДО название может немного отличаться, например, ОбменСКонтрагентамиБЭД).СформироватьПередачаТоваровПродавецCML.ЗаполнитьСвойствоXDTO(СведенияПродавца, "СодФХЖ1", СведенияСделки, Истина, Ошибки).СведенияСделки.Посмотрим на пример программной реализации такой доработки:
// Определяем получателя документа
КонтрагентПолучатель = СведенияСделки.Покупатель; // Или получаем из шапки документа-источника
// Проверяем, входит ли контрагент в список тех, для кого нужна доработка
Если КонтрагентПолучатель.Код = "00-000123" Тогда
// Создаем массив для хранения нескольких оснований
МассивОснований = Новый Массив;
// Первое основание (например, основной договор)
Основание1 = Новый Структура;
Основание1.Вставить("НаимОсн", "Договор");
Основание1.Вставить("НомОсн", "01");
Основание1.Вставить("ДатаОсн", "01.07.2019");
МассивОснований.Добавить(Основание1);
// Второе основание (например, спецификация или приложение)
Основание2 = Новый Структура;
Основание2.Вставить("НаимОсн", "Приложение");
Основание2.Вставить("НомОсн", "13");
Основание2.Вставить("ДатаОсн", "01.09.2019");
МассивОснований.Добавить(Основание2);
// Перезаписываем свойство в структуре сделки для XDTO
СведенияСделки.Вставить("Основание", МассивОснований);
КонецЕсли;
Благодаря этому коду при формировании XML-файла платформа автоматически преобразует массив структур в несколько дочерних XML-тегов <Основание> внутри родительского блока <СодФХЖ1>.
Внесение изменений напрямую в общие модули типовой конфигурации (как описано в Методе 1) имеет существенный недостаток: это усложняет последующие обновления программы. Чтобы сохранить конфигурацию полностью типовой, применим механизм расширений.
Выполним следующие действия по шагам:
ОбменСКонтрагентамиВнутренний, кликнем по нему правой кнопкой мыши и выберем пункт Добавить в расширение.&После или &Вместо.Рассмотрим пример кода для модуля расширения с использованием аннотации &После:
&После("СформироватьПередачаТоваровПродавецCML")
Процедура Расш_СформироватьПередачаТоваровПродавецCML(ПараметрыВыгрузки, СведенияСделки, Результат)
// Проверяем наличие структуры сделки и модифицируем её элементы перед финальной сериализацией
Если СведенияСделки.Свойство("Основание") Тогда
// Наш алгоритм анализа контрагента и добавления полей
// См. логику заполнения массива оснований из Метода 1
КонецЕсли;
КонецПроцедуры
Использование расширения позволяет безболезненно обновлять «1С:Бухгалтерию» через пользовательский режим, при этом весь измененный функционал ЭДО продолжит стабильно работать. При необходимости можно использовать готовое расширение для изменения основания передачи в УПД при отправке по ЭДО.
Рассмотрим ситуацию, когда изменения в XML-документ нужно внести оперативно и разово для конкретной сделки, не прибегая к программированию и изменению кода. Модуль 1С-ЭДО предоставляет штатную возможность ручного переопределения файла до момента его подписания электронной подписью.
Разберем данный алгоритм по шагам:
ON_NSCH... или ON_SFACT...).<СодФХЖ1>.Важное предупреждение: Данный способ подходит только для единичных операций. Если отредактировать файл XML после того, как он был подписан электронной подписью, то подпись станет недействительной, и оператор ЭДО отклонит транзакцию. Корректировка должна выполняться строго ДО подписания! Для проверки корректности структуры измененного файла можно использовать обработку для проверки валидности XML по схеме XSD.
Проанализируем современные штатные возможности «1С:Бухгалтерии», которые позволяют решать подобные задачи без кода. Разработчики предусмотрели два удобных механизма:
А. Ссылка "Реквизиты печатных форм и ЭДО"
В новых релизах программы внизу документа "Реализация (акт, накладная)" доступна гиперссылка "Реквизиты печатных форм и ЭДО". Нажав на нее, вы можете изменить поле "Основание передачи". Если выбрать значение "Произвольный текст", система позволит вам ввести абсолютно любую текстовую информацию (включая перечисление нескольких договоров и приложений). Эта строка автоматически и корректно запишется в XML-файл в качестве основания сделки.
Б. Конструктор дополнительных полей в настройках ЭДО
Если вашему контрагенту требуются специфические данные, которые должны передаваться в блоке информационных полей (<ИнфПолФХЖ1>), вы можете настроить их вывод через интерфейс:
Подводя итог, отметим: выбор метода зависит от частоты возникновения задачи. Для регулярной отправки специфических XML-структур оптимально использовать расширение конфигурации (Метод 2) или штатную настройку дополнительных полей (Метод 4). Для разовых точечных правок отлично подойдет выгрузка и загрузка XML-файла вручную (Метод 3).