Конвертация данных, редакция 3.0 (3.0.5)
10.03.2021

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

Принятые сокращения

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

Назначение

Конвертация данных, редакция 3.0 (далее КД3.0) - это инструмент для разработки обменов, предполагающих наличие посредника передачи данных между конфигурациями в виде универсального формата данных EnterpriseData. В этом качестве КД3.0 является одним из компонентов технологии обмена данными через формат EnterpriseData.

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

Главной особенностью КД3.0 является концепция конвертации данных (см. рисунок):

Следуя из этого список отличий КД3.0 от КД2.0 можно свести к нескольким пунктам:

Модель процесса конвертации

В основе реализованной в БСП механики конвертации данных через формат данных EnterpriseData, лежит модель, включающая в себя следующие элементы (далее - функциональные компоненты конвертации):

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

Правила конвертации объектов

Общий порядок выполнения правил конвертации при выполнении процедур отправки и получения данных представлен на схеме:

Особенности конвертации свойств с помощью ПКС

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

Заполнение свойств с помощью алгоритма

Часто возникают ситуации, когда нет возможности заполнить свойство получателя на основании определенного свойства источника. Например, свойство заполняется по совокупности нескольких свойств, либо свойству присваивается некоторое предопределенное значение.

В этом случае в правиле конвертации свойства:

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

Конвертация свойств по правилам конвертации объектов

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

Вариант №1. Правило конвертации свойства можно указать однозначно.

Простая ситуация, когда нет зависимости от данных конвертируемого объекта. В этом случае Правило конвертации свойства указывается явно - в ПКС.

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

Вариант №2. Правило конвертации зависит от данных конвертируемого объекта.

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

В этой ситуации

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

Пример кода для отправки:

Копировать в буфер обмена

Если ДокументРеализации <> Неопределено Тогда
    ИмяПКО = "Документ_РеализацияТоваровУслуг_Отправка";
    Если ТипЗнч(ДокументРеализации) = Тип("ДокументСсылка.ОтчетОРозничныхПродажах") Тогда
        ИмяПКО = "Документ_ОтчетОРозничныхПродажах_Отправка";
    КонецЕсли;
    ДанныеXDTO.Вставить("ДокументРеализации", Новый Структура("Значение, ИмяПКО", ДокументРеализации, ИмяПКО));
КонецЕсли;

Пример кода для получения:

Копировать в буфер обмена

Если ДокументРеализации <> Неопределено Тогда
    ИмяПКО = "Документ_РеализацияТоваровУслуг_Получение";
    Если Найти(ДокументРеализации .ТипЗначения, "ОтчетОРозничныхПродажах") > 0 Тогда
        ИмяПКО = "Документ_ОтчетОРозничныхПродажах_Получение";
    КонецЕсли;
    ПолученныеДанные.ДополнительныеСвойства.Вставить("ДокументРеализации", Новый Структура("Значение, ИмяПКО", ДокументРеализации, ИмяПКО));
КонецЕсли;
 

Конвертация табличных частей с помощью алгоритмов конвертации

Методика конвертации в правилах конвертации объектов для отправки:

  1. Заполнение данных табличной части производится в алгоритме ПриОтправкеДанных.
  2. Источник данных для заполнения строк табличной части - выгружаемый объект ДанныеИБ.
  3. Данные табличной  части помещаются в таблицу значений. Имена колонок таблицы значений должны соответствовать наименованиям свойств формата.
  4. Заполнение таблицы значений можно выполнять любым подходящим способом (например, запросом к табличной части объекта конфигурации).
  5. Подготовленную таблицу необходимо вставить в структуру ДанныеXDTO, при этом ключ соответствует имени табличной части в формате обмена.

Пример кода для отправки табличной части РасшифровкаПлатежа:

Копировать в буфер обмена

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

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

    Если ЗначениеЗаполнено(СтрокаРП_ИБ.Заказ) Тогда
        ТипСсылки = ТипЗнч(СтрокаРП_ИБ.Заказ);
        ИмяПКО = "";
       
        Если ТипСсылки = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
            ИмяПКО = "Документ_ПоступлениеТоваровУслуг_Отправка";
        ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ПоступлениеУслугПрочихАктивов") Тогда
            ИмяПКО = "Документ_ПоступлениеУслугПрочихАктивов_Отправка";
        ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ТаможеннаяДекларацияИмпорт") Тогда
            ИмяПКО = "Документ_ТаможеннаяДекларация_Отправка";
        ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ОтчетКомиссионера") Тогда
            ИмяПКО = "Документ_ОтчетКомиссионера_Отправка";
        ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ЗаказКлиента") Тогда
            ИмяПКО = "Документ_ЗаказКлиента_Отправка";
        КонецЕсли;
       
        Если ИмяПКО <> "" Тогда
        НоваяСтрокаРП.Заказ = Новый Структура("Значение, ИмяПКО", СтрокаРП_ИБ.Заказ, ИмяПКО);

    КонецЕсли;

КонецЦикла;

ДанныеXDTO.Вставить("РасшифровкаПлатежа", ТабРП);

Методика конвертации в правилах конвертации объектов для получения:

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

Пример кода для получения табличной части РасшифровкаПлатежа:

Копировать в буфер обмена

МассивСтрокРасшифровка = Новый Массив;

Для Каждого Строка Из ДанныеXDTO.РасшифровкаПлатежа Цикл

    СтруктураДанныхСтроки = Новый Структура;
    СтруктураДанныхСтроки.Вставить("Сумма", Строка.Сумма);
    СтруктураДанныхСтроки.Вставить("СуммаВзаиморасчетов", Строка.СуммаВзаиморасчетов);
    СтруктураДанныхСтроки.Вставить("СтатьяДДС", Строка.СтатьяДвиженияДенежныхСредств);

    МассивСтрокРасшифровка.Добавить(СтруктураДанныхСтроки);

КонецЦикла;

ПолученныеДанные.ДополнительныеСвойства.Вставить("РасшифровкаПлатежа", МассивСтрокРасшифровка);

Конвертация табличных частей без использования алгоритмов конвертации

В версии 3.0.5 конфигурации Конвертация данных появилась возможность создавать правила конвертации для табличных частей и их свойств без написания кода алгоритмов ПКО. Для использования данной возможности должно выполняться 2 условия:

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

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

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

Пример кода для отправки табличной части Товары (часть свойств заполняются только на основе ПКС, другая часть - алгоритмом):

Копировать в буфер обмена

Запрос = Новый Запрос(
"ВЫБРАТЬ
|     _ДемоПоступлениеТоваровТовары.Номенклатура.СтранаПроисхождения КАК СтранаПроисхождения,
|     ВЫРАЗИТЬ(_ДемоПоступлениеТоваровТовары.Цена * _ДемоПоступлениеТоваровТовары.Количество КАК ЧИСЛО(15, 2)) КАК Сумма
|ИЗ
|     Документ._ДемоПоступлениеТоваров.Товары КАК _ДемоПоступлениеТоваровТовары
|ГДЕ
|     _ДемоПоступлениеТоваровТовары.Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО НомерСтроки");
Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

// Товары
ИндексСтроки = 0;
ТекСтавкаНДС = ПолучитьСтавкуНДСДокумента(ДанныеИБ.СтавкаНДС);
Пока Выборка.Следующий() Цикл
    СтрокаТовары = ДанныеXDTO.Товары[ИндексСтроки];
    СтрокаТовары.СтавкаНДС = ТекСтавкаНДС;
    СтрокаТовары.НомерГТД = "";
    СтрокаТовары.ЕдиницаИзмерения = Новый Структура("Ссылка,Код","","796");
    СтрокаТовары.Сумма = Выборка.Сумма;
    СтрокаТовары.СтранаПроисхождения = Выборка.СтранаПроисхождения;
    ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
 

Пример кода для получения табличной части Товары (часть свойств заполняются только на основе ПКС, другая часть - алгоритмом):

Копировать в буфер обмена

МассивСтрокТовары = Новый Массив;
Если ДанныеXDTO.Свойство("Товары")
    И ЗначениеЗаполнено(ДанныеXDTO.Товары) Тогда
    ИндексСтроки = 0;
    Для Каждого Строка Из ДанныеXDTO.Товары Цикл
        СтрокаТЧ = ПолученныеДанные.Товары[ИндексСтроки];
        СтрокаТЧ.Цена = Строка.Цена;
        ИндексСтроки = ИндексСтроки + 1;
    КонецЦикла;
КонецЕсли;
 

Механизм компоновки элементов конвертации

Процесс разработки конвертации в КД3.0 осуществляется по принципу компоновки элементов конвертации. Для упрощения параллельной разработки нескольких обменов данными в КД3.0 предусмотрена возможность использования общих элементов конвертации: ПОД, ПКО, ПКПД, алгоритмов (см. рисунок):

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

Управлять составом конвертаций можно с помощью команд Добавить элемент в состав конвертации и Выделить элемент из состава конвертаций доступными из форм функциональных компонентов.

Команда Добавить элемент в состав конвертации создает в КД3.0 связь между текущим элементом и конвертацией, указанной в форме выбора.

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

Ниже приведены примеры использования общих элементов конвертации.

Пример 1

В двух конфигурациях, назовем их Конфигурация 1 и Конфигурация 2, справочник Контрагенты имеет одинаковую структуру. Реализовав логику загрузки контрагентов из формата EnterpriseData для Конфигурации 1 будет логично использовать ее и в Конфигурации 2. КД3.0 позволяет это сделать путем включения ПКО для справочника Контрагенты в состав одновременно двух конвертаций: и для Конфигурации 1, и для Конфигурации 2.

Пример 2

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

Копирование состава конвертации

В КД3.0 поддерживается операция копирования состава конвертаций (раздел Конвертации, команда Копирование состава конвертации).

При копировании состава конвертации не происходит создание новых правил - вместо этого существующие правила конвертации-источника включаются в состав указанной конвертации.