При работе с обменом электронными документами через XDTO, разработчики часто сталкиваются с жесткой структурой схем XSD. Рассмотрим, как грамотно решать задачи модификации данных и интеграции с внешними сервисами, такими как Диадок.
Первое, что необходимо уяснить: напрямую менять структуру ОбъектXDTO, просто добавив новое поле, невозможно, если оно не было заранее описано в пакете XDTO. ОбъектXDTO строго следует правилам XSD-схемы. Метод Добавить() работает только со списками, где свойство имеет множественность maxOccurs > 1.
Если вам требуется изменить состав данных, у вас есть два пути:
ПостроительDOM и ЗаписьDOM. Вы можете выгрузить объект в XML, средствами DOM изменить нужный узел (удалить старый адрес, добавить новый) и загрузить обратно. Это гибкий, но трудоемкий процесс.ОбъектXDTO нужного типа на основе схемы и заполнить его данными из исходного объекта, используя вспомогательные функции, которые правильно учитывают типы АдрРФТип или АдрИнфТип.Вместо ручного «взламывания» структуры XML, при работе с модулем Диадок в 1С правильнее использовать Подключаемые модули (ПМ). Это стандартный механизм, позволяющий модифицировать документ на этапе его подготовки к отправке.
Для модификации данных документа используйте событие ПослеПодготовкиПакета или ПодготовитьЭлектронныйДокумент в подключаемом модуле. Рассмотрим пример логики изменения адреса контрагента:
// Пример логики изменения типа адреса в модуле интеграции
Адреса = Протоконтент.Consignees[0].Address;
Адреса.IsForeign = Истина;
Адреса.AddressText = АдресПредставление;
Адреса.CountryCode = "643";
// После этой манипуляции модуль автоматически подставит нужный тип АдрИнфТип
Часто возникает необходимость передать дополнительные сведения (например, специфические данные о транспортировке или договорные основания), которые не предусмотрены жесткой формой УПД. В этом случае идеальным инструментом являются поля ИнфПолФХЖ1, ИнфПолФХЖ2 и ИнфПолФХЖ3.
Они реализованы как список пар «ключ-значение», что позволяет добавлять любую информацию, не нарушая валидацию формата XML. Проанализируем, как это выглядит в коде:
// Добавление произвольных данных в информационное поле
НовоеПоле = ОбъектXDTO.Документ.ИнфПолФХЖ1.Добавить();
НовоеПоле.Идентификатор = "Основание";
НовоеПоле.Значение = "Договор №123 от 01.01.2023";
Если вам необходимо отправить не только основной документ (УПД), но и дополнительный файл (например, XML-протокол согласования цен), воспользуйтесь механизмом пакетов:
XML-файла, который соответствует требуемой схеме (например, протокол цен).ПодготовитьПакет подключаемого модуля программно прикрепите этот файл к основному пакету.УПД, а вспомогательный — Протокол.Помните, что все изменения, вносимые программно, должны проходить процедуру валидации. Перед отправкой всегда вызывайте метод Проверить() для ОбъектXDTO. Это гарантирует, что сформированный документ не будет отклонен на стороне Диадока из-за несоответствия формату ФНС. Старайтесь избегать правок в типовых модулях, всегда выносите свою логику в Подключаемый модуль, так как это упрощает обновление типовой конфигурации в будущем.