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