ВыгрузитьСвойство (БСП)

Автор: 1С
ОбщийМодуль.ОбменДаннымиXDTOСервер
БСП

Выгрузить свойство. Выгружает свойство объекта информационной базы в соответствии с правилами.

// Выгружает свойство объекта информационной базы в соответствии с правилами.
//
// Параметры:
//  КомпонентыОбмена   - Структура - содержит все правила и параметры обмена.
//  ДанныеИБ           - ЛюбаяСсылка - ссылка на выгружаемый объект информационной базы.
//  ПолучательСвойства - Структура - Получатель данных типа Структура, в которой должно храниться значение выгруженного свойства.
//  ПКС                - СтрокаТаблицыЗначений - Строка таблицы правил конвертации свойств, в соответствии с которой
//                                               выполняется преобразование.
//  СтекВыгрузки       - Массив - ссылки на выгружаемые объекты с учетом вложенности.
//  ЭтапВыгрузки       - Число - содержит информацию об этапе выгрузки
//     1 - выгрузка до выполнения алгоритма ПриОтправкеДанных, 
//     2 - выгрузка после выполнения алгоритма ПриОтправкеДанных.
//
Процедура ВыгрузитьСвойство(КомпонентыОбмена, ДанныеИБ, ПолучательСвойства, ПКС, СтекВыгрузки, ЭтапВыгрузки = 1) Экспорт
	// Свойство формата не указано - данное ПКС используется только при загрузке.
	Если СокрЛП(ПКС.СвойствоФормата) = "" Тогда
		Возврат;
	КонецЕсли;
	
	СвойствоФормата_Имя = СокрЛП(ПКС.СвойствоФормата);
	ВложенныеСвойства = СтрРазделить(СвойствоФормата_Имя,".",Ложь);
	// Указано полное имя свойства, входящего в группу общих свойств.
	УказаноПолноеИмяСвойства = Ложь;
	Если ВложенныеСвойства.Количество() > 1 Тогда
		УказаноПолноеИмяСвойства = Истина;
		СвойствоФормата_Имя = ВложенныеСвойства[ВложенныеСвойства.Количество()-1];
	КонецЕсли;
	
	ЗначениеСвойства = Неопределено;
	Если ЭтапВыгрузки = 1 Тогда
		Если ЗначениеЗаполнено(ПКС.СвойствоКонфигурации) Тогда
			ЗначениеСвойства = ДанныеИБ[ПКС.СвойствоКонфигурации];
		ИначеЕсли ТипЗнч(ДанныеИБ) = Тип("Структура") Тогда
			// Это ПКС из ПКО с источником-структурой
			Если УказаноПолноеИмяСвойства Тогда
				ПолучитьЗначениеВложенныхСвойств(ДанныеИБ, ВложенныеСвойства, ЗначениеСвойства);
			Иначе
				ДанныеИБ.Свойство(СвойствоФормата_Имя, ЗначениеСвойства);
			КонецЕсли;
			Если ЗначениеСвойства = Неопределено Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	Иначе
		
		Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда
			КолонкиТЧ = ПолучательСвойства.Владелец().Колонки;
			УровеньМаксимальный = ВложенныеСвойства.Количество() - 1;
			Если УказаноПолноеИмяСвойства Тогда
				Для Уровень = 0 По УровеньМаксимальный Цикл
					ИмяКолонки = ВложенныеСвойства[Уровень];
					Если КолонкиТЧ.Найти(ИмяКолонки) = Неопределено Тогда
						Продолжить;
					КонецЕсли;
					ЗначениеВКолонке = ПолучательСвойства[ИмяКолонки];
					Если Уровень = УровеньМаксимальный Тогда
						ЗначениеСвойства = ЗначениеВКолонке;
					ИначеЕсли ТипЗнч(ЗначениеВКолонке) = Тип("Структура") Тогда
						// Значение вложенного свойства упаковано в структуру, которая может быть многоуровневой.
						ИсточникВложенногоСвойства = ЗначениеВКолонке;
						ЗначениеВложенногоСвойства = Неопределено;
						Для УровеньПодчиненный = Уровень + 1 По УровеньМаксимальный Цикл
							ИмяВложенногоСвойства = ВложенныеСвойства[УровеньПодчиненный];
							Если НЕ ИсточникВложенногоСвойства.Свойство(ИмяВложенногоСвойства, ЗначениеВложенногоСвойства) Тогда
								Продолжить;
							КонецЕсли;
							Если УровеньПодчиненный = УровеньМаксимальный Тогда
								ЗначениеСвойства = ЗначениеВложенногоСвойства;
							ИначеЕсли ТипЗнч(ЗначениеВложенногоСвойства) = Тип("Структура") Тогда
								ИсточникВложенногоСвойства = ЗначениеВложенногоСвойства;
								ЗначениеВложенногоСвойства = Неопределено;
							Иначе
								Прервать;
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
				КонецЦикла;
			Иначе
				Если КолонкиТЧ.Найти(СвойствоФормата_Имя) = Неопределено Тогда
					Возврат;
				Иначе
					ЗначениеСвойства = ПолучательСвойства[СвойствоФормата_Имя];
				КонецЕсли;
			КонецЕсли;
		Иначе
			Если УказаноПолноеИмяСвойства Тогда
				ПолучитьЗначениеВложенныхСвойств(ДанныеИБ, ВложенныеСвойства, ЗначениеСвойства);
			Иначе
				ПолучательСвойства.Свойство(СвойствоФормата_Имя, ЗначениеСвойства);
			КонецЕсли;
			Если ЗначениеСвойства = Неопределено
				И Не (СтекВыгрузки.Количество() = 1 И ПолучательСвойства.КлючевыеСвойства.Свойство(СвойствоФормата_Имя, ЗначениеСвойства)) Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
		
	ПравилоКонвертацииСвойства = ПКС.ПравилоКонвертацииСвойства;
	
	// Значение может быть в формате инструкции.
	Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда
		Если ЗначениеСвойства.Свойство("ИмяПКО") Тогда
			ПравилоКонвертацииСвойства = ЗначениеСвойства.ИмяПКО;
		КонецЕсли;
		Если ЗначениеСвойства.Свойство("Значение") Тогда
			ЗначениеСвойства = ЗначениеСвойства.Значение;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
	
		Если СокрЛП(ПравилоКонвертацииСвойства) <> "" Тогда
			
			ПКПД = КомпонентыОбмена.ПравилаКонвертацииПредопределенныхДанных.Найти(ПравилоКонвертацииСвойства, "ИмяПКПД");
			Если ПКПД <> Неопределено Тогда
				ЗначениеСвойства = ПКПД.КонвертацииЗначенийПриОтправке.Получить(ЗначениеСвойства);
			Иначе
			
				ПравилоКонвертации = ПКОПоИмени(КомпонентыОбмена, ПравилоКонвертацииСвойства);
				
				ОтветвлениеСтекаВыгрузки = Новый Массив;
				Для Каждого Элемент Из СтекВыгрузки Цикл
					ОтветвлениеСтекаВыгрузки.Добавить(Элемент);
				КонецЦикла;
				
				ЗначениеСвойства = ДанныеXDTOИзДанныхИБ(
					КомпонентыОбмена,
					ЗначениеСвойства,
					ПравилоКонвертации,
					ОтветвлениеСтекаВыгрузки);
					
			КонецЕсли;
			
		КонецЕсли;
		
	Иначе
		ЗначениеСвойства = Неопределено;
	КонецЕсли;
	
	Если СтекВыгрузки.Количество() = 1 И ПКС.ОбработкаКлючевогоСвойства Тогда
		Если Не ПолучательСвойства.Свойство("КлючевыеСвойства") Тогда
			ПолучательСвойства.Вставить("КлючевыеСвойства", Новый Структура);
		КонецЕсли;
		ПолучательСвойства.КлючевыеСвойства.Вставить(СвойствоФормата_Имя, ЗначениеСвойства);
	Иначе
		Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда
			Если УказаноПолноеИмяСвойства Тогда
				ПоместитьЗначениеВложенныхСвойств(ПолучательСвойства, ВложенныеСвойства, ЗначениеСвойства, Истина);
			Иначе
				ПолучательСвойства[СвойствоФормата_Имя] = ЗначениеСвойства;
			КонецЕсли;
		Иначе
			Если УказаноПолноеИмяСвойства Тогда
				ПоместитьЗначениеВложенныхСвойств(ПолучательСвойства, ВложенныеСвойства, ЗначениеСвойства, Ложь);
			Иначе
				ПолучательСвойства.Вставить(СвойствоФормата_Имя, ЗначениеСвойства);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ВыгрузитьЧастьФайла (БСП)

ВыгрузитьПользователейИнформационнойБазы (БСП)

ВыгрузитьДанныеВКаталог (БСП)

ВыгрузитьФайл (БСП)

Выгрузить различные из поля коллекции

ВыгрузитьДанныеВАрхив (БСП)

ВыгрузитьВсеСобытияЖурналаРегистрации (БСП)

TurboConf 6 - расширение Конфигуратора 1С