ЗаписатьСвойстваУОбъекта (БСП)

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

Записать свойства объекта. Записывает дополнительные реквизиты и сведения владельцу свойств.

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

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

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

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

СвойстваОбъектаМетаданных (БСП)

ПроверитьСвойствоУОбъекта (БСП)

ЗаписатьНастройкуВерсионированияПоОбъекту (БСП)

ЗаписатьВерсиюОбъекта (БСП)

ЗаписатьОбъектВФайл (БСП)

ЗаписатьОбъектВПоток (БСП)

ЗаписатьОбъектВИБ (БСП)

ЗаписатьОбъект (БСП)

ЗаписатьСтруктурныйОбъектXDTOВСтроку (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом