Как извлечь дополнительные поля из XML при получении транспортного контейнера ЭДО в 1С?

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

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

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

Постановка задачи и архитектура процесса

В стандартном сценарии работы ЭДО процесс выглядит следующим образом:

  1. 1С получает Транспортный контейнер от оператора ЭДО.
  2. Система распаковывает контейнер, извлекает служебный файл card.xml и сам файл документа (XML).
  3. На основании этих данных создается документ ЭлектронныйДокументВходящий.
  4. Пользователь в рабочем месте "Текущие дела ЭДО" видит этот входящий документ.
  5. Пользователь нажимает "Создать", и система формирует учетный документ (ПТУ, Реализацию и т.д.).

Проблема, с которой сталкиваются разработчики, заключается в том, что стандартный список "Входящие" в рабочем месте ЭДО строится на основании документа ЭлектронныйДокументВходящий (или регистра сведений). Если нужные нам данные находятся глубоко в XML-структуре вложения, они по умолчанию никуда не сохраняются.

Разберем подробно, как вмешаться в этот процесс на разных этапах.

Этап 1. Добавление места для хранения данных

Как справедливо замечено в обсуждении, чтобы отобразить данные в журнале входящих документов (динамическом списке), их нужно где-то хранить. Динамический список формы "Текущие дела ЭДО" обычно обращается к документу ЭлектронныйДокументВходящий.

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

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

Этап 2. Перехват данных при создании учетного документа

Если ваша задача — заполнить дополнительные поля уже в конечном документе (например, в "Приобретении товаров и услуг"), то самым эффективным способом будет использование расширения для переопределения процедур подготовки данных.

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

Вам понадобится найти функцию вида ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД (имя зависит от типа документа). В этой функции происходит разбор дерева данных, полученного из XML.

Пример кода для расширения:


&Вместо("ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД")
Функция Расш_ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД(ДеревоДанных)
	
	// Выполняем стандартный код конфигурации
	СтруктураДанных = ПродолжитьВызов(ДеревоДанных);
	
	// Здесь вызываем свою процедуру обработки
	// ДеревоДанных содержит всю структуру XML файла
	// СтруктураДанных - это то, что пойдет в создание документа
	
	ОбработатьДополнительныеПоля(СтруктураДанных, ДеревоДанных);
	
	Возврат СтруктураДанных;
	
КонецФункции

Процедура ОбработатьДополнительныеПоля(СтруктураДанных, ДеревоДанных)
    // Логика поиска нужных узлов в ДеревоДанных
    // Например, поиск узла ИнфПолФХЖ1
    
    // Запись найденных значений в СтруктураДанных.ТаблицаДополнительныхРеквизитов
КонецПроцедуры

Этот метод хорош для заполнения самого документа поступления, но он не решает задачу отображения данных в списке "Текущие дела ЭДО" до создания документа, так как этот код выполняется только в момент нажатия пользователем кнопки "Создать/Отразить в учете".

Этап 3. Перехват данных при распаковке контейнера (БЭД)

Для решения задачи отображения данных в списке нам нужно спуститься на уровень ниже — в Библиотеку Электронных Документов (БЭД). Нам необходимо перехватить момент, когда система распаковывает ZIP-архив транспортного контейнера и создает запись в базе данных.

Основная точка входа для анализа содержимого контейнера находится в общем модуле ОбменСКонтрагентамиСлужебный (или модулях с похожим названием в новых версиях БЭД). Ключевая процедура обычно называется СоздатьЭлектронныеДокументыПоТранспортномуКонтейнеру.

Однако, править этот огромный модуль через расширение может быть сложно из-за его объема и частых обновлений. Более надежный способ — найти процедуру записи входящего электронного документа.

Алгоритм реализации:

  1. Найдите место, где записывается объект ЭлектронныйДокументВходящий.
  2. В этот момент в контексте обычно доступен либо сам XML-файл, либо уже разобранные данные.
  3. Используя расширение с аннотацией &Перед или &После записи, мы можем дописать свои данные.

В современных версиях форматов (УПД, УКД) дополнительные сведения часто передаются в узлах:

Вам потребуется реализовать чтение XML (через ЧтениеXML или ФабрикаXDTO) непосредственно из файла, приложенного к документу.

Пример логики поиска файла и чтения данных:


// Примерный алгоритм для встраивания в процедуру обработки входящего документа
// ВходящийДокументОбъект - это объект ЭлектронныйДокументВходящий перед записью

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

Запрос.УстановитьПараметр("Владелец", ВходящийДокументОбъект.Ссылка);
// ... выполнение запроса и получение двоичных данных файла ...

// Чтение XML
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXMLИзФайла);
// ... парсинг нужных тегов ...

ВходящийДокументОбъект.ДопПолеЗаказ = НайденноеЗначение;

Важное замечание про форматы: Данные самого документа хранятся не в card.xml (это паспорт документа с метаданными), а во втором файле, лежащем в контейнере. Именно его нужно разбирать.

Особенности отладки фоновых заданий

В теме справедливо отмечено, что отладка этого процесса затруднена. Дело в том, что получение и распаковка контейнеров ЭДО часто выполняется регламентным заданием в фоновом режиме ("Получение и отправка электронных документов").

Если вы поставите точку останова в режиме "Предприятие", она может не сработать, так как код выполняется на сервере в фоне. Чтобы успешно отладить ваш код:

  1. Запустите базу в режиме отладки с ключом разрешения отладки (обычно это делается через конфигуратор: Сервис -> Параметры -> Запуск 1С:Предприятия -> Дополнительные параметры запуска: /debug -http или настройка сервера).
  2. В конфигураторе включите "Автоматическое подключение": Отладка -> Подключение -> Автоматическое подключение -> Фоновые задания (поставьте галочку).
  3. Либо используйте запись в Журнал регистрации. Это самый надежный способ понять, что происходит внутри "черного ящика" фонового задания.

Используйте код для логирования:


ЗаписьЖурналаРегистрации("ОтладкаЭДО", 
    УровеньЖурналаРегистрации.Информация, 
    , 
    , 
    "Начало разбора файла: " + ИмяФайла);

Резюме

Для того чтобы увидеть дополнительные поля в списке "Текущие дела ЭДО":

  1. Расширьте состав реквизитов документа ЭлектронныйДокументВходящий.
  2. Найдите в модулях БЭД (например, ОбменСКонтрагентамиСлужебный) момент создания этого документа из транспортного контейнера.
  3. Реализуйте парсинг XML-файла вложения для извлечения тегов (обычно ИнфПолФХЖ1) и записи их в новые реквизиты.
  4. Для переноса этих данных в учетный документ (ПТУ) используйте расширение процедуры ПодготовитьСтруктуруДля... в модуле интеграции вашей конфигурации.
← На главную