Почему дополнительная информация из подключаемого модуля Диадока не сохраняется в XML при выгрузке из окна предпросмотра?

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

При работе с электронным документооборотом (ЭДО) через модуль Диадока в 1С Управление торговлей (УТ) многие пользователи сталкиваются с необходимостью кастомизации отправляемых документов. Для этих целей обычно используются подключаемые модули (ПМ), которые позволяют вносить изменения в структуру и содержимое XML-файлов до их отправки контрагенту. Однако, при переходе на новые форматы документов, такие как УПД и УКД версии 5.03, и использовании обновлённых подключаемых модулей, может возникнуть проблема: доработки, внесенные в ПМ, корректно отображаются при предпросмотре и отправке документа, но исчезают при попытке сохранить XML-файл из окна предпросмотра на диск. Давайте вместе разберем эту ситуацию и найдем решение.

Разбираем суть проблемы: доработки исчезают при сохранении XML

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

Однако, когда мы нажимаем кнопку "Сохранить документ" в окне предпросмотра, чтобы выгрузить XML-файл для дальнейшей ручной загрузки через веб-интерфейс Диадока, выясняется, что сохраненный файл не содержит внесенных нами изменений. Он выглядит так, будто сформировался заново, полностью игнорируя все доработки, которые мы реализовали в подключаемом модуле. Это создает значительные трудности, особенно когда требуется оперативно исправить и переотправить документ, например, из-за "лишних кодов маркировки", как в описанном случае.

Важное наблюдение, которое нам стоит проанализировать, заключается в следующем: при отправке документа или открытии предпросмотра происходит вызов функции ОбработатьСобытие(ИмяСобытия, Параметры) нашего подключаемого модуля, где отлавливается нужное событие и происходит модификация данных. Но при нажатии кнопки "Сохранить документ" из окна предпросмотра, вход в эту функцию не происходит. Это наталкивает нас на мысль о различиях в механизмах обработки документа.

Анализируем механизмы работы подключаемого модуля и событий

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

В подключаемом модуле Диадока существуют два ключевых события, которые часто используются для работы с контентом:

  1. ПодготовитьЭлектронныйДокумент
  2. Это событие предназначено для первичного формирования контента всех документов, которые будут включены в пакет для отправки. Мы ожидаем, что результатом этого события будет заполненный XDTO-объект в Параметры.Результат.Content или структура метаданных. Если мы хотим полностью контролировать формирование контента с нуля или вносить изменения на самом раннем этапе, нам следует использовать это событие.

  3. ПослеПодготовкиПакета
  4. Это событие позволяет нам изменять любые свойства уже подготовленного пакета до его отправки. Входным параметром Параметры.Пакет является структура, содержащая основные сведения о пакете и его составе, включая уже сформированный контент документов. Именно здесь, как правило, и происходят доработки, подобные добавлению ИнфПолФХЖ2, путем изменения Параметры.Пакет.Документы[0].Content.

В нашем случае, пользователь изменяет контент именно в событии ПослеПодготовкиПакета. Он берет контент из Параметры.Пакет.Документы[0].Content и, например, добавляет структуру StructedAdditionalInfos с нужными данными в Content.InvoiceCorrectionTable.Items для каждого Item.

Ключевая гипотеза: Вероятно, при отправке документа или открытии предпросмотра, система Диадока проходит полный цикл обработки, который включает вызов события ПослеПодготовкиПакета, где и применяются наши доработки. Однако, при сохранении XML-файла из окна предпросмотра, система может использовать уже сформированный для визуализации контент, но без повторного прохождения через все события подключаемого модуля, которые изменяют данные. То есть, она сохраняет "сырой" контент предпросмотра, который не был повторно модифицирован нашим ПМ.

Возможные причины и пути решения проблемы

Теперь, когда мы проанализировали ситуацию, давайте рассмотрим конкретные причины и предложим пути решения.

Причина 1: Различные механизмы формирования и сохранения XML

Как мы уже выяснили, механизм формирования XML для отправки и предпросмотра, скорее всего, включает полный цикл обработки документа, где наш подключаемый модуль успешно вносит изменения. Однако, механизм сохранения XML из окна предпросмотра может работать иначе.

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

Что мы можем сделать:

  1. Перенести логику модификации в событие ПодготовитьЭлектронныйДокумент:

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

    Пример кода для ПодготовитьЭлектронныйДокумент:

    
    Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
        // Проверяем, что это наш тип документа (например, УКД)
        Если Параметры.ИмяТипаДокумента = "ДокументИсправление" Тогда // Или другой способ определения
            // Получаем типовой контент
            ТиповойМодуль.ТиповойМодуль_ПолучитьКонтент(ТиповойМодуль, РежимУправляемыхФорм, Документ1С, ТипКонтента_XDTO, ДополнительныеПараметры);
    
            // Получаем XDTO-объект контента, который был сформирован типовым модулем
            КонтентДокумента = Параметры.Результат.Content;
    
            Если КонтентДокумента.Свойство("InvoiceCorrectionTable") Тогда
                ТаблицаКорректировки = КонтентДокумента.InvoiceCorrectionTable;
                Для Каждого ЭлементТаблицы Из ТаблицаКорректировки.Items Цикл
                    // Добавляем дополнительную информацию в StructedAdditionalInfos
                    НоваяДопИнфо = КонтентДокумента.ФабрикаXDTO.Создать(КонтентДокумента.ФабрикаXDTO.Пакеты.Получить("ИмяПакетаСхемыУКД").ПолучитьТип("StructedAdditionalInfo")); // Замените на реальное имя пакета и типа
                    НоваяДопИнфо.Name = "код_материала";
                    НоваяДопИнфо.Value = "ВашКодМатериала"; // Здесь получаем реальное значение
    
                    // Добавляем НоваяДопИнфо в коллекцию ЭлементТаблицы.AdditionalInfos
                    Если Не ЭлементТаблицы.Свойство("AdditionalInfos") Тогда
                        ЭлементТаблицы.ДобавитьСвойство("AdditionalInfos", КонтентДокумента.ФабрикаXDTO.Создать(КонтентДокумента.ФабрикаXDTO.Пакеты.Получить("ИмяПакетаСхемыУКД").ПолучитьТип("СписокStructedAdditionalInfo"))); // Создаем коллекцию
                    КонецЕсли;
                    ЭлементТаблицы.AdditionalInfos.Добавить(НоваяДопИнфо);
                КонецЦикла;
            КонецЕсли;
    
            // Устанавливаем модифицированный контент в результат
            Параметры.Результат.Content = КонтентДокумента;
        КонецЕсли;
    КонецЕсли;
    

    Обратите внимание, что в событии ПодготовитьЭлектронныйДокумент нам сначала нужно получить типовой контент с помощью функции ТиповойМодуль.ТиповойМодуль_ПолучитьКонтент(), а затем уже модифицировать его. После модификации мы должны присвоить измененный контент обратно в Параметры.Результат.Content.

  2. Использовать альтернативные способы выгрузки:

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

    1. Отправка документа и последующее скачивание: Мы можем отправить документ через модуль Диадока (где доработки гарантированно отрабатывают), а затем скачать уже сформированный XML-файл из веб-интерфейса Диадока. Этот файл будет содержать все внесенные изменения.
    2. Ручная выгрузка с последующей модификацией: Если есть возможность выгрузить "сырой" XML из 1С типовыми средствами (без модуля Диадока), мы можем затем программно или вручную внести необходимые изменения в XML-файл перед загрузкой в веб-интерфейс Диадока. Этот способ требует дополнительных шагов и не всегда удобен.

Причина 2: Недостаточное понимание структуры XDTO-объекта и его модификации

При работе с XDTO-объектами важно точно знать их структуру и использовать правильные методы для добавления или изменения данных. Поле ИнфПолФХЖ2 соответствует Item.AdditionalInfo в табличной части УКД/УПД.

Что мы можем сделать:

  1. Тщательно изучить документацию по XDTO-схемам: Убедитесь, что вы точно знаете структуру XML-файла для нового формата УКД/УПД и правильные пути для добавления информации. Используйте средства отладки 1С для изучения структуры объектов КонтентДокумента и его дочерних элементов во время выполнения кода.
  2. Использовать Фабрику XDTO: При добавлении новых элементов, таких как StructedAdditionalInfo, всегда используйте ФабрикуXDTO для создания объектов правильного типа. Это гарантирует, что созданные элементы будут соответствовать схеме.

Причина 3: Проблемы с обновлением подключаемого модуля Диадока

Переход на новый формат УПД/УКД (версия 5.03) требовал значительной адаптации подключаемых модулей. Возможно, в новом ПМ есть нюансы или недоработки, которые влияют на процесс сохранения.

Что мы можем сделать:

  1. Изучить документацию по новому ПМ: Тщательно изучите актуальную документацию Диадока по новому подключаемому модулю и работе с событиями. Возможно, для сохранения XML с доработками требуется использовать другое событие или метод, который вызывается именно при нажатии кнопки "сохранить документ" из предпросмотра.
  2. Отладка подключаемого модуля: Мы можем использовать режим отладки для подключаемого модуля, чтобы пошагово проследить выполнение кода при сохранении XML из предпросмотра. Это поможет нам понять, какие функции вызываются, какие данные доступны и почему модификации не попадают в итоговый файл. Особое внимание уделим значениям переменных Параметры.Результат.Content и Параметры.Пакет.Документы[0].Content на разных этапах.
  3. Обратиться в техническую поддержку Диадока: Если после всех наших попыток проблема не решается, настоятельно рекомендуем обратиться в техническую поддержку Диадока. Учитывая, что подобные ситуации (например, с лишними кодами маркировки) уже возникали и были признаны ими, возможно, они смогут предоставить специфическое решение или обходной путь для нового подключаемого модуля.

Заключительные рекомендации

Мы видим, что проблема с сохранением XML-файла из предпросмотра, когда доработки из подключаемого модуля не попадают в итоговый файл, является комплексной и требует внимательного анализа. Мы рекомендуем:

  1. В первую очередь пересмотреть логику модификации контента и по возможности перенести её в событие ПодготовитьЭлектронныйДокумент, убедившись, что после типового формирования контента вы вносите свои изменения и присваиваете результат обратно в Параметры.Результат.Content.
  2. Если это не помогает или невозможно, тщательно провести отладку подключаемого модуля, чтобы точно определить момент, когда данные теряются или не применяются.
  3. Рассмотреть альтернативные способы выгрузки XML, такие как отправка документа с последующим скачиванием из веб-интерфейса, как временное решение.
  4. И, конечно, не стесняться обращаться в техническую поддержку Диадока, так как они могут обладать специфической информацией о поведении нового подключаемого модуля и его интеграции с 1С.

Совместными усилиями мы обязательно справимся с этой задачей и обеспечим корректную работу ЭДО в 1С!

← К списку