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