Задать вопрос
@ITF

1С: Как удалять и добавлять записи непериодического регистра программно?

Есть непериодический регистр с Измерением: "Дата" - тип "Дата", Ресурсом: "ФлагРасчета" - тип "Булево".
ФлагРасчета на каждую дату по умолчанию заполняется = 1. Если нужен 0 - проставляется вручную.
По необходимости, нужно в этом регистре обновить данные за выбранный год, проставить по умолчанию на все дни - ФлагРасчета = 1. Или заполнить год, которого ещё нет.

Пришел к выводу что нужна процедура, которая принимает параметр "Год" и у которой есть параметр ФлагПерезаписи. Если установлен - перезаполняет год. Если нет - просто добавляет записи по году.

Пока получилось вот так сделать:
Если ФлагПерезаписи = Истина Тогда   
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ Дата
		| ИЗ
		| РегистрСведений.УЗ_Календарь
		| ГДЕ
		| ГОД(Дата) = &Год";
		Запрос.УстановитьПараметр("Год", Год);
		Выборка = Запрос.Выполнить().Выбрать();
		
		Пока Выборка.Следующий() Цикл
			НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();	
			НаборЗаписей.Отбор.Дата.Установить(Выборка.Дата);
			НаборЗаписей.Отбор.Дата.Использование = Истина;	
			НаборЗаписей.Записать(Истина);
		КонецЦикла;

	КонецЕсли;
	
	ДатаЗаписи = Дата(Год,1,1);
	НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();   
	НаборЗаписей.Прочитать();
	Пока Год(ДатаЗаписи) = Год Цикл    
		НоваяЗапись = НаборЗаписей.Добавить();
		НоваяЗапись.Дата = ДатаЗаписи;
		НоваяЗапись.ФлагРасчета = Истина;
		ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
	КонецЦикла;	
	НаборЗаписей.Записать(Истина);
	
	Элементы.Список.Обновить();


Смущает:
1. Что нужно сначала прочитать данные и потом их перебрать сравнивая даты - что бы удалить данные за перезаписываемый год.
2. Нужно считать все записи регистра, что бы добавить новые записи.

Как вариант, не заморачиваясь с флагом перерасчета, сделал такое, т.к. фактически пустой год "перезаписываем" данными:
ДатаЗаписи = Дата(Год,1,1);
	НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();   
	Пока Год(ДатаЗаписи) = Год Цикл    
		НаборЗаписей.Отбор.Дата.Установить(ДатаЗаписи);
		НаборЗаписей.Отбор.Дата.Использование = Истина;	
		НаборЗаписей.Прочитать();
		Если НаборЗаписей.Количество() Тогда 
			НаборЗаписей[0].ФлагРасчета = Истина;
		Иначе
			НоваяЗапись = НаборЗаписей.Добавить();  
			НоваяЗапись.Дата = ДатаЗаписи;
			НоваяЗапись.ФлагРасчета = Истина;			
		КонецЕсли;
			НаборЗаписей.Записать(Истина);
		НаборЗаписей.Отбор.Сбросить();
		ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
	КонецЦикла;	
	
	Элементы.Список.Обновить();


Здесь все равно смущает, что я не "пакетно" делаю запись, а каждый раз отправляю запрос на запись.

Вопрос:
Как правильней решить данную задачу?
  • Вопрос задан
  • 21 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    ПБУ 18/02 "Учет расчетов по налогу на прибыль"
    1 неделя
    Далее
  • Академия Эдюсон
    1С: Бухгалтерия 8.3
    2 месяца
    Далее
  • Учебный центр МГУТУ
    Бухгалтерский и налоговый учет. Кадровое делопроизводство. 1С
    3 месяца
    Далее
Решения вопроса 1
@ITF Автор вопроса
Нашел у метода Записать НабораЗаписей РежимЗамещения.
ДатаЗаписи = Дата(Год,1,1);
	Данные = Новый ТаблицаЗначений;
	Данные.Колонки.Добавить("Дата");
	Данные.Колонки.Добавить("ФлагРасчета");
	
	Пока Год(ДатаЗаписи) = Год Цикл              
		Запись = Данные.Добавить();
		Запись.Дата = ДатаЗаписи;
		Запись.ФлагРасчета = Истина;
		ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
	КонецЦикла;	

	НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();   	
	НаборЗаписей.Загрузить(Данные);
	НаборЗаписей.Записать(РежимЗамещения.Слияние);


В принципе этот вариант устраивает. Пачкой данные закидываем. Если по "ключевому полю", в данном случае Измерению "Дата" данные есть - перезаписывает, если нет - добавляет. Надеюсь под капотом один запрос к БД.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы