Как найти место формирования XML-документов ЭДО в актуальных конфигурациях 1С

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

В современных конфигурациях 1С, таких как 1С:ERP 2.5, 1С:Комплексная автоматизация 2.5 и 1С:Управление торговлей 11, механизмы электронного документооборота (ЭДО) реализованы на базе Библиотеки электронного документооборота (БЭД). Для многих разработчиков, привыкших к старым решениям (УПП, УТ 10.3), поиск места формирования XML-файла становится настоящим квестом. В этой статье мы разберем архитектуру формирования электронных документов и выясним, где именно в коде происходит сбор данных и генерация итогового файла.

Различие подходов: почему поиск через отладчик затруднен

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

  1. Сбор данных в дерево: Программа сначала собирает данные из документа-источника в универсальную структуру (дерево значений).
  2. XDTO-сериализация: Вместо ручной склейки строк XML, данные передаются в механизмы XDTO, которые на основе схем (пакетов XDTO) автоматически генерируют файл. Поэтому в коде вы практически никогда не встретите прямых тегов вроде <Файл> или <Документ>.
  3. Фоновое выполнение: Формирование и подписание документов часто выносится в фоновые задания, чтобы не блокировать интерфейс пользователя.

Основная точка входа для данных УПД

Выясним, в каком модуле сосредоточена логика подготовки данных для самого популярного документа — УПД (Универсальный передаточный документ). В библиотеке БЭД предусмотрены переопределяемые модули, в которых разработчик может вмешаться в процесс формирования XML.

Рассмотрим общий модуль ОбменСКонтрагентамиПереопределяемый. Именно здесь располагаются процедуры, которые система вызывает для заполнения структуры данных электронного документа. Для УПД основной процедурой является:


Процедура ЗаполнитьДанныеУПД_ИнформацияПродавца(Знач Основания, Данные, Отказ) Экспорт
    // Здесь происходит заполнение дерева значений 'Данные' 
    // на основе массива ссылок 'Основания'
КонецПроцедуры

Обратите внимание, что в зависимости от версии БЭД и конкретной конфигурации (например, КА или ERP), название модуля может иметь постфикс, например, ОбменСКонтрагентамиПереопределяемыйКА. Проанализируем параметры этой процедуры:

Поиск конкретной реализации для разных форматов

Поскольку форматы ФНС периодически меняются (например, переход с приказа № 155 на приказ № 820), в коде существует разделение по версиям. Разберем, как найти нужный фрагмент кода через макеты. В обработке ОбменСКонтрагентами часто присутствуют макеты, описывающие структуру дерева данных (например, УПД_ИнформацияПродавца_2019).

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

  1. Система определяет формат (версию приказа ФНС).
  2. Вызывается менеджер соответствующего формата.
  3. Вызывается переопределяемый модуль для заполнения специфических полей.
  4. Данные передаются в ПроцессорВыводаXDTO.

Как отлаживать фоновые задания ЭДО

Если вы ставите точку останова, но программа её "проскакивает" при нажатии кнопки "Сформировать", значит, процесс уходит в фон. Выполним следующие настройки для успешной отладки:

Во-первых, в параметрах отладки (в конфигураторе) включите флаг "Отладка фоновых заданий".

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

Работа с XDTO: где рождается сам XML

Если ваша задача — не просто изменить данные, а понять, как формируется сама XML-структура, нужно изучить XDTO-пакеты. В ветке конфигурации "Общие -> XDTO-пакеты" найдите пакеты с префиксами ON_NSCHFDOPPR (для УПД). Именно там описаны все теги, их обязательность и типы данных.

Проанализируем ситуацию: когда дерево значений заполнено, система вызывает методы сериализации. Посмотрим на примерный механизм работы платформы в этот момент:


// Пример логики в недрах БЭД
МенеджерФормата = ЭлектронныеДокументыСлужебный.МенеджерФормата(ВерсияФормата);
ОбъектXDTO = МенеджерФормата.СоздатьОбъектXDTOПоДанным(ДеревоДанных);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
РезультатXML = ЗаписьXML.Закрыть();

Таким образом, если вы хотите перехватить уже готовый XML-текст до его подписания, ищите место, где вызывается ФабрикаXDTO.ЗаписатьXML. Обычно это происходит в серверных модулях ЭлектронныеДокументыЭДО или АрхивЭлектронныхДокументов.

Использование расширений для кастомизации XML

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

  1. Создаем новое расширение.
  2. Добавляем в него общий модуль ОбменСКонтрагентамиПереопределяемый.
  3. Создаем процедуру-перехватчик (аннотация &После или &Вместо) для метода ЗаполнитьДанныеУПД_ИнформацияПродавца.
  4. Внутри этой процедуры мы можем дозаполнить дерево Данные новыми значениями, которые затем автоматически попадут в XML благодаря механизму XDTO.

Где найти уже сформированный XML в базе?

Если вам нужно не изменить процесс, а просто проанализировать уже отправленный или полученный файл, проанализируем структуру хранения. В БЭД все документы сохраняются в регистре сведений АрхивЭлектронныхДокументов. Данные файла хранятся в ресурсе Данные, который имеет тип ХранилищеЗначения.

Посмотрим, как программно извлечь этот XML для анализа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	АрхивЭлектронныхДокументов.Данные КАК ДанныеФайла
    |ИЗ
    |	РегистрСведений.АрхивЭлектронныхДокументов КАК АрхивЭлектронныхДокументов
    |ГДЕ
    |	АрхивЭлектронныхДокументов.Владелец = &ЭлектронныйДокумент";

Запрос.УстановитьПараметр("ЭлектронныйДокумент", СсылкаНаЭДО);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ДвоичныеДанные = Выборка.ДанныеФайла.Получить();
    ТекстXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
    // Теперь ТекстXML содержит содержимое файла ЭДО
КонецЕсли;

Важный момент: помните, что в актуальных конфигурациях версии БЭД обновляются часто, поэтому всегда проверяйте актуальность имен модулей в регистре сведений ВерсииПодсистем. Это поможет вам сориентироваться, какую именно документацию на ИТС следует открывать в данный момент.

← На главную