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