Как в пакете XDTO описать значение смешанного типа а также элементы и группы справочников?

1. newborn 15.03.23 14:50 Сейчас в теме
Самописная конфигурация. Делаем обмен на КД3. Пришлось делать дополнительный пакет XDTO. Многих вещей ещё не знаю.
Проблема:
1. Реквизит передаваемого объекта имеет смешанный тип.
2. В реквизите передаваемого объекта могут быть и группы и элементы справочников.
Как описывать эти вещи в пакете XDTO?
Найденные решения
3. newborn 27.03.23 09:30 Сейчас в теме
Ну, в общем, нормального решения не нашлось. Пришлось:
1. изменять XDTO пакет от БСП
2. в обработчике "ПриОтправке" (на стороне отправки) ставить такой код:
// ПолучателиСкидкиКонтрагенты
ПолучателиСкидкиКонтрагенты = Новый ТаблицаЗначений();
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("Получатель");
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("ЭтоГруппа");

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

3. В обработчике ПриКонвертацииДанныхXDTO (на стороне приёма) ставить такой код:
Если ДанныеXDTO.Свойство("ПолучателиСкидкиКонтрагенты") Тогда
	
	ПолучателиСкидкиКонтрагенты = Новый Массив();
	Для каждого ТекущаяСтрока Из ДанныеXDTO.ПолучателиСкидкиКонтрагенты Цикл
		
		СтрокаДанных = Новый Структура("Получатель");
		
		Если ТекущаяСтрока.ЭтоГруппа Тогда
			ИмяПКО = "Справочник_КонтрагентыГруппа_Получение";
		Иначе
			ИмяПКО = "Справочник_Контрагенты_Получение";		
		КонецЕсли;		
		
		СтрокаДанных.Получатель = Новый Структура("Значение,ИмяПКО", ТекущаяСтрока.Получатель, ИмяПКО);
		ПолучателиСкидкиКонтрагенты.Добавить(СтрокаДанных);
		
	КонецЦикла;
	ПолученныеДанные.ДополнительныеСвойства.Вставить("ПолучателиСкидкиКонтрагенты", ПолучателиСкидкиКонтрагенты);
	
КонецЕсли;
Показать


Согласен, возможно это не лучшее решение. Но другого не нашлось...
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. newborn 15.03.23 16:07 Сейчас в теме
3. newborn 27.03.23 09:30 Сейчас в теме
Ну, в общем, нормального решения не нашлось. Пришлось:
1. изменять XDTO пакет от БСП
2. в обработчике "ПриОтправке" (на стороне отправки) ставить такой код:
// ПолучателиСкидкиКонтрагенты
ПолучателиСкидкиКонтрагенты = Новый ТаблицаЗначений();
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("Получатель");
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("ЭтоГруппа");

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

3. В обработчике ПриКонвертацииДанныхXDTO (на стороне приёма) ставить такой код:
Если ДанныеXDTO.Свойство("ПолучателиСкидкиКонтрагенты") Тогда
	
	ПолучателиСкидкиКонтрагенты = Новый Массив();
	Для каждого ТекущаяСтрока Из ДанныеXDTO.ПолучателиСкидкиКонтрагенты Цикл
		
		СтрокаДанных = Новый Структура("Получатель");
		
		Если ТекущаяСтрока.ЭтоГруппа Тогда
			ИмяПКО = "Справочник_КонтрагентыГруппа_Получение";
		Иначе
			ИмяПКО = "Справочник_Контрагенты_Получение";		
		КонецЕсли;		
		
		СтрокаДанных.Получатель = Новый Структура("Значение,ИмяПКО", ТекущаяСтрока.Получатель, ИмяПКО);
		ПолучателиСкидкиКонтрагенты.Добавить(СтрокаДанных);
		
	КонецЦикла;
	ПолученныеДанные.ДополнительныеСвойства.Вставить("ПолучателиСкидкиКонтрагенты", ПолучателиСкидкиКонтрагенты);
	
КонецЕсли;
Показать


Согласен, возможно это не лучшее решение. Но другого не нашлось...
Оставьте свое сообщение

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