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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке обработок для обслуживания базы данных 1С часто возникает задача массового удаления записей из регистра сведений. Многие начинающие разработчики сталкиваются с ошибками при попытке программного удаления, наиболее частая из которых — «Недостаточно фактических параметров». Давайте разберем, как правильно работать с объектами РегистрСведенийНаборЗаписей и РегистрСведенийМенеджерЗаписи, чтобы выполнять очистку данных безопасно и эффективно.

Почему возникает ошибка «Недостаточно фактических параметров»?

Ошибка чаще всего связана с неверным использованием объекта СоздатьНаборЗаписей или отсутствием обязательных отборов. Когда вы создаете набор записей, система ожидает, что вы определите, какие именно данные подлежат обработке. Если не установить отбор по ключевым измерениям, при выполнении метода Записать() платформа может интерпретировать это как требование очистить весь регистр целиком, либо выдать ошибку из-за нарушения логики доступа к данным.

Решение 1: Использование объекта НаборЗаписей (рекомендуемый способ)

НаборЗаписей — это идеальный инструмент для массового удаления. Логика работы с ним строится на установке фильтра (отбора) и последующей записи «пустого» состояния набора.

Рассмотрим пошагово, как реализовать этот процесс в коде:

  1. Создаем экземпляр набора записей регистра.
  2. Устанавливаем отбор по измерениям, чтобы ограничить область удаления.
  3. Вызываем метод Записать(). Если набор пуст, платформа удаляет все записи, соответствующие установленному отбору.

Посмотрим на пример реализации:


// Предположим, у нас есть выборка записей для удаления
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Создаем набор записей
    НаборЗаписей = РегистрыСведений.РеестрДокументов.СоздатьНаборЗаписей();
    
    // Обязательно устанавливаем отбор по измерению!
    // Без этого мы можем удалить лишние данные
    НаборЗаписей.Отбор.Партнер.Установить(ВыборкаДетальныеЗаписи.Партнер);
    
    // Метод Записать() при пустом наборе удалит записи по заданному отбору
    НаборЗаписей.Записать(); 
КонецЦикла;

Важное замечание: Метод Очистить() вызывать не обязательно, так как объект СоздатьНаборЗаписей() изначально создается пустым. Однако, если вы хотите сделать код более читаемым и явным, можно оставить НаборЗаписей.Очистить(), вреда от этого не будет.

Решение 2: Использование МенеджераЗаписи

Если вам нужно удалить всего одну, строго определенную запись, можно воспользоваться объектом РегистрСведенийМенеджерЗаписи. Этот способ лучше подходит для точечного удаления конкретного элемента.


Запись = РегистрыСведений.РеестрДокументов.СоздатьМенеджерЗаписи();
// Заполняем ключевые поля, которые идентифицируют запись
Запись.Партнер = ВыборкаДетальныеЗаписи.Партнер;
// Если регистр периодический, не забудьте указать период!
Запись.Период = ВыборкаДетальныеЗаписи.Период; 
// Вызываем метод удаления
Запись.Удалить();

Ключевые рекомендации по работе с регистрами

Для того чтобы ваша разработка была надежной и не вызывала проблем при эксплуатации базы данных, примите к сведению следующие советы:

Таким образом, для большинства задач по очистке данных в регистрах сведений лучше всего использовать НаборЗаписей с предварительно установленным отбором. Это стандартный подход платформы 1С:Предприятие, который обеспечивает корректную обработку данных и минимизирует вероятность возникновения ошибок.

← На главную