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

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

При разработке механизмов автоматизации в 1С, часто возникает необходимость программно удалить определенные записи из РегистрБухгалтерии, например, при корректировке данных документа или очистке проводок по конкретному контрагенту. Однако, при работе с НаборЗаписей многие разработчики сталкиваются с ошибкой «Недопустимое значение параметра (параметр номер '1')». Давайте разберем, почему она возникает и как правильно организовать процесс удаления.

Разбор типичной ошибки

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

Попытка передать числовой индекс вместо ссылки на объект приводит к сбою. Также стоит помнить, что удаление элементов коллекции прямо во время обхода этой же коллекции циклом Для каждого может привести к нарушению логики обхода и ошибкам доступа. Поэтому мы будем использовать более надежный и профессиональный подход.

Алгоритм безопасного удаления записей

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

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

Пример правильной реализации

Посмотрим, как выглядит оптимизированный и корректный код для выполнения этой задачи. В данном примере мы отбираем все записи, где субконто «Контрагенты» совпадает с выбранным пользователем значением.


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

// Создаем массив для хранения ссылок на записи, подлежащие удалению
МассивКУдалению = Новый Массив;

// Собираем нужные записи
Для каждого Запись из НаборЗаписей Цикл
    Если Запись.СубконтоДт.Контрагенты = НужныйКонтрагент Тогда
        МассивКУдалению.Добавить(Запись);
    КонецЕсли;
КонецЦикла;

// Удаляем собранные записи из набора
Для каждого ЗаписьКУдалению из МассивКУдалению Цикл
    НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;

// Сохраняем изменения в базе
НаборЗаписей.Записать();

Почему этот метод эффективен?

Во-первых, использование промежуточного массива исключает ошибки при изменении состава коллекции во время цикла. Во-вторых, метод НаборЗаписей.Удалить(Запись) работает именно так, как ожидает платформа 1С — он находит переданную ссылку внутри коллекции записей и исключает её. В-третьих, выполнение НаборЗаписей.Записать() гарантирует, что все изменения будут зафиксированы в базе данных с корректным пересчетом итогов регистра.

Важные советы при работе с регистрами

Не забывайте про следующие моменты:

Используя данный подход, вы сможете безопасно и профессионально управлять содержимым любых регистров в системе 1С:Предприятие.

← На главную