При внедрении и настройке электронного документооборота (ЭДО) часто возникает задача обработки нестандартных данных или загрузки КИЗ из XML. Контрагенты могут передавать дополнительную информацию в XML-файлах (например, номера заказов, специфические признаки сделки, данные по проектам, требующие загрузки входящих документов), которые не попадают в стандартные реквизиты документов 1С, что важно учитывать при выгрузке УПД в XML.
Рассмотрим ситуацию, когда необходимо не просто загрузить документ, но и "вытащить" эти дополнительные сведения (доп. поля) непосредственно в момент получения транспортного контейнера. Это особенно актуально, если мы хотим видеть эту информацию в журнале "Текущие дела ЭДО" еще до того, как бухгалтер создаст на основании электронного документа учетный документ (например, "Приобретение товаров и услуг").
В стандартном сценарии работы ЭДО процесс выглядит следующим образом:
card.xml и сам файл документа (XML).ЭлектронныйДокументВходящий.Проблема, с которой сталкиваются разработчики, заключается в том, что стандартный список "Входящие" в рабочем месте ЭДО строится на основании документа ЭлектронныйДокументВходящий (или регистра сведений). Если нужные нам данные находятся глубоко в XML-структуре вложения, они по умолчанию никуда не сохраняются.
Разберем подробно, как вмешаться в этот процесс на разных этапах.
Как справедливо замечено в обсуждении, чтобы отобразить данные в журнале входящих документов (динамическом списке), их нужно где-то хранить. Динамический список формы "Текущие дела ЭДО" обычно обращается к документу ЭлектронныйДокументВходящий.
Поэтому первым шагом необходимо через Расширение конфигурации добавить новые реквизиты в документ ЭлектронныйДокументВходящий. Назовем их, например, ДопПолеЗаказ или НомерПроекта.
Также не забудьте вынести эти новые реквизиты на форму списка в обработке ТекущиеДелаЭДО, чтобы пользователи могли их видеть.
Если ваша задача — заполнить дополнительные поля уже в конечном документе (например, в "Приобретении товаров и услуг"), то самым эффективным способом будет использование расширения для переопределения процедур подготовки данных.
В общем модуле ОбменСКонтрагентамиУТ (или аналогичном для вашей конфигурации, например ОбменСКонтрагентамиБП) существуют процедуры, отвечающие за подготовку структуры данных перед созданием документа. Рассмотрим пример использования аннотации &Вместо для перехвата управления.
Вам понадобится найти функцию вида ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД (имя зависит от типа документа). В этой функции происходит разбор дерева данных, полученного из XML.
Пример кода для расширения:
&Вместо("ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД")
Функция Расш_ПодготовитьСтруктуруДляПриобретенияТоваровУслугУПД(ДеревоДанных)
// Выполняем стандартный код конфигурации
СтруктураДанных = ПродолжитьВызов(ДеревоДанных);
// Здесь вызываем свою процедуру обработки
// ДеревоДанных содержит всю структуру XML файла
// СтруктураДанных - это то, что пойдет в создание документа
ОбработатьДополнительныеПоля(СтруктураДанных, ДеревоДанных);
Возврат СтруктураДанных;
КонецФункции
Процедура ОбработатьДополнительныеПоля(СтруктураДанных, ДеревоДанных)
// Логика поиска нужных узлов в ДеревоДанных
// Например, поиск узла ИнфПолФХЖ1
// Запись найденных значений в СтруктураДанных.ТаблицаДополнительныхРеквизитов
КонецПроцедуры
Этот метод хорош для заполнения самого документа поступления, но он не решает задачу отображения данных в списке "Текущие дела ЭДО" до создания документа, так как этот код выполняется только в момент нажатия пользователем кнопки "Создать/Отразить в учете".
Для решения задачи отображения данных в списке нам нужно спуститься на уровень ниже — в Библиотеку Электронных Документов (БЭД). Нам необходимо перехватить момент, когда система распаковывает ZIP-архив транспортного контейнера и создает запись в базе данных.
Основная точка входа для анализа содержимого контейнера находится в общем модуле ОбменСКонтрагентамиСлужебный (или модулях с похожим названием в новых версиях БЭД). Ключевая процедура обычно называется СоздатьЭлектронныеДокументыПоТранспортномуКонтейнеру.
Однако, править этот огромный модуль через расширение может быть сложно из-за его объема и частых обновлений. Более надежный способ — найти процедуру записи входящего электронного документа.
Алгоритм реализации:
ЭлектронныйДокументВходящий.&Перед или &После записи, мы можем дописать свои данные.В современных версиях форматов (УПД, УКД) дополнительные сведения часто передаются в узлах:
<ИнфПолФХЖ1> — Информационное поле факта хозяйственной жизни 1.<ИнфПолФХЖ2> — Информационное поле 2 (часто для табличных частей).<ДопСведОсн> — Дополнительные сведения об основании.Вам потребуется реализовать чтение XML (через ЧтениеXML или ФабрикаXDTO) непосредственно из файла, приложенного к документу.
Пример логики поиска файла и чтения данных:
// Примерный алгоритм для встраивания в процедуру обработки входящего документа
// ВходящийДокументОбъект - это объект ЭлектронныйДокументВходящий перед записью
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрисоединенныеФайлы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ЭлектронныйДокументВходящийПрисоединенныеФайлы КАК ПрисоединенныеФайлы
|ГДЕ
| ПрисоединенныеФайлы.ВладелецФайла = &Владелец
| И ПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИБ)";
Запрос.УстановитьПараметр("Владелец", ВходящийДокументОбъект.Ссылка);
// ... выполнение запроса и получение двоичных данных файла ...
// Чтение XML
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXMLИзФайла);
// ... парсинг нужных тегов ...
ВходящийДокументОбъект.ДопПолеЗаказ = НайденноеЗначение;
Важное замечание про форматы: Данные самого документа хранятся не в card.xml (это паспорт документа с метаданными), а во втором файле, лежащем в контейнере. Именно его нужно разбирать.
В теме справедливо отмечено, что отладка этого процесса затруднена. Дело в том, что получение и распаковка контейнеров ЭДО часто выполняется регламентным заданием в фоновом режиме ("Получение и отправка электронных документов").
Если вы поставите точку останова в режиме "Предприятие", она может не сработать, так как код выполняется на сервере в фоне. Чтобы успешно отладить ваш код:
/debug -http или настройка сервера).Используйте код для логирования:
ЗаписьЖурналаРегистрации("ОтладкаЭДО",
УровеньЖурналаРегистрации.Информация,
,
,
"Начало разбора файла: " + ИмяФайла);
Для того чтобы увидеть дополнительные поля в списке "Текущие дела ЭДО":
ЭлектронныйДокументВходящий.ОбменСКонтрагентамиСлужебный) момент создания этого документа из транспортного контейнера.ИнфПолФХЖ1) и записи их в новые реквизиты.ПодготовитьСтруктуруДля... в модуле интеграции вашей конфигурации.