Записать свойства объекта. Записывает дополнительные реквизиты и сведения владельцу свойств.
// Записывает дополнительные реквизиты и сведения владельцу свойств.
// Изменения происходят в транзакции.
//
// Параметры:
// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.
// ТаблицаСвойствИЗначений - ТаблицаЗначений - с колонками:
// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
// * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
//
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
ТаблицаДопРеквизитов.Колонки.Добавить("ТекстоваяСтрока");
ТаблицаДопСведений = ТаблицаДопРеквизитов.СкопироватьКолонки();
Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойствИЗначений Цикл
Если СтрокаТаблицыСвойств.Свойство.ЭтоДополнительноеСведение Тогда
НоваяСтрока = ТаблицаДопСведений.Добавить();
Иначе
НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
Если ТипЗнч(СтрокаТаблицыСвойств.Значение) = Тип("Строка")
И СтрДлина(СтрокаТаблицыСвойств.Значение) > 1024 Тогда
НоваяСтрока.ТекстоваяСтрока = СтрокаТаблицыСвойств.Значение;
КонецЕсли;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицыСвойств, "Свойство,Значение");
КонецЦикла;
ЕстьДопРеквизиты = ТаблицаДопРеквизитов.Количество() > 0;
ЕстьДопСведения = ТаблицаДопСведений.Количество() > 0;
МассивСвойств = СвойстваОбъекта(ВладелецСвойств);
МассивДопРеквизитов = Новый Массив;
МассивДопСведений = Новый Массив;
Для Каждого ДопСвойство Из МассивСвойств Цикл
Если ДопСвойство.ЭтоДополнительноеСведение Тогда
МассивДопСведений.Добавить(ДопСвойство);
Иначе
МассивДопРеквизитов.Добавить(ДопСвойство);
КонецЕсли;
КонецЦикла;
НачатьТранзакцию();
Попытка
Если ЕстьДопРеквизиты Тогда
ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл
Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда
Продолжить;
КонецЕсли;
МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство));
Если МассивСтрок.Количество() Тогда
СтрокаСвойства = МассивСтрок[0];
Иначе
СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение,ТекстоваяСтрока");
КонецЦикла;
ВладелецСвойствОбъект.Записать();
КонецЕсли;
Если ЕстьДопСведения Тогда
Для Каждого ДопСведение Из ТаблицаДопСведений Цикл
Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда
Продолжить;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ВладелецСвойств;
МенеджерЗаписи.Свойство = ДопСведение.Свойство;
МенеджерЗаписи.Значение = ДопСведение.Значение;
МенеджерЗаписи.Записать(Истина);
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
СвойстваОбъектаМетаданных (БСП)
ПроверитьСвойствоУОбъекта (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)