EnterpriseData – часть 2. Процесс выгрузки данных

Публикация № 971613

Программирование - Практика программирования

EnterpriseData выгрузка данных правила обработки конвертации объектов и свойств обработчики выгрузки

99
Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

Как я и предполагал, тема обмена данными через ED оказалась актуальной. Предлагаю Вашему вниманию следующую статью из цикла. Тем, кто не читал мою первую, вводную статью, и не знаком с механизмом обмена через ED, рекомендую прочесть сначала ее – первая статья.

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

Поговорим более подробно про процесс выгрузки данных.

Содержание

  1. Обработчик «Перед конвертацией»
  2. Выборка и обход зарегистрированных к выгрузке объектов
  3. Обработка данных по правилам обработки
  1. Конвертация данных
  1. Обработчик «После конвертации»
  2. Полезные процедуры общего модуля «ОбменДаннымиXDTOСервер», используемые при выгрузке данных
  3. Основные элементы структуры «КомпонентыОбмена»

 

Ниже приведена общая схема выгрузки данных, которую мы будем рассматривать в статье:

Общая схема обмена данными через ED

Инициализация параметров, обработчик «Перед конвертацией»

В самом начале выполнения обмена данными происходит инициализация и заполнение структуры «КомпонентыОбмена». Основные элементы структуры смотрите здесь.

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

КомпонентыОбмена.ПараметрыКонвертации.ВыгружатьГруппыТоваров = Ложь;

К значениям данных параметров можно обращаться из других обработчиков выгрузки.

 

Выборка и обход зарегистрированных к выгрузке объектов

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

 

Обработка данных по правилам обработки

Правила обработки данных (ПОД) настраиваются в КД 3.0 для каждого типа объектов. В ПОД можно указать используемые правила конвертации объектов (ПКО). Допустимо указание произвольного количества ПКО. Если один и тот же объект может быть выгружен по разным ПКО, в зависимости от значений его реквизитов, требуется включить флаг «Выгружать очистку данных по неиспользуемым ПКО». Тогда по всем не используемым ПКО будет выгружаться информация об удалении объекта.

В ПОД может быть указан признак произвольной выборки данных - «Способ выборки >> Произвольный алгоритм»:

Настройка произвольной выборки данных в ПОД

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

 

Обработчик «При обработке»

Основное назначение данного обработчика – разрешение или запрещение доступных правил конвертации для конкретного объекта выборки:

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

  1. КомпонентыОбмена – структура с общими параметрами текущего обмена данными. Параметр присутствует во всех обработчиках обмена данными. Основные ключи структуры смотрите в этом разделе.
  2. ДанныеИБ – доступ к данным выгружаемого объекта: справочника или документа.
  3. ИспользуемыеПКО – структура, ключами которой являются ПКО, выбранные для данного ПОД. Значения ключей имеют тип «булево». Значение «Истина» разрешает использовать данное ПКО, значение «Ложь» - запрещает. По умолчанию все значения равны «Истина».

Пример:

ИспользованиеПКО.Справочник_Номенклатура_Отправка = НЕ ДанныеИБ.ЭтоГруппа;

Также, данный обработчик можно использовать для принудительной выгрузки дополнительных объектов:

ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ДанныеИБ.Владелец);

 

Обработчик «Выборка данных»

Используется для реализации произвольной выборки объектов, если для ПОД установлен признак произвольной выборки данных.

Обработчик должен вернуть массив объектов ИБ либо массив структур к выгрузке.

Процесс выгрузки данных с произвольным алгоритмом не автоматизирован в БСП полностью. В общем модуле «ОбменДаннымиXDTOСервер» есть механизмы для его реализации, но значительную его часть необходимо реализовывать самостоятельно.

Для использования ПОД с произвольной выгрузкой, необходимо перед выгрузкой данных определить Сценарий выгрузки. Это элемент структуры «КомпонентыОбмена», с типом – «ТаблицаЗначений». В таблице сценариев должны быть перечислены все ПОД с произвольным алгоритмом выгрузки:

КомпонентыОбмена.СценарийВыгрузки = новый ТаблицаЗначений;
КомпонентыОбмена.СценарийВыгрузки.Колонки.Добавить("ИмяПОД");

НоваяСтрока = КомпонентыОбмена.СценарийВыгрузки.Добавить();
НоваяСтрока.ИмяПОД = "Документ_ОстаткиТоваров_Отправка";

Также, необходимо дополнительно указать, что обмен выполняется без использования плана обмена:

КомпонентыОбмена.ЭтоОбменЧерезПланОбмена = Ложь;

 

Конвертация данных

Конвертация данных происходит по правилам, которые состоят из правил конвертации объектов (ПКО), правил конвертации свойств объектов (ПКС) и правил конвертации предопределенных данных (ПКПД). Все они настраиваются в конфигурации КД 3.0.

Процесс конвертации объектов состоит их конвертации всех его свойств.  Каждое свойство объекта, конвертируется согласно выбранному для него ПКО либо ПКПД:

Настройка ПКС для объекта

Конвертация свойств объектов выполняется в два этапа, между которыми вызывается обработчик «При отправке». В обработчике можно дополнить или переопределить выгружаемые данные.

Следует иметь в виду, что в обмене через ED объекты по ссылке не выгружаются полностью, как это было в обмене по правилам КД 2.0. По ссылке выгружаются только ключевые реквизиты объекта, которые необходимы для поиска в базе-приемнике. В некоторых случаях в базе-приемнике могут создаваться новые объекты по переданным ключевым свойствам, это будет подробно описано в следующее статье. 

 

Конвертация свойств первого этапа

На данном этапе происходит конвертация свойств, для которых не установлен признак «Использовать алгоритм конвертации». Если свойство ссылочное, требуется обязательное указание правила конвертации свойства. Если для ссылочного свойства не указано правило конвертации и не установлен флаг «Использовать алгоритм конвертации» - свойство не будет выгружено:

 Конвертация свойств первого этапа

 

Обработчик «При отправке»

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

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

  1. КомпонентыОбмена – структура с общими параметрами текущего обмена данными.
  2. ДанныеИБ – данные выгружаемого объекта: справочника или документа.
  3. ДанныеXDTO – промежуточная структура, данные которой будут использоваться для создания объектов XDTO.
  4. СтекВыгрузки – массив, который содержит ссылки на объекты, выгруженные на данном шаге обмена данными. Последний элемент массива - это всегда ссылка на текущий выгружаемый объект. По данным стека выгрузки можно определить, что объект выгружен «По ссылке». Также, можно определить родителя выгружаемого объекта. Используя данные стека выгрузки можно поставить условие на выполнения алгоритмов, которые не должны выполнятся в случае выгрузки объекта по ссылке.

Переопределенные в обработчике свойства необходимо добавлять к структуре «ДанныеXDTO». Если свойство простое, оно переносится в структуру «ДанныеXDTO» без изменений. Если свойство составное и для него не указано правило конвертации в настройках ПКС, добавлять его нужно в виде инструкции. Инструкция – это структура состоящая из двух элементов: правило конвертации свойства и само свойства.

Примеры: 

ДанныеXDTO.Вставить("АдресДоставки", АдресДоставкиСтрокой);

Контрагент = новый Структура("ИмяПКО, Значение", "Справочник_Контрагенты_Отправка", Покупатель);
ДанныеXDTO.Вставить("Контрагент ", Контрагент);

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

Пример:

ТабДопРеквизитов = новый ТаблицаЗначений;
ТабДопРеквизитов.Колонки.Добавить("Свойство");
ТабДопРеквизитов.Колонки.Добавить("ЗначениеСвойства");

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

   НоваяСтрока = ТабДопРеквизитов.Добавить();
   НоваяСтрока.Свойство = новый Структура("ИмяПКО, Значение", "Справочник_ДополнительныеРеквизиты_Отправка", ВыборкаДетальныеЗаписи.Свойство);
   НоваяСтрока.ЗначениеСвойства = ВыборкаДетальныеЗаписи.Значение;

КонецЦикла;

ДанныеXDTO.Вставить("ДополнительныеРеквизиты", ТабДопРеквизитов);

 

Конвертация свойств второго этапа

Правила конвертации второго этапа выполняются только в том случае, если определен обработчик «При отправке».

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

Конвертация свойств второго этапа

 

Обработчик «После конвертации»

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

 

Полезные процедуры общего модуля «ОбменДаннымиXDTOСервер», используемые при выгрузке данных

Данные процедуры могут быть использованы в обработчиках выгрузки, а также при реализации собственных алгоритмов.

ИнициализироватьКомпонентыОбмена – выполняет инициализацию компонентов обмена данными, создание и первоначальное заполнение структуры «КомпонентыОбмена».

ОткрытьФайлВыгрузки – открывает и подготавливает файл выгрузки данных.

ПроизвестиВыгрузкуДанных – выполняет выгрузку данных согласно правилам и параметрам обмена.

ВыгрузкаОбъектаВыборки – выполняет выгрузку объекта по правилам конвертации. Можно использовать в обработчиках для выгрузки произвольных объектов.

ВыгрузитьСвойство – выполняет преобразование свойства объекта ИБ в элемент структуры «ДанныеXDTO».

ПОДПоОбъектуМетаданных – поиск правил обработки данных по типу объекта метаданных.

ПКОПоИмени – выполняет поиск правила конвертации объекта по имени в таблице «ПравилаКонвертацииОбъектов» структуры «КомпонентыОбмена»

ДанныеXDTOИзДанныхИБ – выполняет преобразование данных ИБ в структуру «ДанныеXDTO».

ОбъектXDTOИзДанныхXDTO – выполняет создание объекта XDTO по данным структуры «ДанныеXDTO».

ЗаписьЖурналаРегистрацииОбменДанными – выполняет запись произвольных данных в журнал регистрации.

 

Основные элементы структуры «КомпонентыОбмена»

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

 Общие элементы

ВерсияФорматаОбмена – версия используемого пакета XDTO, например – «1.6».

XMLСхема – пространство имен используемого пакета XDTO.

МенеджерОбмена – общий модуль, в котором находятся правила конвертации или модуль внешней обработки.

УзелКорреспондента - ссылка на узел плана обмена корреспондента.

НаправлениеОбмена – одно из двух значений: «Отправка» или «Получение».

ЭтоОбменЧерезПланОбмена – флаг, указывающий, что обмен данными выполняется с использованием плана обмена.

ФлагОшибки – флаг, указывающий, что в процессе обмена данными произошла ошибка.

СтрокаСообщенияОбОшибке – описание ошибки, произошедшей в процессе обмена данными.

ПравилаОбработкиДанных – таблица значений со всеми правилами обработки данных.

ПравилаКонвертацииОбъектов – таблица значений со всеми правилами конвертации объектов.

ПараметрыКонвертации – структура параметров, которые определены в настройках конвертации.

Элементы, используемые при выгрузке данных

ВыгруженныеОбъекты – массив содержащий все объекты, выгруженные в текущей сессии выгрузки данных.

КоличествоОбъектовКВыгрузке – количество объектов, зарегистрированных к выгрузке.

СчетчикВыгруженныхОбъектов – позиция текущего выгружаемого объекта.

СоответствиеРегистрацияПоНеобходимости – список объектов (соответствие), для которых указан признак выгрузки «ВыгружатьПриНеобходимости».

ВыгруженныеПоСсылкеОбъекты – массив объектов, которые выгружены по ссылкам в процессе выгрузки данных. Ссылки на объекты добавляются в массив, если определены правила регистрации (ПРО) для объекта и в правиле указан режим выгрузки «ВыгружатьПриНеобходимости».

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

ТаблицаПравилаРегистрацииОбъектов – таблица значений со всеми правилами регистрации объектов (в случае, если ПРО заданы для обмена данными).

СвойстваУзлаПланаОбмена – структура, содержащая значения реквизитов плана обмена, которые используются для настройки режимов выгрузки объектов в ПРО («ВыгружатьВсегда», «ВыгружатьПоУсловию», «ВыгружатьПриНеобходимости», «ВыгружатьВручную», «НеВыгружать»).

 

На этом, я завершаю описании процесса выгрузки данных через ED.

Продолжение следует…

Если статья Вам понравилась, ставьте плюсик J

 

Другие мои статьи из серии «Новый подход к обмену данными»

  1. Теоретическая, вводная статья по EnterpriseData
  2. Пример доработки правил конвертации данных без использования КД 3.0
99

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. kembrik 2 26.12.18 12:00 Сейчас в теме
О, продолжение, отлично, спасибо. Отлично структурирован материал, хоть в книгу верстать.

Реквестирую немного раскрыть тему наиболее элегантного кода программной выгрузки с использованием типовой обработки ВыгрузкаЗагрузкаEnterpriseData. УниверсальныйОбменДаннымиXML освоен, а тут пока не выходит каменная чаша с наскока
2. ids79 1694 26.12.18 14:14 Сейчас в теме
Спасибо. Включу в план на будущее.
3. davdykin 17 28.12.18 17:35 Сейчас в теме
Спасибо за статью. Интересно, актуально и по делу.
4. ids79 1694 29.12.18 10:47 Сейчас в теме
5. MaxS 1543 03.01.19 18:36 Сейчас в теме
Полезная статья. Правда как мне кажется многие в первую очередь пытаются использовать КД3 на практике и если не получается, особо настойчивые читают теорию. Если получается, доходят до описанного здесь методом проб и ошибок.

Некоторые дополнения:
>Основные элементы структуры «КомпонентыОбмена»
>МенеджерОбмена – общий модуль, в котором находятся правила конвертации.
Не только общий модуль, а ещё и модуль внешней обработки.

>НаправлениеОбмена – одно из двух значений: «Выгрузка» или «Загрузка».
"Отправка" или "Получение"
6. ids79 1694 04.01.19 07:46 Сейчас в теме
(5)Спасибо за комментарий, Максим.
Неточности поправил.
8. Vladimir Litvinenko 1641 25.03.19 21:06 Сейчас в теме
(5) Такие материалы полезны в том числе после использования КД 3 на практике, для закрепления и систематизации знаний. И чтобы свои конспекты не писать. Схема в публикации отличная! Обязательно поможет вспомнить как работает система, когда снова придётся работать с КД 3. Дмитрий, спасибо за отличный материал.
9. ids79 1694 26.03.19 10:20 Сейчас в теме
7. Восьмой 45 22.03.19 12:25 Сейчас в теме
Огромное спасибо за материал!
13. ids79 1694 17.04.19 07:32 Сейчас в теме
10. Rabot 67 16.04.19 17:39 Сейчас в теме
Спасибо за статью!
Не могли бы вы пояснить как заставить работать произвольную выборку?
"Для использования ПОД с произвольной выгрузкой, необходимо перед выгрузкой данных определить Сценарий выгрузки."
Куда именно приведённый код нужно вставить, в какую-то обработку общего модуля "ОбменДаннымиXDTOСервер" или в какой-то обработчик конвертации?
11. Rabot 67 16.04.19 18:39 Сейчас в теме
(10) сам спросил сам ответил)
Что бы заработала произвольная выборка в КД3 нужно:

1. Код вставить в обработчик КД "ПередКонвертацией"
Если КомпонентыОбмена.НаправлениеОбмена = "Отправка" Тогда
КомпонентыОбмена.СценарийВыгрузки = новый ТаблицаЗначений;
КомпонентыОбмена.СценарийВыгрузки.Колонки.Добавить("ИмяПОД");
НоваяСтрока = КомпонентыОбмена.СценарийВыгрузки.Добавить();
НоваяСтрока.ИмяПОД = "СВОЁ_ИМЯ_ПОД";
КомпонентыОбмена.ЭтоОбменЧерезПланОбмена = Ложь;
КонецЕсли;


2. В конфигураторе КД3, в справочнике "ПравилаОбработкиДанных", в модуле формы "ФормаЭлемента", в процедурах "СпособВыборкиПриИзменении" и "УстановитьВидимость" - разрешить заполнять поле "ОбъектВыборки" так же и для способа выборки "Произвольный алгоритм".

3. В нужном ПОД, помимо заполнения основных свойст:
3.1 Вкладка "Основные сведения" - установить галку "Произвольный алгоритм";
3.2 Вкладка "Основные сведения" - заполнить поле "Объект выборки";
3.3 Вкладка "Выборка данных" - реализовать произвольный код, который возвращает массив ссылок, которые нужно выгрузить;

Но есть нюанс: при произвольной выборке нужно самостоятельно производить "Выборку изменений", для регистрации номера сообщения у выгруженных данных.
12. Rabot 67 16.04.19 20:12 Сейчас в теме
(11) При такой реализации указанный объект выгружается, но:
1. Номер отправленного в узле не проставляется;
2. Остальные объекты перестали выгружаться.

Вопрос остаётся: как реализовать для одного из документов/справочников свою произвольную выборку при выгрузке данных в КД3?
14. ids79 1694 17.04.19 07:43 Сейчас в теме
(12)Добрый день. На сколько я знаю, так сделать не получится. Только или все объекты по правилам или все по произвольному алгоритму.
Если найдете какой-нибуь способ, напишите, самому интересно.
15. Rabot 67 17.04.19 11:41 Сейчас в теме
(14) Мне кажется, что данный способ выгрузки противоречит логике разработчиков КД3. Мол, если не хотите что-то выгружать, ну так не регистрируйте, а значит создавайте нужные правила регистрации. В крайнем случае, в обработчике ПОД "ПриОбработке" определяйте выгружать данный объект или нет.

Как мне нравилась КД2, и как мне не нравится КД3.
Оставьте свое сообщение