При работе с электронным документооборотом (ЭДО) через модуль Диадока в 1С Управление торговлей (УТ) многие пользователи сталкиваются с необходимостью кастомизации отправляемых документов. Для этих целей обычно используются подключаемые модули (ПМ), которые позволяют вносить изменения в структуру и содержимое XML-файлов до их отправки контрагенту. Однако, при переходе на новые форматы документов, такие как УПД и УКД версии 5.03, и использовании обновлённых подключаемых модулей, может возникнуть проблема: доработки, внесенные в ПМ, корректно отображаются при предпросмотре и отправке документа, но исчезают при попытке сохранить XML-файл из окна предпросмотра на диск. Давайте вместе разберем эту ситуацию и найдем решение.
Представим типичную ситуацию, с которой столкнулся наш пользователь: мы успешно адаптировали подключаемый модуль Диадока к новому формату УКД. Все необходимые доработки, например, добавление специфической информации по товару в поле ИнфПолФХЖ2 (например, код номенклатуры клиента), работают как часы при непосредственной отправке документа из модуля 1С. Более того, при открытии документа на предварительный просмотр, мы видим, что все наши дополнительные данные отображаются корректно в визуализации УКД.
Однако, когда мы нажимаем кнопку "Сохранить документ" в окне предпросмотра, чтобы выгрузить XML-файл для дальнейшей ручной загрузки через веб-интерфейс Диадока, выясняется, что сохраненный файл не содержит внесенных нами изменений. Он выглядит так, будто сформировался заново, полностью игнорируя все доработки, которые мы реализовали в подключаемом модуле. Это создает значительные трудности, особенно когда требуется оперативно исправить и переотправить документ, например, из-за "лишних кодов маркировки", как в описанном случае.
Важное наблюдение, которое нам стоит проанализировать, заключается в следующем: при отправке документа или открытии предпросмотра происходит вызов функции ОбработатьСобытие(ИмяСобытия, Параметры) нашего подключаемого модуля, где отлавливается нужное событие и происходит модификация данных. Но при нажатии кнопки "Сохранить документ" из окна предпросмотра, вход в эту функцию не происходит. Это наталкивает нас на мысль о различиях в механизмах обработки документа.
Для понимания причин такого поведения, нам необходимо глубже рассмотреть, как работают события в подключаемом модуле Диадока и какие из них отвечают за формирование и модификацию контента.
В подключаемом модуле Диадока существуют два ключевых события, которые часто используются для работы с контентом:
ПодготовитьЭлектронныйДокументЭто событие предназначено для первичного формирования контента всех документов, которые будут включены в пакет для отправки. Мы ожидаем, что результатом этого события будет заполненный XDTO-объект в Параметры.Результат.Content или структура метаданных. Если мы хотим полностью контролировать формирование контента с нуля или вносить изменения на самом раннем этапе, нам следует использовать это событие.
ПослеПодготовкиПакетаЭто событие позволяет нам изменять любые свойства уже подготовленного пакета до его отправки. Входным параметром Параметры.Пакет является структура, содержащая основные сведения о пакете и его составе, включая уже сформированный контент документов. Именно здесь, как правило, и происходят доработки, подобные добавлению ИнфПолФХЖ2, путем изменения Параметры.Пакет.Документы[0].Content.
В нашем случае, пользователь изменяет контент именно в событии ПослеПодготовкиПакета. Он берет контент из Параметры.Пакет.Документы[0].Content и, например, добавляет структуру StructedAdditionalInfos с нужными данными в Content.InvoiceCorrectionTable.Items для каждого Item.
Ключевая гипотеза: Вероятно, при отправке документа или открытии предпросмотра, система Диадока проходит полный цикл обработки, который включает вызов события ПослеПодготовкиПакета, где и применяются наши доработки. Однако, при сохранении XML-файла из окна предпросмотра, система может использовать уже сформированный для визуализации контент, но без повторного прохождения через все события подключаемого модуля, которые изменяют данные. То есть, она сохраняет "сырой" контент предпросмотра, который не был повторно модифицирован нашим ПМ.
Теперь, когда мы проанализировали ситуацию, давайте рассмотрим конкретные причины и предложим пути решения.
Как мы уже выяснили, механизм формирования XML для отправки и предпросмотра, скорее всего, включает полный цикл обработки документа, где наш подключаемый модуль успешно вносит изменения. Однако, механизм сохранения XML из окна предпросмотра может работать иначе.
Предположение: Система может просто брать уже сгенерированный (и, возможно, кешированный) XML-файл, который был создан для визуализации, и сохранять его на диск, не запуская при этом повторно события подключаемого модуля. Это объясняет, почему ОбработатьСобытие не вызывается при сохранении.
Что мы можем сделать:
ПодготовитьЭлектронныйДокумент:
Если это возможно, попробуйте перенести логику добавления дополнительной информации в событие ПодготовитьЭлектронныйДокумент. Это событие вызывается на более раннем этапе формирования документа, и если оно корректно заполняет Параметры.Результат.Content, то последующие операции, включая предпросмотр и сохранение, должны работать с уже модифицированным контентом.
Пример кода для ПодготовитьЭлектронныйДокумент:
Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
// Проверяем, что это наш тип документа (например, УКД)
Если Параметры.ИмяТипаДокумента = "ДокументИсправление" Тогда // Или другой способ определения
// Получаем типовой контент
ТиповойМодуль.ТиповойМодуль_ПолучитьКонтент(ТиповойМодуль, РежимУправляемыхФорм, Документ1С, ТипКонтента_XDTO, ДополнительныеПараметры);
// Получаем XDTO-объект контента, который был сформирован типовым модулем
КонтентДокумента = Параметры.Результат.Content;
Если КонтентДокумента.Свойство("InvoiceCorrectionTable") Тогда
ТаблицаКорректировки = КонтентДокумента.InvoiceCorrectionTable;
Для Каждого ЭлементТаблицы Из ТаблицаКорректировки.Items Цикл
// Добавляем дополнительную информацию в StructedAdditionalInfos
НоваяДопИнфо = КонтентДокумента.ФабрикаXDTO.Создать(КонтентДокумента.ФабрикаXDTO.Пакеты.Получить("ИмяПакетаСхемыУКД").ПолучитьТип("StructedAdditionalInfo")); // Замените на реальное имя пакета и типа
НоваяДопИнфо.Name = "код_материала";
НоваяДопИнфо.Value = "ВашКодМатериала"; // Здесь получаем реальное значение
// Добавляем НоваяДопИнфо в коллекцию ЭлементТаблицы.AdditionalInfos
Если Не ЭлементТаблицы.Свойство("AdditionalInfos") Тогда
ЭлементТаблицы.ДобавитьСвойство("AdditionalInfos", КонтентДокумента.ФабрикаXDTO.Создать(КонтентДокумента.ФабрикаXDTO.Пакеты.Получить("ИмяПакетаСхемыУКД").ПолучитьТип("СписокStructedAdditionalInfo"))); // Создаем коллекцию
КонецЕсли;
ЭлементТаблицы.AdditionalInfos.Добавить(НоваяДопИнфо);
КонецЦикла;
КонецЕсли;
// Устанавливаем модифицированный контент в результат
Параметры.Результат.Content = КонтентДокумента;
КонецЕсли;
КонецЕсли;
Обратите внимание, что в событии ПодготовитьЭлектронныйДокумент нам сначала нужно получить типовой контент с помощью функции ТиповойМодуль.ТиповойМодуль_ПолучитьКонтент(), а затем уже модифицировать его. После модификации мы должны присвоить измененный контент обратно в Параметры.Результат.Content.
Если перенос логики невозможен или сложен, рассмотрим временные обходные пути:
При работе с XDTO-объектами важно точно знать их структуру и использовать правильные методы для добавления или изменения данных. Поле ИнфПолФХЖ2 соответствует Item.AdditionalInfo в табличной части УКД/УПД.
Что мы можем сделать:
КонтентДокумента и его дочерних элементов во время выполнения кода.StructedAdditionalInfo, всегда используйте ФабрикуXDTO для создания объектов правильного типа. Это гарантирует, что созданные элементы будут соответствовать схеме.Переход на новый формат УПД/УКД (версия 5.03) требовал значительной адаптации подключаемых модулей. Возможно, в новом ПМ есть нюансы или недоработки, которые влияют на процесс сохранения.
Что мы можем сделать:
Параметры.Результат.Content и Параметры.Пакет.Документы[0].Content на разных этапах.Мы видим, что проблема с сохранением XML-файла из предпросмотра, когда доработки из подключаемого модуля не попадают в итоговый файл, является комплексной и требует внимательного анализа. Мы рекомендуем:
ПодготовитьЭлектронныйДокумент, убедившись, что после типового формирования контента вы вносите свои изменения и присваиваете результат обратно в Параметры.Результат.Content.Совместными усилиями мы обязательно справимся с этой задачей и обеспечим корректную работу ЭДО в 1С!
← К списку