В современных конфигурациях 1С, таких как 1С:ERP 2.5, 1С:Комплексная автоматизация 2.5 и 1С:Управление торговлей 11, механизмы электронного документооборота (ЭДО) реализованы на базе Библиотеки электронного документооборота (БЭД). Для многих разработчиков, привыкших к старым решениям (УПП, УТ 10.3), поиск места формирования XML-файла становится настоящим квестом. В этой статье мы разберем архитектуру формирования электронных документов и выясним, где именно в коде происходит сбор данных и генерация итогового файла.
Проанализируем сначала причину, по которой обычный поиск текстовых вхождений или простая остановка в форме документа не дают результата. В актуальных версиях 1С используется многоуровневая абстракция:
XDTO, которые на основе схем (пакетов XDTO) автоматически генерируют файл. Поэтому в коде вы практически никогда не встретите прямых тегов вроде <Файл> или <Документ>.Выясним, в каком модуле сосредоточена логика подготовки данных для самого популярного документа — УПД (Универсальный передаточный документ). В библиотеке БЭД предусмотрены переопределяемые модули, в которых разработчик может вмешаться в процесс формирования XML.
Рассмотрим общий модуль ОбменСКонтрагентамиПереопределяемый. Именно здесь располагаются процедуры, которые система вызывает для заполнения структуры данных электронного документа. Для УПД основной процедурой является:
Процедура ЗаполнитьДанныеУПД_ИнформацияПродавца(Знач Основания, Данные, Отказ) Экспорт
// Здесь происходит заполнение дерева значений 'Данные'
// на основе массива ссылок 'Основания'
КонецПроцедуры
Обратите внимание, что в зависимости от версии БЭД и конкретной конфигурации (например, КА или ERP), название модуля может иметь постфикс, например, ОбменСКонтрагентамиПереопределяемыйКА. Проанализируем параметры этой процедуры:
ДокументСсылка.РеализацияТоваровУслуг).Поскольку форматы ФНС периодически меняются (например, переход с приказа № 155 на приказ № 820), в коде существует разделение по версиям. Разберем, как найти нужный фрагмент кода через макеты. В обработке ОбменСКонтрагентами часто присутствуют макеты, описывающие структуру дерева данных (например, УПД_ИнформацияПродавца_2019).
Чтобы точно поймать момент формирования, рекомендуем установить точку останова в процедуре СформироватьКонтентЭлектронногоДокумента общего модуля ОбменСКонтрагентамиСлужебный. Проанализируем стек вызовов в этой точке:
ПроцессорВыводаXDTO.Если вы ставите точку останова, но программа её "проскакивает" при нажатии кнопки "Сформировать", значит, процесс уходит в фон. Выполним следующие настройки для успешной отладки:
Во-первых, в параметрах отладки (в конфигураторе) включите флаг "Отладка фоновых заданий".
Во-вторых, если фоновое задание завершается слишком быстро, можно временно добавить в код принудительную паузу или использовать метод ОбщегоНазначения.СообщитьПользователю() для вывода отладочной информации в журнал регистрации.
Если ваша задача — не просто изменить данные, а понять, как формируется сама XML-структура, нужно изучить XDTO-пакеты. В ветке конфигурации "Общие -> XDTO-пакеты" найдите пакеты с префиксами ON_NSCHFDOPPR (для УПД). Именно там описаны все теги, их обязательность и типы данных.
Проанализируем ситуацию: когда дерево значений заполнено, система вызывает методы сериализации. Посмотрим на примерный механизм работы платформы в этот момент:
// Пример логики в недрах БЭД
МенеджерФормата = ЭлектронныеДокументыСлужебный.МенеджерФормата(ВерсияФормата);
ОбъектXDTO = МенеджерФормата.СоздатьОбъектXDTOПоДанным(ДеревоДанных);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
РезультатXML = ЗаписьXML.Закрыть();
Таким образом, если вы хотите перехватить уже готовый XML-текст до его подписания, ищите место, где вызывается ФабрикаXDTO.ЗаписатьXML. Обычно это происходит в серверных модулях ЭлектронныеДокументыЭДО или АрхивЭлектронныхДокументов.
В современных конфигурациях крайне не рекомендуется вносить изменения непосредственно в типовые модули ЭДО. Правильнее будет использовать расширение конфигурации. Рассмотрим алгоритм действий:
ОбменСКонтрагентамиПереопределяемый.&После или &Вместо) для метода ЗаполнитьДанныеУПД_ИнформацияПродавца.Данные новыми значениями, которые затем автоматически попадут в XML благодаря механизму XDTO.Если вам нужно не изменить процесс, а просто проанализировать уже отправленный или полученный файл, проанализируем структуру хранения. В БЭД все документы сохраняются в регистре сведений АрхивЭлектронныхДокументов. Данные файла хранятся в ресурсе Данные, который имеет тип ХранилищеЗначения.
Посмотрим, как программно извлечь этот XML для анализа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АрхивЭлектронныхДокументов.Данные КАК ДанныеФайла
|ИЗ
| РегистрСведений.АрхивЭлектронныхДокументов КАК АрхивЭлектронныхДокументов
|ГДЕ
| АрхивЭлектронныхДокументов.Владелец = &ЭлектронныйДокумент";
Запрос.УстановитьПараметр("ЭлектронныйДокумент", СсылкаНаЭДО);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДвоичныеДанные = Выборка.ДанныеФайла.Получить();
ТекстXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
// Теперь ТекстXML содержит содержимое файла ЭДО
КонецЕсли;
Важный момент: помните, что в актуальных конфигурациях версии БЭД обновляются часто, поэтому всегда проверяйте актуальность имен модулей в регистре сведений ВерсииПодсистем. Это поможет вам сориентироваться, какую именно документацию на ИТС следует открывать в данный момент.