1С 8.3 Переместить соответствие в объект - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Переместить соответствие в объект

Данные > Примеры кода 1С > 1С 8.3 Соответствие
Функция, выполняющая перемещение соответствия в объект. Есть также обратная функция - см.ссылку в шапке.
Конвертация соответствия в объект в 1С 8.3 от avаlаkh:
Функция ПолучитьОбъектИзСоответствия(входСоотв) Экспорт

   // Функция ПроверкаНаЗначениеПростогоТипа: https://koder.by/proverka_na_znachenie_prostogo_tipa.php

   ПолнИмяОбъекта = входСоотв["ИмяМетаданныеОбъекта"];
   УникальныйИдентификатор = Новый УникальныйИдентификатор(входСоотв["УникальныйИдентификатор"]);

   Если СтрНайти(ПолнИмяОбъекта,"Справочник") Тогда

       ИмяДляСоздания = ПолучитьИмяСправочникаРасширения(СтрЗаменить(ПолнИмяОбъекта,"Справочник.",""));
       СсылкаНаОбъект = Справочники[ИмяДляСоздания].ПолучитьСсылку(УникальныйИдентификатор);
       Если ЗначениеЗаполнено(СсылкаНаОбъект) И СсылкаНаОбъект.ПолучитьОбъект()=Неопределено Тогда
           Объект = Справочники[ИмяДляСоздания].СоздатьЭлемент();
           Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
       ИначеЕсли ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
           Объект = СсылкаНаОбъект.ПолучитьОбъект();
       Иначе
           Возврат "";
       КонецЕсли;
   ИначеЕсли СтрНайти(ПолнИмяОбъекта,"Документ") Тогда

       ИмяДляСоздания = СтрЗаменить(ПолнИмяОбъекта,"Документ.","");
       СсылкаНаОбъект = Документы[ИмяДляСоздания].ПолучитьСсылку(УникальныйИдентификатор);
       Если СсылкаНаОбъект.ПолучитьОбъект()=Неопределено Тогда
           Объект = Документы[ИмяДляСоздания].СоздатьДокумент();
           Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
       Иначе
           Объект = СсылкаНаОбъект.ПолучитьОбъект();
       КонецЕсли;
   КонецЕсли;

   Для Каждого стрРеквизит Из Объект.Метаданные().СтандартныеРеквизиты Цикл
       Если ЗначениеЗаполнено(входСоотв[стрРеквизит.Имя])
           И стрРеквизит.Имя<>"Предопределенный" И стрРеквизит.Имя<>"Ссылка" Тогда
           Объект[стрРеквизит.Имя] = входСоотв[стрРеквизит.Имя];
       КонецЕсли;
   КонецЦикла;

   Для Каждого ЭлементСоотв Из входСоотв Цикл

       Если Объект.Метаданные().Реквизиты.Найти(ЭлементСоотв.Ключ)<>Неопределено Тогда
           Если ТипЗнч(ЭлементСоотв.Значение) = Тип("Соответствие") И ЗначениеЗаполнено(ЭлементСоотв.Значение.Получить("ИмяМетаданныеОбъекта")) Тогда
               ЗначЭлемСоотв = ПолучитьОбъектИзСоответствия(ЭлементСоотв.Значение);
           ИначеЕсли ТипЗнч(ЭлементСоотв.Значение) = Тип("Строка") И СтрНайти(ЭлементСоотв.Значение,"^")<>0 Тогда
               МассивВхСтроки = СтрРазделить(ЭлементСоотв.Значение,"^");
               ПолнИмяОбъекта = МассивВхСтроки[0];
               УникальныйИдентификатор = Новый УникальныйИдентификатор(МассивВхСтроки[1]);
               ИмяДляСоздания = ПолучитьИмяСправочникаРасширения(СтрЗаменить(ПолнИмяОбъекта,"Справочник.",""));
               ЗначЭлемСоотв = Справочники[ИмяДляСоздания].ПолучитьСсылку(УникальныйИдентификатор);
           Иначе
               ЗначЭлемСоотв = ЭлементСоотв.Значение
           КонецЕсли;
           Объект[ЭлементСоотв.Ключ] = ЗначЭлемСоотв;
       ИначеЕсли Объект.Метаданные().ТабличныеЧасти.Найти(ЭлементСоотв.Ключ)<>Неопределено Тогда
           ТекТабЧасть = ЭлементСоотв.Значение;
           Объект[ЭлементСоотв.Ключ].Очистить();

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

       КонецЕсли;

   КонецЦикла;

   Объект.Записать();
   Возврат Объект.Ссылка;

КонецФункции
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 15.11.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому