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

Есть непериодический регистр сведений с измерением "Дата" (тип Дата) и ресурсом "ФлагРасчета" (тип Булево). По умолчанию для каждой даты ФлагРасчета = 1; при необходимости для отдельных дат вручную ставят 0.
  • 18 мая 2026 г. 5:01
Ответы на вопрос 2
Ниже — простой и надёжный шаблон на встроенном языке 1С для работы с непериодическим регистром сведений: добавление/обновление записи по дате и удаление записи по дате.

Общее замечание:
- В непериодическом регистре измерение "Дата" обычно хранит дату+время. Чтобы гарантированно совпадение по дате, рекомендуется использовать НачалоДня(Дата).
- Перед вставкой всегда лучше проверить, есть ли уже запись для этой даты — чтобы не иметь дубликатов (или, наоборот, обновить существующую запись).
- После изменений нужно вызвать НаборЗаписей.Записать().

Замените MyRegister на фактическое имя вашего регистра сведений.

Пример: установка (добавление или обновление) флага:

Процедура УстановитьФлагПоДате(ДатаЗначение, ЗначениеФлага)
    // приводим дату к началу дня, чтобы избежать несовпадения по времени
    Если ТипЗнч(ДатаЗначение) = Тип("Дата") Тогда
        ДатаЗначение = НачалоДня(ДатаЗначение);
    КонецЕсли;

    // создаём набор записей регистра
    Набор = РегистрыСведений.MyRegister.СоздатьНаборЗаписей();
    // ставим отбор по дате
    Набор.Отбор.Дата.Установить(ДатаЗначение);
    Набор.Прочитать();

    Выборка = Набор.Выбрать();
    Если Выборка.Следующий() Тогда
        // обновляем все найденные строки (обычно одна)
        Повтор
            Выборка.ФлагРасчета = ЗначениеФлага;
        Пока Выборка.Следующий();
    Иначе
        // записи для этой даты нет — добавляем
        НоваяСтрока = Набор.Добавить();
        НоваяСтрока.Дата = ДатаЗначение;
        НоваяСтрока.ФлагРасчета = ЗначениеФлага;
    КонецЕсли;

    // сохраняем изменения
    Набор.Записать();
КонецПроцедуры

Пример: удаление записи для даты (возвращает поведение по умолчанию — то есть удаляет явную запись со значением 0):

Процедура УдалитьЗаписьПоДате(ДатаЗначение)
    Если ТипЗнч(ДатаЗначение) = Тип("Дата") Тогда
        ДатаЗначение = НачалоДня(ДатаЗначение);
    КонецЕсли;

    Набор = РегистрыСведений.MyRegister.СоздатьНаборЗаписей();
    Набор.Отбор.Дата.Установить(ДатаЗначение);
    Набор.Прочитать();

    Выборка = Набор.Выбрать();
    Пока Выборка.Следующий() Цикл
        // удаляет текущую строку набора
        Выборка.Удалить();
    КонецЦикла;

    Набор.Записать();
КонецПроцедуры

Дополнительные советы:
- Если у вас в регистре могут быть несколько строк для одной даты (что нежелательно), в процедуре УстановитьФлагПоДате можно сначала удалить все существующие и добавить одну запись с нужным флагом.
- Если нужно массово менять значения на диапазоне дат — ставьте отбор диапазоном и проходите выборку.
- В обработках, где важна атомарность, используйте механизмы блокировок/транзакций (если требуется логика многооператорной записи).

Если напишите точное имя регистра (и желаемое поведение при наличии нескольких строк) — подгоню пример под ваш конкретный регистр и дам вариант "удалить все строки для даты и добавить одну", если это нужно.
Нашел у метода Записать НабораЗаписей РежимЗамещения. <br/> <pre><code>ДатаЗаписи = Дата(Год,1,1);
	Данные = Новый ТаблицаЗначений;
	Данные.Колонки.Добавить("Дата");
	Данные.Колонки.Добавить("ФлагРасчета");
	
	Пока Год(ДатаЗаписи) = Год Цикл              
		Запись = Данные.Добавить();
		Запись.Дата = ДатаЗаписи;
		Запись.ФлагРасчета = Истина;
		ДатаЗаписи = ДатаЗаписи + 86400; // прибавляем день в секундах
	КонецЦикла;	

	НаборЗаписей = РегистрыСведений.УЗ_Календарь.СоздатьНаборЗаписей();   	
	НаборЗаписей.Загрузить(Данные);
	НаборЗаписей.Записать(РежимЗамещения.Слияние);</code></pre> <br/> <br/> В принципе этот вариант устраивает. Пачкой данные закидываем. Если по "ключевому полю", в данном случае Измерению "Дата" данные есть - перезаписывает, если нет - добавляет. Надеюсь под капотом один запрос к БД.
Похожие вопросы