Как доработать модуль Контур.Диадок в 1С для нового 970 формата УПД?

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

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

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

Шаг 1. Подготовка и подключение Подключаемого модуля (ПМ)

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

  1. Откройте обработку «Контур.Диадок» в 1С.
  2. Перейдите в настройки и найдите раздел, связанный с подключаемыми модулями.
  3. Воспользуйтесь кнопкой «Сгенерировать Шаблон». Система создаст текстовый шаблон с основной структурой ПМ.
  4. Создайте новую внешнюю обработку в конфигураторе 1С (.epf).
  5. Скопируйте сгенерированный текст шаблона в модуль объекта этой обработки и сохраните ее на диске.
  6. Вернитесь в настройки «Диадок» и укажите путь к сохраненной внешней обработке.

Теперь все наши доработки мы будем вносить именно в этот файл. Это позволит нам не трогать «ядро» модуля Диадок.

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

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

Важный нюанс: это событие может вызываться дважды:

Чтобы «поймать» правильный момент, необходимо в коде ПМ проверять наличие специального свойства Результат_ИМ в структуре параметров события. Если оно есть, значит, документ уже сформирован, и мы можем его модифицировать.

Посмотрим на пример структуры обработчика в ПМ:


Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
    Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда
        Возврат ПодготовитьЭлектронныйДокумент(Параметры);
    КонецЕсли;
КонецФункции

Функция ПодготовитьЭлектронныйДокумент(Параметры)
    // Проверяем, что типовой модуль интеграции уже отработал
    Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда
        
        // Получаем доступ к нужным данным
        Документ1С = Параметры.Результат.Документ1С; // Ссылка на документ в 1С
        мКонтент = Параметры.Результат.Content; // Готовый ОбъектXDTO с данными документа
        
        // Здесь будет наш код для изменения контента
        // ...

    КонецЕсли; 
    
    Возврат Истина; // Возвращаем Истина, чтобы стандартная обработка продолжилась
КонецФункции

Также существует событие ПослеПодготовкиПакета, которое срабатывает после формирования всего пакета документов. Оно полезно, если нужно обработать сразу несколько документов, например, УПД и связанные с ним неформализованные вложения.

Шаг 3. Работа с контентом документа (XDTO)

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

Стоит отметить, что если вам требуется не только точечная правка, но и групповая выгрузка и загрузка файлов из 1С в XML по приказам №820 и №970 (для этого подойдёт автоматическая загрузка входящих документов ЭДО в 1С), логика работы с XDTO-структурами в этих процессах будет во многом схожа.

Способ 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С.ДоговорКонтрагента.Дата);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Истина;
КонецФункции

Ключевые функции здесь:

Способ 2. Конвертация XDTO в структуру 1С и обратно

Если работа с 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, СтруктураКонтента);
    
КонецЕсли;

// ...

Шаг 4. Отладка и решение частых проблем

В процессе работы неизбежно возникают вопросы и ошибки. Разберем наиболее частые из них.

Как отладить код в ПМ?

Чтобы иметь возможность ставить точки останова и использовать отладчик, необходимо включить специальный режим в настройках «Диадок». Однако, стандартных средств иногда бывает недостаточно, и в таких случаях очень выручает специализированная отладка внешних отчетов и обработок, подключенных в конфигурацию 1С (поможет инструмент для пошаговой отладки кода 1С без конфигуратора), которая позволяет работать с кодом без постоянного перезапуска сеанса.

  1. В настройках обработки «Контур.Диадок» установите флажок «Режим отладки».
  2. При первом запуске после этого действия «Диадок» выгрузит все свои внутренние модули, включая ваш ПМ, в виде внешних обработок в подкаталоги libs и include рядом с основной обработкой.
  3. Теперь вы можете открыть файл вашего ПМ (.epf) в конфигураторе, расставить точки останова и запустить отладку стандартным способом.

Ошибка инициализации ПМ или работают старые доработки

Иногда после обновления модуля «Диадок» или смены ПМ система продолжает ссылаться на старые данные. Это связано с кэшированием настроек в регистрах сведений.

Чтобы решить эту проблему, нужно очистить устаревшие записи. В зависимости от конфигурации, они могут храниться в регистре Дополнительные сведения (для УФ) или ЗначенияСвойствОбъектов (для обычных форм). Найдите записи, относящиеся к Диадоку (например, DDPro_ИмяИнтеграционногоМодуля), и удалите их.

Ошибка валидации XML: неверный порядок тегов

Формат электронных документов строго регламентирован. Если вы формируете часть XML самостоятельно, убедитесь, что порядок элементов соответствует официальной XSD-схеме. Например, в узле <СведТов> узел <ДопСведТов> должен следовать строго после <СвДТ>.

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

← На главную