Обновить наборы записей. Обновляет строки регистра с отбором по нескольким значениям для одного или
// Обновляет строки регистра с отбором по нескольким значениям для одного или
// для двух измерений регистра, выполняется проверка наличия изменений,
// если изменений нет, перезапись не производится.
//
// Параметры:
// Данные - Структура - со свойствами:
// * МенеджерРегистра - Менеджер регистра для создания типа <Регистр*>НаборЗаписей.
//
// * НовыеЗаписи - ТаблицаЗначений в формате регистра.
//
// * ПоляСравнения - Строка - содержит список полей по значениям которых требуется
// вычислять отличие записей набора, например, "Измерение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
///////////////////////////////////////////////////////////////////////////////////////////////////////
НаборЗаписейРегистраПустой (БСП)
ЭтоНезависимыйНаборЗаписей (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)