Конвертация данных 2. Использование подключаемых обработок в правилах обмена. Конвертация дерева значений

15.06.20

Интеграция - Обмен между базами 1C

Разработка правил обмена с использованием подключаемых обработок. В качестве примера рассмотрена реальная задача конвертации дерева значений.

I. Теоретическая часть

В Конвертации данных 2 (далее, КД 2) отсутствует возможность полноценного добавления в правила своих процедур и функций. Существует некоторое подобие функций — Алгоритмы, которые представляют собой сохраненные отдельно куски кода, вызываемые в нужных местах. Но алгоритмы не позволяют реализовать возможности процедурного программирования в полной мере.

Для того, чтобы вызвать свою функцию или процедуру из КД 2, можно описать её за пределами правил обмена. Например, где-нибудь в коде базы источника и/или приемника, или написать обработку с нужной функцией и вызывать её в одном из обработчиков событий. Но данный подход не всегда удобен и уместен. Обработку перемещать вместе с правилами неудобно, а в код базы вообще лучше не лезть без необходимости.

Как раз для решения этой проблемы и предназначены Подключаемые обработки. Найти их можно на вкладке Конвертация/Подключаемые обработки.

В штатной справке по КД2 о подключаемых обработках написано следующее:

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

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

Вариант 2: Подключаемая обработка поставляет форму интерфейсной настройки параметров обмена. Например, пользователю в удобном виде может быть предоставлена возможность настроить отбор выгружаемых / загружаемых данных.

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

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

ДопОбработки.<ИмяОбработки>.<ИмяЭкспортируемойПроцедурыИлиФункции()>

Аналогично производится и обращение к форме обработки (если обработка является интерфейсной)

ДопОбработки.<ИмяОбработки>.ПолучитьФорму("<ИмяФормы>")

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

К сожалению, для возврата каких-либо параметров из формы придётся открывать её только модально. Пример передачи параметров в форму и обратно:

ФормаОбработки = ДопОбработки.<ИмяОбработки>.ПолучитьФорму("<ИмяФормы>");

//передача параметров
Для Каждого Параметр Из ПараметрыДопОбработок["<ИмяОбработки>"] Цикл
	ФормаОбработки[Параметр] = Параметры[Параметр];
КонецЦикла;

РезультатОткрытияФормы = ФормаОбработки.ОткрытьМодально();

//возврат параметров
Если РезультатОткрытияФормы <> Неопределено Тогда
	
	Для Каждого Параметр Из ПараметрыДопОбработок["<ИмяОбработки>"] Цикл
		Параметры[Параметр] = ФормаОбработки[Параметр];
	КонецЦикла;
КонецЕсли;

Подключаемые обработки включаются в файл правил обмена (кодируются в base64). Если обработки используются для загрузки, то помещаются и в файл с выгруженными данными. Это может замедлить процесс обмена и увеличить файл выгрузки, если обработки имеют большой размер.

В обработке Универсальный обмен данными в формате XML (V8Exchan83) убрали возможность использования подключаемых доп. обработок. В обработке V8Exchan82 такая возможность осталась. Для того, чтобы вернуть возможность поддержки подключаемых обработок, необходимо перенести текст процедуры ЗагрузитьОбработку из V8Exchan82 в V8Exchan83.

 
 Исправленный текст процедуры ЗагрузитьОбработку()

 

Теперь завершим теоретическую часть и перейдем к практике.

II. Практическая часть

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

На рисунке представлена форма выбора характеристики для наглядности. Аналогичный функционал был реализован и в ERP. 

Непосредственно сама задача: В УПП есть регистр сведений, в котором хранятся отборы компоновки данных, помещенные в ХранилищеЗначений. Необходимо их перенести в ERP.

Логика решения задачи следующая:

1) Выполняется обход дерева отбора компоновки данных и собираются все объекты ссылочных типов;

2) Найденные объекты ссылочных типов выгружаются с помощью команды ВыгрузитьПоПравилу();

3) Сериализуется ОтборКомпоновкиДанных в XML-строку. Далее подменяются типы данных источника на типы данных приемника в строке;

4) ОтборКомпоновкиДанных помещается в параметр и выгружается в базу-приемник. В приемнике уже десериализуется.

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

Код ПВД:

Регистр = "pll_ОграниченияОтображенияСвойств";

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ 
|	pll_ОграниченияОтображенияСвойств.Номенклатура КАК Источник,
|	pll_ОграниченияОтображенияСвойств.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
|	pll_ОграниченияОтображенияСвойств.Свойство,
|	pll_ОграниченияОтображенияСвойств.УникальныйИдентификатор,
|	pll_ОграниченияОтображенияСвойств.Условие
|ИЗ
|	РегистрСведений.pll_ОграниченияОтображенияСвойств КАК pll_ОграниченияОтображенияСвойств";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
	ХранилищеУсловий = Выборка.Условие.Получить();
	ОтборКомпоновки = ХранилищеУсловий.НастройкиКомпоновкиДанных.Отбор;
	
	//проверка на заполненность отбора компоновки
	Если НЕ ОтборКомпоновки.Элементы.Количество() Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Пустой отбор компоновки! Выгрузка отменена. Регистр: " + Регистр + ", номенклатура: " + Выборка.Источник + 
		", свойство: " + Выборка.Свойство+", УИД строки: "+Выборка.УникальныйИдентификатор;
		Сообщение.Сообщить();
		
		Продолжить;
	КонецЕсли;	
	//Вызов доп. обработки по обходу дерева	
	РезультатОбхода = ДопОбработки.ОбходДерева.ОбойтиДерево(ОтборКомпоновки, Параметры.ВыгруженныеОбъекты);
	
	//ВыгруженныеОбъекты - массив ссылочных объектов
	Параметры.ВыгруженныеОбъекты = РезультатОбхода.ВыгруженныеОбъекты;
	ОтборКомпоновки = РезультатОбхода.ОтборКомпоновки;	
	
	//Выгружаем ссылочные объекты
	Для каждого Элемент из Параметры.ВыгруженныеОбъекты Цикл
		ВыгрузитьПоПравилу(Элемент);
	КонецЦикла;
	
	//Преобразовываем отбор компоновки в XML-строку
	ЗаписьXML = Новый ЗаписьXML; 
	ЗаписьXML.УстановитьСтроку();
	
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОтборКомпоновки);
	СтрокаXML = ЗаписьXML.Закрыть();
	
	//подменяем типы данных в XML-строке
	СоответствиеОбъектов = Новый Соответствие;
	СоответствиеОбъектов.Вставить("pll_ЦветПолимерногоПокрытия", "ЗначенияСвойствОбъектов");
	//...
	//...
	//СоответствиеОбъектов.Вставить("", "");
	//здесь описываются какие типы данных нужно подменить
	// где Ключ - Тип данных УПП, значение - Тип данных ERP
	
	Для каждого Элемент Из СоответствиеОбъектов Цикл
		СтрокаXML = СтрЗаменить(СтрокаXML, "d3p1:CatalogRef."+Элемент.Ключ, "d3p1:CatalogRef."+Элемент.Значение);
	КонецЦикла;
	
	ИсходящиеДанные = Новый Структура("Источник, Свойство, ЭтоГруппа, ОтборКомпоновки, УникальныйИдентификатор");
	ЗаполнитьЗначенияСвойств(ИсходящиеДанные,Выборка);	
	ИсходящиеДанные.ОтборКомпоновки = СтрокаXML;
	
	ВыгрузитьПоПравилу(,,ИсходящиеДанные,,"КВСХ_ОграниченияВводаСвойств");
КонецЦикла;

Код модуля обработки по обходу дерева при выгрузке:

Функция ОбойтиДерево(Знач ОтборКомпоновки, Знач ВыгруженныеОбъекты) Экспорт
	
	Для каждого ЭлементОтбора из ОтборКомпоновки.Элементы Цикл
		ВыгрузитьЭлементОтбора(ЭлементОтбора, ВыгруженныеОбъекты);
	КонецЦикла;
	
	РезультатФункции = Новый Структура("ОтборКомпоновки, ВыгруженныеОбъекты",ОтборКомпоновки, ВыгруженныеОбъекты);
	
	Возврат РезультатФункции;
КонецФункции

Процедура ВыгрузитьЭлементОтбора(ЭлементОтбора, ВыгруженныеОбъекты) Экспорт
	
	Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
		
		//формируем наименования свойства из поля компоновки данных
		ИсходнаяСтрока= Строка(ЭлементОтбора.ЛевоеЗначение);
		КонечнаяСтрока =Лев(ИсходнаяСтрока,1);
		Для Индекс=2 По СтрДлина(ИсходнаяСтрока) Цикл
			Символ=Сред(ИсходнаяСтрока,Индекс,1);
			КонечнаяСтрока=КонечнаяСтрока+?(ВРег(Символ)=Символ," "+НРег(Символ),Символ);
		КонецЦикла;
		//находим элемент по наименованию	
		СсылкаНаЭлемент = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(КонечнаяСтрока,Истина);
		
		//добавляем свойство
		ДобавитьВМассив(СсылкаНаЭлемент, ВыгруженныеОбъекты);		
		
		//формируем новое поле компоновки данных
		ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.["+КонечнаяСтрока+"]"); 
		
		//добавляем значения
		Если ТипЗнч(ЭлементОтбора.ПравоеЗначение) = Тип("СписокЗначений") Тогда
			Для каждого Элемент из ЭлементОтбора.ПравоеЗначение Цикл
				ДобавитьВМассив(Элемент.Значение, ВыгруженныеОбъекты)		
			КонецЦикла;
		ИначеЕсли НЕ ЗначениеЗаполнено(ЭлементОтбора.ПравоеЗначение) Тогда
			//Ничего не делаем
		Иначе
			ДобавитьВМассив(ЭлементОтбора.ПравоеЗначение, ВыгруженныеОбъекты)		
		КонецЕсли;	
		
	ИначеЕсли ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
		Для каждого Элемент из ЭлементОтбора.Элементы Цикл
			//рекурсивно вызываем процедуру
			ВыгрузитьЭлементОтбора(Элемент, ВыгруженныеОбъекты);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ДобавитьВМассив(Объект, ВыгруженныеОбъекты)
	
	Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Объект) И ВыгруженныеОбъекты.Найти(Объект) = Неопределено Тогда
		ВыгруженныеОбъекты.Добавить(Объект);
	КонецЕсли;
	
КонецПроцедуры

Послесловие

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

К сожалению, для использования доп. обработок в правилах обмена необходимо дорабатывать функционал обработки "Универсальный обмен данными в формате XML".

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

Правила обмена разрабатывались в системе Конвертация данных, редакция 2.1 (2.1.8.2) для конфигураций 1С:ERP Управление предприятием 2 (2.4.10.62) и Управление производственным предприятием, редакция 1.3 (1.3.86.3). Справочник pll_ЦветПолимерногоПокрытия и регистр сведений pll_ОграниченияОтображенияСвойств являются самостоятельно добавленными объектами и отсутствуют в типовой версии Управление производственным предприятием.

КонвертацияДанных Обмен ПравилаОбмена ДопОбработки ОтборКомпоновкиДанных

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159716    364    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134965    721    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68430    179    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34174    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46315    196    64    

158

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9217    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    20260    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231431    124    327    

296
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aximo 2027 15.06.20 07:24 Сейчас в теме
прошу привести практический пример из реальной жизни использования подключаемых обработок.
2. Drivingblind 228 15.06.20 07:30 Сейчас в теме
(1) вся вторая часть статьи - реальный пример из практики. Если он кажется недостаточно реальным, то вот ещё один вариант: открытие формы доп. обработки для сопоставления номенклатур разных баз при загрузке данных.
3. aximo 2027 15.06.20 07:36 Сейчас в теме
(2) "РезультатОбхода = ДопОбработки.ОбходДерева.ОбойтиДерево(ОтборКомпоновки, Параметры.ВыгруженныеОбъекты);" - возможно ли данную задачу решить запросом с выборкой обхода результата по группировкам (не применяя "внешние обходы"?)
4. Drivingblind 228 15.06.20 08:23 Сейчас в теме
(3) в теории, наверное, можно. Одну и ту же задачу можно решить по-разному. Как вариант, попробовать привести дерево значений к таблице значений и обойти ТЗ с помощью запроса. На практике, мне кажется, проще и быстрее будет обойти дерево рекурсивно с помощью доп. обработки. Но я могу ошибаться.

Тем более, на примере выше ТЗ пришлось бы ещё и преобразовывать обратно в Отбор СКД.
5. Yashazz 4709 15.06.20 09:01 Сейчас в теме
Грамотно, дельно, полезно. Спасибо, плюсую!
Drivingblind; +1 Ответить
6. Drivingblind 228 15.06.20 12:15 Сейчас в теме
7. xioxao 30.07.20 16:58 Сейчас в теме
Плюсанул не глядя, инфа уникальная. Спасибо автору.
Drivingblind; +1 Ответить
8. Drivingblind 228 31.07.20 12:15 Сейчас в теме
9. Dorosh 176 14.07.21 19:00 Сейчас в теме
Спасибо, познавательно.
10. fvr2000 11 21.09.22 13:51 Сейчас в теме
Через параметры объекта не было мыслей решать задачу с трансляцией ссылок в хранилищах значений? Можно без подключаемых обработок обойтись ну и необязательно сопоставление по UUID, любой вариант (по наименованию и пр.) тоже сработает...
Оставьте свое сообщение