Есть непериодический регистр с Измерением: "Дата" - тип "Дата", Ресурсом: "ФлагРасчета" - тип "Булево".
ФлагРасчета на каждую дату по умолчанию заполняется = 1. Если нужен 0 - проставляется вручную.
По необходимости, нужно в этом регистре обновить данные за выбранный год, проставить по умолчанию на все дни - ФлагРасчета = 1. Или заполнить год, которого ещё нет.
Пришел к выводу что нужна процедура, которая принимает параметр "Год" и у которой есть параметр ФлагПерезаписи. Если установлен - перезаполняет год. Если нет - просто добавляет записи по году.
Пока получилось вот так сделать:
Если ФлагПерезаписи = Истина Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Дата
| ИЗ
| РегистрСведений.УЗ_Календарь
| ГДЕ
| ГОД(Дата) = &Год";
Запрос.УстановитьПараметр("Год", Год);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Дата.Установить(Выборка.Дата);
НаборЗаписей.Отбор.Дата.Использование = Истина;
НаборЗаписей.Записать(Истина);
КонецЦикла;
КонецЕсли;
ДатаЗаписи = Дата(Год,1,1);
НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Пока Год(ДатаЗаписи) = Год Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Дата = ДатаЗаписи;
НоваяЗапись.ФлагРасчета = Истина;
ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
КонецЦикла;
НаборЗаписей.Записать(Истина);
Элементы.Список.Обновить();
Смущает:
1. Что нужно сначала прочитать данные и потом их перебрать сравнивая даты - что бы удалить данные за перезаписываемый год.
2. Нужно считать все записи регистра, что бы добавить новые записи.
Как вариант, не заморачиваясь с флагом перерасчета, сделал такое, т.к. фактически пустой год "перезаписываем" данными:
ДатаЗаписи = Дата(Год,1,1);
НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();
Пока Год(ДатаЗаписи) = Год Цикл
НаборЗаписей.Отбор.Дата.Установить(ДатаЗаписи);
НаборЗаписей.Отбор.Дата.Использование = Истина;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() Тогда
НаборЗаписей[0].ФлагРасчета = Истина;
Иначе
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Дата = ДатаЗаписи;
НоваяЗапись.ФлагРасчета = Истина;
КонецЕсли;
НаборЗаписей.Записать(Истина);
НаборЗаписей.Отбор.Сбросить();
ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
КонецЦикла;
Элементы.Список.Обновить();
Здесь все равно смущает, что я не "пакетно" делаю запись, а каждый раз отправляю запрос на запись.
Вопрос:
Как правильней решить данную задачу?