Правила обмена для переноса справочника КД 3.0

1. xSev 05.09.18 09:45 Сейчас в теме
Занимаюсь написанием правил обмена для КД 3.0.
Задача:
Необходимо перенести справочник "Сотрудники" из ЗуП 3.1 в УАТ Проф 2.1. Так же вместе с сотрудниками необходимо перенести справочник физ лица и данные регистра сведений "Текущие кадровые данные сотрудников", а именно: справочник подразделения и должности.

Проблема:
В УФ(1.4.х) нет справочника "Сотрудники", решил переносить через справочник "Упаковки". Проблема в том, что не понимаю, как при выгрузке в additional info указать конвертации по какому ПКО необходимо конвертировать эти справочники.
Ниже выкладываю код(он с закомментированными фрагментами, т.к. пробовал разные варианты) и файл обмена. Вместо использования ПКО и выгрузки необходимых полей для конвертации физ лица и должности, конвертация просто подставляет его(ПКО) название в xml файл, хотя и на курсе и на сайте 1с написано, что именно так и нужно подставлять правило:

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

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



ЕдИзмЗаглушка = Новый Структура;
	ЕдИзмЗаглушка.Вставить("Код", "000");
	ДанныеXDTO.КлючевыеСвойства.Вставить("ЕдиницаИзмерения", ЕдИзмЗаглушка);
	ДанныеXDTO.КлючевыеСвойства.Вставить("Коэффициент", 1);
	
	ДанныеXDTO.Вставить("Высота", "1");	
	ДанныеXDTO.Вставить("Глубина", "1");	
	ДанныеXDTO.Вставить("Ширина", "1");
	ДанныеXDTO.Вставить("Объем", "1");
	
	Имя = "СправочникСотрудники";
	СтруктураСправочника = Новый Структура;
		
	СтруктураСправочника.Вставить("Код", ДанныеИБ.Код);	
	//СтруктураСправочника.Вставить("ФизическоеЛицо", ДанныеИБ.ФизическоеЛицо);
	ИмяПКО = "Справочник_ФизическиеЛица_Отправка";	
    СтруктураСправочника.Вставить("ФизическоеЛицо", Новый Структура("Значение, ИмяПКО", ДанныеИБ.ФизическоеЛицо, ИмяПКО));
	
	
	СтруктураСправочника.Вставить("ГоловнаяОрганизация", "ЗССК");		
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	КадроваяИсторияСотрудников.Период КАК Прием
		|ПОМЕСТИТЬ ДатаПриема
		|ИЗ
		|	РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
		|ГДЕ
		|	КадроваяИсторияСотрудников.Сотрудник = &Сотрудник
		|	И КадроваяИсторияСотрудников.ВидСобытия В (ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Прием), ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.НачальныеДанные))
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	КадроваяИсторияСотрудников.Период КАК Увольнение
		|ПОМЕСТИТЬ ДатаУвольнения
		|ИЗ
		|	РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
		|ГДЕ
		|	КадроваяИсторияСотрудников.Сотрудник = &Сотрудник
		|	И КадроваяИсторияСотрудников.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	КадроваяИсторияСотрудниковСрезПоследних.Подразделение.Код КАК ПодразделениеКод,
		|	КадроваяИсторияСотрудниковСрезПоследних.Подразделение.Наименование КАК ПодразделениеНаименование,
		|	КадроваяИсторияСотрудниковСрезПоследних.Подразделение КАК Подразделение,	
		|	КадроваяИсторияСотрудниковСрезПоследних.Должность КАК Должность
		|ПОМЕСТИТЬ Подразделения
		|ИЗ
		|	РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(
		|			&Дата,
		|			Сотрудник = &Сотрудник
		|				И ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)) КАК КадроваяИсторияСотрудниковСрезПоследних
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Подразделения.ПодразделениеКод КАК ПодразделениеКод,
		|	Подразделения.Подразделение КАК Подразделение,
		|	Подразделения.ПодразделениеНаименование КАК ПодразделениеНаименование,
		|	ДатаУвольнения.Увольнение КАК Увольнение,
		|	ДатаПриема.Прием КАК Прием,
		|	Подразделения.Должность КАК Должность
		|ИЗ
		|	ДатаПриема КАК ДатаПриема
		|		ЛЕВОЕ СОЕДИНЕНИЕ Подразделения КАК Подразделения
		|		ПО (ИСТИНА)
		|		ЛЕВОЕ СОЕДИНЕНИЕ ДатаУвольнения КАК ДатаУвольнения
		|		ПО (ИСТИНА)";
	Запрос.УстановитьПараметр("Дата", ТекущаяДата());
	Запрос.УстановитьПараметр("Сотрудник", ДанныеИБ.Ссылка);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		СтруктураСправочника.Вставить("ДатаПриема", Выборка.Прием);	
		СтруктураСправочника.Вставить("ДатаУвольнения", Выборка.Увольнение);	
		//СтруктураСправочника.Вставить("Подразделение", Выборка.Подразделение);
		//СтруктураСправочника.Вставить("ПодразделениеКод", Выборка.ПодразделениеКод);	
		//СтруктураСправочника.Вставить("ПодразделениеНаименование", Выборка.ПодразделениеНаименование);
		//СтруктураСправочника.Вставить("Должность", Выборка.Должность);
		ИмяПКО = "Справочник_Подразделения_Отправка";
		//СтруктураСправочника.Вставить("Подразделение", Новый Структура("Значение, ИмяПКО", Выборка.Подразделение, ИмяПКО));
		СтруктураСправочника.Вставить(Новый Структура("Подразделение, ИмяПКО", Выборка.Подразделение, ИмяПКО));
		//НовСтрока.ЗначениеСвойства = Новый Структура("Значение, ИмяПКО", СтрокаТЧ.Значение, ИмяПКО);
		ИмяПКО = "СправочникСсылкаДолжности";
		СтруктураСправочника.Вставить("Должность", Новый Структура("Значение, ИмяПКО", Выборка.Должность, ИмяПКО));
	Иначе
		СтруктураСправочника.Вставить("Подразделение", "");
		СтруктураСправочника.Вставить("Должность", "");
	КонецЕсли;	
	
	AdditionalInfoВставить(ДанныеXDTO, Имя, СтруктураСправочника);
Показать
Прикрепленные файлы:
Message_ЗК_УТ.xml
По теме из базы знаний
Найденные решения
4. NatalkaBal 28 05.09.18 13:05 Сейчас в теме
Так эта процедура AdditionalInfoВставить, думала точку потеряли)

Передавай индентификатор должности
ДанныеXDTO.Вставить("AdditionalInfo", Строка(Выборка.Должность.УникальныйИдентификатор()));

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

А потом ПриПолучении (ПриКонвертацииДанныхXDTO)
Если ДанныеXDTO.Свойство("AdditionalInfo") Тогда
ПолученныеДанные.Должность = ОбменДаннымиXDTOСервер.СсылкаОбъектаПоУИДОбъектаXDTO (ДанныеXDTO.AdditionalInfo,
Тип("СправочникСсылка.Должность"), КомпонентыОбмена);
КонецЕсли;

P.S сейчас сама делаю на подобие синхранизацию, переношу регистр сведений Кадровые данные из ЗУП в не типовой регистр Кадровые данные БУХ. И у меня не получилось в табличную часть вставить этот AdditionalInfo, в виде строки с индентификатором. В итоге вместо AdditionalInfo воспользовалась другим элементом объекта формата Справочник.ОтветственныеЛица ПредставлениеДокументаПраваПодписи (тип строка).
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. NatalkaBal 28 05.09.18 11:13 Сейчас в теме
(1)
AdditionalInfoВставить(ДанныеXDTO, Имя, СтруктураСправочника);

Может попробовать вот так:
ДанныеXDTO.Вставить("AdditionalInfo", Новый Структура("Значение, ИмяПКО", СтруктураСправочника, ИмяПКО));

СтруктураСправочника, ИмяПКО - это не точно, не могу понять какое значение ты хочешь передать через AdditionalInfo
3. xSev 05.09.18 12:29 Сейчас в теме
(2) увы, не помогло. Код процедуры: "AdditionalInfoВставить(ДанныеXDTO, Имя, СтруктураСправочника);".

Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo)=Тип("Структура") Тогда
    ДопДанные = ДанныеXDTO.AdditionalInfo;
Иначе
    ДопДанные = Новый Структура;
КонецЕсли;

ДопДанные.Вставить(Имя, ДопЗначение);
ДанныеXDTO.Вставить("AdditionalInfo", ДопДанные);


Переписал, на
	Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo)=Тип("Структура") Тогда
	    ДопДанные = ДанныеXDTO.AdditionalInfo;
	Иначе
	    ДопДанные = Новый Структура;
	КонецЕсли;

	ДанныеXDTO.Вставить("AdditionalInfo", ДопЗначение);

ничего не изменилось)

СтруктураСправочника, ИмяПКО - это не точно, не могу понять какое значение ты хочешь передать через AdditionalInfo

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

Я хочу передать элемент справочника "Должности", при конвертации справочника "Сотрудники". Не понимаю, как вручную заставить конвертировать этот элемент при выгрузке. Отдельно справочник должности то же переносится, но может же возникнуть ситуация, когда должности не будет в базе приёмнике и её просто не найдёт. Вот именно в такой ситуации мне и нужно, что бы при выгрузке был конвертирован.
Может я просто не понимаю принципов работы конвертации и сам выдумываю себе проблемы?
4. NatalkaBal 28 05.09.18 13:05 Сейчас в теме
Так эта процедура AdditionalInfoВставить, думала точку потеряли)

Передавай индентификатор должности
ДанныеXDTO.Вставить("AdditionalInfo", Строка(Выборка.Должность.УникальныйИдентификатор()));

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

А потом ПриПолучении (ПриКонвертацииДанныхXDTO)
Если ДанныеXDTO.Свойство("AdditionalInfo") Тогда
ПолученныеДанные.Должность = ОбменДаннымиXDTOСервер.СсылкаОбъектаПоУИДОбъектаXDTO (ДанныеXDTO.AdditionalInfo,
Тип("СправочникСсылка.Должность"), КомпонентыОбмена);
КонецЕсли;

P.S сейчас сама делаю на подобие синхранизацию, переношу регистр сведений Кадровые данные из ЗУП в не типовой регистр Кадровые данные БУХ. И у меня не получилось в табличную часть вставить этот AdditionalInfo, в виде строки с индентификатором. В итоге вместо AdditionalInfo воспользовалась другим элементом объекта формата Справочник.ОтветственныеЛица ПредставлениеДокументаПраваПодписи (тип строка).
5. xSev 24.09.18 07:57 Сейчас в теме
(4) И сейчас выяснилось, что это не всегда срабатывает =(
Если и должность и сотрудник новые, то не находит должность в базе приёмнике и подставляет "объект не найден", т.к. новая должность ещё не записана. После конвертации новая должность уже есть в базе, но в сотруднике всё ещё "объект не найден".
Такая же ситуация и с "Организацией" и с "Физ лицом", которые указываются в сотруднике.
Если новые организации и должности появляются редко, то вот физ лицо(вместе с сотрудником) почти всегда новые.

Пока вижу только один вариант - вести список сотрудников, у которых что-то не нашлось и после записи объектов в базу уже подставлять не найденное. Только в таком случае вопрос - а есть ли процедура, которая после записи объектов в базу отрабатывает? Обработчик "После конвертации" не подходит, т.к. ещё не выполнена отложенная запись объектов.(или её можно как-то отключить, что бы сразу, по мере конвертации записывало?)
6. NatalkaBal 28 24.09.18 08:37 Сейчас в теме
(5)Может попробовать Перед записью полученных данных Сотрудник
Если ДанныеИБ.Должность = Неопределено Тогда
   ПКОСвойство = ОбменДаннымиXDTOСервер.ПКОПоИмени(КомпонентыОбмена,"Справочник_Должности_Получение");
   ТекущиеСвойства = ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, 
   ПолученныеДанные.Должность, ПКОСвойство, "ПолучитьСсылку");
   Если ТекущиеСвойства.ПолучитьОбъект() = Неопределено Тогда
	ТекущиеСвойства = ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, 
        ПолученныеДанные.Должность, ПКОСвойство, "КонвертироватьИЗаписать");
   КонецЕсли;
КонецЕсли;
Показать


Попробуй использовать функции ОбменДаннымиXDTOСервер.ПКОПоИмени и ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ
8. xSev 26.09.18 12:27 Сейчас в теме
(6)
Если ДанныеИБ.Должность = Неопределено Тогда
ПКОСвойство = ОбменДаннымиXDTOСервер.ПКОПоИмени(КомпонентыОбмена,"Справочник_Должности_Получение");
ТекущиеСвойства = ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена,
ПолученныеДанные.Должность, ПКОСвойство, "ПолучитьСсылку");
Если ТекущиеСвойства.ПолучитьОбъект() = Неопределено Тогда
ТекущиеСвойства = ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена,
ПолученныеДанные.Должность, ПКОСвойство, "КонвертироватьИЗаписать");
КонецЕсли;
КонецЕсли;


ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ вторым параметром передаётся структура имитирующая структуру XDTO пакета, но вся проблема в том, что не откуда взять эту структуру - в xml файле обмена в самом справочнике хранится только уид должности. Вручную копаться в файле обмена не очень правильно, как я понимаю, да и не хочется.


(7)
(5) В КД3 обратите внимание на вкладку "После загрузки всех данных" Туда можно вставить алгоритм ОтложенноеЗаполнение_....
В алгоритме можно работать с данными уже загруженными в базу и дозаполнять текущий объект.
Можно попробовать сделать так ПолученныеДанные.ДополнительныеСвойства.Вставить("ВашиДанные", ДанныеXDTO.AdditionalInfo);
Потом в после загрузки попытаться получить эти данные
ВашиДанные = Объект.ДополнительныеСвойства.ВашиДанные;


Да, спасибо. В ней заполнял регистр сведений, только добавление в допсвойства не получилось - они после загрузки перезаписаны все. Копать в типовых правилах не стал уже.


В итоге сделал, что в скрытый текстовый реквизит передаются УИДы, по которым уже после загрузки ведётся поиск ссылок. Не нравится, что при такой реализации новый объект дважды будет записываться в базу, но хотя бы работает. С опытом может найду решение этой проблемы, благо объёмы не большие, так что не должно вызвать осложнений.
7. MaxS 2856 25.09.18 08:49 Сейчас в теме
(5) В КД3 обратите внимание на вкладку "После загрузки всех данных" Туда можно вставить алгоритм ОтложенноеЗаполнение_....
В алгоритме можно работать с данными уже загруженными в базу и дозаполнять текущий объект.
Можно попробовать сделать так ПолученныеДанные.ДополнительныеСвойства.Вставить("ВашиДанные", ДанныеXDTO.AdditionalInfo);
Потом в после загрузки попытаться получить эти данные
ВашиДанные = Объект.ДополнительныеСвойства.ВашиДанные;
Оставьте свое сообщение

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