Выгрузить свойство. Выгружает свойство объекта информационной базы в соответствии с правилами.
// Выгружает свойство объекта информационной базы в соответствии с правилами.
//
// Параметры:
// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
// ДанныеИБ - ЛюбаяСсылка - ссылка на выгружаемый объект информационной базы.
// ПолучательСвойства - Структура - Получатель данных типа Структура, в которой должно храниться значение выгруженного свойства.
// ПКС - СтрокаТаблицыЗначений - Строка таблицы правил конвертации свойств, в соответствии с которой
// выполняется преобразование.
// СтекВыгрузки - Массив - ссылки на выгружаемые объекты с учетом вложенности.
// ЭтапВыгрузки - Число - содержит информацию об этапе выгрузки
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ВыгрузитьПользователейИнформационнойБазы (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)