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

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

При переходе на новые форматы электронного документооборота (в частности, формат 970 для УПД и УКД, вступающий в обязательную силу с 2025 года) многие разработчики сталкиваются с неочевидным поведением подключаемых модулей (ПМ) Диадока. Типичная ситуация: вы внесли доработки в ПМ, добавили заполнение дополнительных полей, например, ИнфПолФХЖ2 (код номенклатуры клиента), и в окне предпросмотра 1С всё выглядит идеально. Однако при попытке сохранить документ в файл XML через кнопку «Сохранить» в окне предпросмотра, вы обнаруживаете, что все ваши правки исчезли, и файл сформирован по типовому шаблону. Рассмотрим, почему это происходит и как правильно реализовать доработку, чтобы данные сохранялись во всех режимах.

Разберем причину: архитектура событий модуля Диадока

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

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

Выбираем правильное событие для модификации данных

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

  1. Первый вызов: До того как типовой модуль Диадока начнет формировать XML. Здесь параметр Параметры.Результат_ИМ имеет значение Ложь. На этом этапе мы можем полностью заменить типовое формирование своим кодом.
  2. Второй вызов: Сразу после того, как типовой модуль сформировал стандартный контент по правилам 1С и Диадока. Здесь параметр Параметры.Результат_ИМ равен Истина. Это именно то место, где нам нужно «подцепить» готовый объект и добавить в него свои данные.

Пошаговая реализация доработки в подключаемом модуле

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


Процедура ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
    
    Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
        
        // Проверяем, что типовой модуль уже отработал и сформировал контент
        Если Параметры.Свойство("Результат_ИМ") И Параметры.Результат_ИМ = Истина Тогда
            
            // Получаем доступ к XDTO-объекту контента
            // Для новых форматов (970) структура может находиться в Параметры.Результат.Content
            Контент = Параметры.Результат.Content;
            
            // Если мы работаем с УКД, перебираем строки документа
            Если ТипЗнч(Контент) = Тип("ОбъектXDTO") Тогда
                
                // Пройдем по табличной части документа (Items)
                // В УКД структура: InvoiceCorrectionTable -> Items
                Для Каждого СтрокаТовара Из Контент.InvoiceCorrectionTable.Items Цикл
                    
                    // Реализуем добавление ИнфПолФХЖ2 (StructuredAdditionalInfos)
                    // Проверяем наличие свойства или создаем его
                    НовоеДопСведение = Контент.СоздатьОбъект("StructedAdditionalInfos");
                    НовоеДопСведение.Name = "код_материала";
                    НовоеДопСведение.Value = "ЗНАЧЕНИЕ_КОДА_КЛИЕНТА"; // Здесь ваша логика получения кода
                    
                    // Добавляем созданный объект в коллекцию дополнительных сведений строки
                    СтрокаТовара.AdditionalInfo.Add(НовоеДопСведение);
                    
                КонецЦикла;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важный момент: Обратите внимание на проверку Результат_ИМ = Истина. Если вы попытаетесь обратиться к контенту при первом вызове события, вы получите Неопределено, так как типовой модуль еще не создал объект.

Особенности работы с форматом 970 (УПД/УКД)

Проанализируем специфику нового формата 970, который активно внедряется в 2024-2025 годах. В отличие от старого формата 820, структура ИнфПолФХЖ2 стала более регламентированной. При программном добавлении данных через ПМ крайне важно соблюдать типы данных XDTO-модели. Если вы просто добавите свойство, которого нет в схеме, модуль может выдать ошибку при сериализации или просто проигнорировать «лишний» узел при сохранении в файл.

Если вы обнаружили, что в событии ПодготовитьЭлектронныйДокумент данные в Параметры.Результат.Content отсутствуют даже при Результат_ИМ = Истина, следует проверить версию вашего интеграционного модуля. В некоторых промежуточных версиях разработчики Диадока использовали свойство РезультатИМ (без подчеркивания) или передавали контент в сериализованном виде. В этом случае рекомендуется использовать отладку, чтобы точно определить путь к объекту Content.

Как проверить результат?

Для проверки корректности решения выполним следующие действия:

  1. Откройте форму «Для отправки» в модуле Диадока.
  2. Выберите нужный документ и откройте его Предпросмотр.
  3. В окне предпросмотра убедитесь, что ваши данные отображаются в визуальной форме (обычно внизу страницы или в расшифровке позиций).
  4. Нажмите кнопку «Сохранить в XML» (иконка дискеты или соответствующий пункт меню).
  5. Откройте сохраненный файл любым текстовым редактором или браузером и выполните поиск по тегу ИнфПолФХЖ2 или ДопСведТов.

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

Заключение

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

← На главную