Конвертация данных 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_ОграниченияОтображенияСвойств являются самостоятельно добавленными объектами и отсутствуют в типовой версии Управление производственным предприятием.

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

58000 руб.

04.08.2015    190735    460    307    

460

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    162274    980    324    

483

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

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

58000 руб.

15.04.2019    85474    229    180    

166

SALE! 10%

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

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    35029    261    64    

199

Перенос данных 1C Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Перенос данных из УПП 1.3 в УНФ | из КА 1.1 в УНФ | из УТ 10.3 в УНФ | Перенос разработан в формате КД 2 (правила конвертации объектов) | Выгружаются все возможные виды документов, начальных остатков и вся нормативно-справочная информация | Есть фильтр по организациям при выгрузке данных | Есть несколько алгоритмов выгрузки начальных остатков товаров на выбор | Можно проверить перед покупкой на своем сервере!

58000 руб.

17.10.2019    45161    60    117    

62

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

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

50600 руб.

21.05.2019    59025    81    134    

73

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

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

85400 руб.

05.10.2022    13962    16    8    

17

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    63361    83    134    

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

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