ОбновитьНаборыЗаписей (БСП)

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

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

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

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

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

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

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

ВсеНаборыЗаписей (БСП)

ЗаписатьНаборЗаписей (БСП)

ЭтоНаборЗаписей (БСП)

НаборЗаписейРегистраПустой (БСП)

ЭтоНезависимыйНаборЗаписей (БСП)

ПолучитьПорциюДанныхНезависимогоНабораЗаписей (БСП)

ОбновитьНаборыЗначенийДоступа (БСП)

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