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

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

При разработке на платформе 1С:Предприятие нередко возникает задача программного удаления данных из регистров сведений. Начинающие разработчики часто сталкиваются с ошибками при работе с методом Удалить() или пытаются понять, почему код работает в обработке, но вызывает ошибку в окне отладки. Давайте разберем этот процесс подробно и выясним, как правильно управлять записями регистра.

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

Многие разработчики, пытаясь отладить код, вводят выражение Набор.Удалить(0) в окно «Вычисление выражений» (или Табло) в конфигураторе. В этот момент платформа выдает ошибку: «обращение к процедуре как к функции».

Важно понимать: окно отладки предназначено для вычисления значений (функций), возвращающих результат. Метод Удалить() является процедурой, он выполняет действие, но ничего не возвращает. Поэтому, если вы видите такую ошибку в отладчике, не пугайтесь — это не означает, что ваш код написан неверно. В основном модуле обработки или документа этот же код отработает корректно. Чтобы проверить результат удаления в отладчике, просто вызовите метод в модуле, а в отладчике проверяйте уже итоговое состояние объекта Набор.

Способ 1: Использование Набора записей

Для регистров сведений, подчиненных регистратору, основным инструментом работы является объект РегистрСведенийНаборЗаписей. Чтобы удалить конкретные записи, необходимо выполнить строгую последовательность действий:

  1. Создать набор записей с помощью метода СоздатьНаборЗаписей().
  2. Установить отбор по регистратору или ключевым полям, чтобы ограничить выборку.
  3. Прочитать данные из базы методом Прочитать().
  4. Удалить нужные строки из коллекции Набор.
  5. Записать изменения в базу данных методом Записать().

Пример кода для удаления записи:


Регистратор = Документы.ВзаимозачетЗадолженности.НайтиПоНомеру("ФР00-000098", '20191231');
Набор = РегистрыСведений.СуммыДокументовВВалютеРегл.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Регистратор);
Набор.Прочитать();
// Удаляем запись по индексу
Набор.Удалить(0); 
Если Набор.Модифицированность() Тогда
    Набор.Записать();
КонецЕсли;

Способ 2: Удаление всех записей по отбору (Очистка)

Если ваша задача — удалить все записи, связанные с определенным документом-регистратором, совсем не обязательно перебирать и удалять каждую строку по отдельности. Платформа 1С позволяет сделать это элегантно и быстро.

Поскольку Записать() работает в режиме замещения, достаточно просто установить отбор и вызвать этот метод без предварительного чтения:


Набор = РегистрыСведений.СуммыДокументовВВалютеРегл.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Регистратор);
// Метод Записать без параметров удалит все записи, соответствующие отбору
Набор.Записать(); 

Способ 3: Использование Менеджера записи для независимых регистров

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

Рассмотрим пример удаления записи в независимом регистре:


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

Советы по безопасной работе

Используя эти методы, вы сможете корректно управлять данными в регистрах сведений 1С, избегая ошибок и обеспечивая целостность учетной системы.

← На главную