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