При переходе на новый 970 формат электронных документов в системе «Контур.Диадок» многие программисты 1С столкнулись с проблемой: старые доработки, внесенные непосредственно в код модуля, перестали работать. Часто первым делом требуется выполнить общее обновление настроек отправки документов ЭДО на новый формат УПД, но если логика формирования документа была кастомной, типовых настроек может не хватить. Это произошло из-за того, что внутренняя структура модуля, названия процедур и функций были полностью изменены.
Основная рекомендация — использовать подключаемый модуль (ПМ). Это специальная внешняя обработка, которая позволяет изменять стандартное поведение модуля «Диадок» без вмешательства в его основной код. Такой подход гарантирует, что при следующем обновлении все ваши настройки сохранятся. В случаях, когда необходима масштабная смена форматов исходящих электронных документов и настроек ЭДО для разных видов документов, использование ПМ становится единственным надежным способом сохранить стабильность системы.
Если вы ранее не использовали ПМ, начнем с его создания и подключения. Это простой процесс, который избавит от множества проблем в будущем.
.epf).Теперь все наши доработки мы будем вносить именно в этот файл. Это позволит нам не трогать «ядро» модуля Диадок.
Подключаемый модуль работает на основе перехвата событий, которые инициирует основной модуль «Диадок». Для нашей задачи — изменения содержимого документа перед отправкой — ключевым является событие ПодготовитьЭлектронныйДокумент.
Важный нюанс: это событие может вызываться дважды:
Чтобы «поймать» правильный момент, необходимо в коде ПМ проверять наличие специального свойства Результат_ИМ в структуре параметров события. Если оно есть, значит, документ уже сформирован, и мы можем его модифицировать.
Посмотрим на пример структуры обработчика в ПМ:
Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
Возврат ПодготовитьЭлектронныйДокумент(Параметры);
КонецЕсли;
КонецФункции
Функция ПодготовитьЭлектронныйДокумент(Параметры)
// Проверяем, что типовой модуль интеграции уже отработал
Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда
// Получаем доступ к нужным данным
Документ1С = Параметры.Результат.Документ1С; // Ссылка на документ в 1С
мКонтент = Параметры.Результат.Content; // Готовый ОбъектXDTO с данными документа
// Здесь будет наш код для изменения контента
// ...
КонецЕсли;
Возврат Истина; // Возвращаем Истина, чтобы стандартная обработка продолжилась
КонецФункции
Также существует событие ПослеПодготовкиПакета, которое срабатывает после формирования всего пакета документов. Оно полезно, если нужно обработать сразу несколько документов, например, УПД и связанные с ним неформализованные вложения.
Самая сложная часть — это работа с ОбъектXDTO, который представляет собой структуру будущего XML-файла. Прямое присвоение значений свойствам этого объекта не всегда работает. Для корректной модификации нужно использовать специальные функции, которые предоставляет основной модуль «Диадок».
Стоит отметить, что если вам требуется не только точечная правка, но и групповая выгрузка и загрузка файлов из 1С в XML по приказам №820 и №970 (для этого подойдёт автоматическая загрузка входящих документов ЭДО в 1С), логика работы с XDTO-структурами в этих процессах будет во многом схожа.
Этот способ требует понимания структуры XDTO, но является самым производительным. Доступ к функциям модуля «Диадок» осуществляется через переменную ОсновнойМодуль, которую необходимо объявить в ПМ.
Рассмотрим комплексный пример, который решает сразу несколько задач: добавление кода номенклатуры в наименование, замена основания на договор и добавление заказа в доп. сведения. Пример универсален и работает как для старого 820, так и для нового 970 формата.
// Объявляем переменную в самом начале модуля ПМ
Перем ОсновнойМодуль Экспорт;
Функция ПодготовитьЭлектронныйДокумент(Параметры)
Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда
Документ1С = Параметры.Результат.Документ1С;
мКонтент = Параметры.Результат.Content;
// Пример: добавляем код номенклатуры в наименование
СтрокиТаблицы = мКонтент.Table.Items;
Для Каждого ЭлементXDTO Из СтрокиТаблицы Цикл
Номенклатура = ЗначениеИзСтрокиВнутр(ЭлементXDTO.СлужебнаяИнформация.Номенклатура);
КодНоменклатуры = Номенклатура.Код;
Если ЗначениеЗаполнено(КодНоменклатуры) Тогда
// Добавляем код в информационное поле
ОсновнойМодуль.ДобавитьИнформационноеПоле(ЭлементXDTO, "Код", СокрЛП(КодНоменклатуры));
// Добавляем код в наименование
ЭлементXDTO.Product = ЭлементXDTO.Product + ", " + СокрЛП(КодНоменклатуры);
КонецЕсли;
КонецЦикла;
// Пример: заменяем основание на договор
Если ЗначениеЗаполнено(Документ1С.ДоговорКонтрагента) Тогда
// Для нового формата 970
Если Параметры.ВидДокументаРазвернутый.ТипКонтента = "Utd970SellerContent" Тогда
Если мКонтент.TransferInfo.TransferBases.Количество() = 0 Тогда
мОснование = ОсновнойМодуль.НовыйЭлементСпискаXDTO(мКонтент.TransferInfo.TransferBases);
Иначе
мОснование = мКонтент.TransferInfo.TransferBases[0];
КонецЕсли;
// Обратите внимание, что имена полей изменились в 970 формате
ОсновнойМодуль.УстановитьЗначениеXDTO(мОснование, "Name", "Договор");
ОсновнойМодуль.УстановитьЗначениеXDTO(мОснование, "Number", Документ1С.ДоговорКонтрагента.Номер);
ОсновнойМодуль.УстановитьЗначениеXDTO(мОснование, "Date", Документ1С.ДоговорКонтрагента.Дата);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
Ключевые функции здесь:
ОсновнойМодуль.НовыйЭлементСпискаXDTO() — создает и добавляет новый элемент в список XDTO (например, новую строку основания).ОсновнойМодуль.ДобавитьИнформационноеПоле() — удобная функция для добавления пар «Ключ-Значение» в дополнительные сведения.ОсновнойМодуль.УстановитьЗначениеXDTO() — устанавливает значение для свойства объекта XDTO.Если работа с XDTO кажется слишком сложной, есть более простой путь. Можно преобразовать весь контент в привычную для 1С структуру, внести изменения стандартными методами, а затем преобразовать обратно.
// ... внутри функции ПодготовитьЭлектронныйДокумент ...
Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда
// Получаем контент
КонтентXDTO = Параметры.Результат.Content;
// 1. Преобразуем XDTO в структуру
СтруктураКонтента = ОсновнойМодуль.ОбъектXDTOВСтруктуру(КонтентXDTO, Истина);
// 2. Работаем со структурой как обычно
// Например, изменим наименование в первой строке таблицы
Если СтруктураКонтента.Table.Items.Количество() > 0 Тогда
СтруктураКонтента.Table.Items[0].Product = "Новое наименование товара";
КонецЕсли;
// Добавим дополнительное сведение в шапку
НовоеСведение = СтруктураКонтента.AdditionalInfoId.StructedAdditionalInfos.Добавить();
НовоеСведение.Key = "НомерЗаказаКлиента";
НовоеСведение.Value = "ЗК-00123";
// 3. Преобразуем структуру обратно в XDTO
ОсновнойМодуль.ЗаполнитьКонтентXDTOПоСтруктуре(КонтентXDTO, СтруктураКонтента);
КонецЕсли;
// ...
В процессе работы неизбежно возникают вопросы и ошибки. Разберем наиболее частые из них.
Чтобы иметь возможность ставить точки останова и использовать отладчик, необходимо включить специальный режим в настройках «Диадок». Однако, стандартных средств иногда бывает недостаточно, и в таких случаях очень выручает специализированная отладка внешних отчетов и обработок, подключенных в конфигурацию 1С (поможет инструмент для пошаговой отладки кода 1С без конфигуратора), которая позволяет работать с кодом без постоянного перезапуска сеанса.
libs и include рядом с основной обработкой..epf) в конфигураторе, расставить точки останова и запустить отладку стандартным способом.Иногда после обновления модуля «Диадок» или смены ПМ система продолжает ссылаться на старые данные. Это связано с кэшированием настроек в регистрах сведений.
Чтобы решить эту проблему, нужно очистить устаревшие записи. В зависимости от конфигурации, они могут храниться в регистре Дополнительные сведения (для УФ) или ЗначенияСвойствОбъектов (для обычных форм). Найдите записи, относящиеся к Диадоку (например, DDPro_ИмяИнтеграционногоМодуля), и удалите их.
Формат электронных документов строго регламентирован. Если вы формируете часть XML самостоятельно, убедитесь, что порядок элементов соответствует официальной XSD-схеме. Например, в узле <СведТов> узел <ДопСведТов> должен следовать строго после <СвДТ>.
Таким образом, используя подключаемый модуль и следуя приведенным рекомендациям, вы сможете не только адаптировать свои доработки под новый 970 формат, но и сделать систему более гибкой и простой в обслуживании на долгие годы.