ОбновитьРегистрСведений (БСП)

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

Обновить регистр сведений. Обновляет регистр сведений по данным в таблице значений ИзмененияСтрок.

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

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

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

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

ОбновитьЗаписьВРегистрСведений (БСП)

ОбновитьНастройкиРаботыСКлассификаторами (БСП)

Создать запись в регистре сведений

ОбновитьНастройкиРаботыСКлассификаторамиОбластейДанных (БСП)

ОбновитьСостояниеОчередиИзвлеченияТекста (БСП)

Получение данных из регистра сведений не запросом

Запись в регистр сведений (периодический, независимый)

ЭтоРегистрСведений (БСП)

1С Менеджер конфигураций