Как изменить структуру объекта XDTO и передать дополнительные данные в электронный документ Диадок?

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

При работе с обменом электронными документами через XDTO, разработчики часто сталкиваются с жесткой структурой схем XSD. Рассмотрим, как грамотно решать задачи модификации данных и интеграции с внешними сервисами, такими как Диадок.

Особенности изменения объектов XDTO

Первое, что необходимо уяснить: напрямую менять структуру ОбъектXDTO, просто добавив новое поле, невозможно, если оно не было заранее описано в пакете XDTO. ОбъектXDTO строго следует правилам XSD-схемы. Метод Добавить() работает только со списками, где свойство имеет множественность maxOccurs > 1.

Если вам требуется изменить состав данных, у вас есть два пути:

  1. Работа через XML: Использование ПостроительDOM и ЗаписьDOM. Вы можете выгрузить объект в XML, средствами DOM изменить нужный узел (удалить старый адрес, добавить новый) и загрузить обратно. Это гибкий, но трудоемкий процесс.
  2. Перезаполнение через фабрику: Создать новый ОбъектXDTO нужного типа на основе схемы и заполнить его данными из исходного объекта, используя вспомогательные функции, которые правильно учитывают типы АдрРФТип или АдрИнфТип.

Интеграция с Диадоком через Подключаемые модули

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

Для модификации данных документа используйте событие ПослеПодготовкиПакета или ПодготовитьЭлектронныйДокумент в подключаемом модуле. Рассмотрим пример логики изменения адреса контрагента:


// Пример логики изменения типа адреса в модуле интеграции
Адреса = Протоконтент.Consignees[0].Address;
Адреса.IsForeign = Истина;
Адреса.AddressText = АдресПредставление;
Адреса.CountryCode = "643";
// После этой манипуляции модуль автоматически подставит нужный тип АдрИнфТип

Использование Информационных полей (ИнфПолФХЖ)

Часто возникает необходимость передать дополнительные сведения (например, специфические данные о транспортировке или договорные основания), которые не предусмотрены жесткой формой УПД. В этом случае идеальным инструментом являются поля ИнфПолФХЖ1, ИнфПолФХЖ2 и ИнфПолФХЖ3.

Они реализованы как список пар «ключ-значение», что позволяет добавлять любую информацию, не нарушая валидацию формата XML. Проанализируем, как это выглядит в коде:


// Добавление произвольных данных в информационное поле
НовоеПоле = ОбъектXDTO.Документ.ИнфПолФХЖ1.Добавить();
НовоеПоле.Идентификатор = "Основание";
НовоеПоле.Значение = "Договор №123 от 01.01.2023";

Прикрепление дополнительных файлов

Если вам необходимо отправить не только основной документ (УПД), но и дополнительный файл (например, XML-протокол согласования цен), воспользуйтесь механизмом пакетов:

  1. Реализуйте формирование внешнего XML-файла, который соответствует требуемой схеме (например, протокол цен).
  2. В обработчике ПодготовитьПакет подключаемого модуля программно прикрепите этот файл к основному пакету.
  3. Диадок воспримет это как пакет документов, где основной файл — это УПД, а вспомогательный — Протокол.

Рекомендации по проверке

Помните, что все изменения, вносимые программно, должны проходить процедуру валидации. Перед отправкой всегда вызывайте метод Проверить() для ОбъектXDTO. Это гарантирует, что сформированный документ не будет отклонен на стороне Диадока из-за несоответствия формату ФНС. Старайтесь избегать правок в типовых модулях, всегда выносите свою логику в Подключаемый модуль, так как это упрощает обновление типовой конфигурации в будущем.

← На главную