При разработке механизмов автоматизации в 1С, часто возникает необходимость программно удалить определенные записи из РегистрБухгалтерии, например, при корректировке данных документа или очистке проводок по конкретному контрагенту. Однако, при работе с НаборЗаписей многие разработчики сталкиваются с ошибкой «Недопустимое значение параметра (параметр номер '1')». Давайте разберем, почему она возникает и как правильно организовать процесс удаления.
Основная проблема заключается в непонимании того, что ожидает метод Удалить() объекта НаборЗаписей. Многие пытаются передать в этот метод номер строки (целое число), полученное из свойства НомерСтроки записи. Но метод Удалить() работает не с индексами или номерами, а с конкретным объектом записи, который входит в данную коллекцию.
Попытка передать числовой индекс вместо ссылки на объект приводит к сбою. Также стоит помнить, что удаление элементов коллекции прямо во время обхода этой же коллекции циклом Для каждого может привести к нарушению логики обхода и ошибкам доступа. Поэтому мы будем использовать более надежный и профессиональный подход.
Для корректного удаления записей по условию необходимо выполнить следующие шаги:
Прочитать() данные).Массив все те записи, которые подлежат удалению.Удалить() для каждой найденной записи.Записать().Посмотрим, как выглядит оптимизированный и корректный код для выполнения этой задачи. В данном примере мы отбираем все записи, где субконто «Контрагенты» совпадает с выбранным пользователем значением.
// Создаем набор записей
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
// Создаем массив для хранения ссылок на записи, подлежащие удалению
МассивКУдалению = Новый Массив;
// Собираем нужные записи
Для каждого Запись из НаборЗаписей Цикл
Если Запись.СубконтоДт.Контрагенты = НужныйКонтрагент Тогда
МассивКУдалению.Добавить(Запись);
КонецЕсли;
КонецЦикла;
// Удаляем собранные записи из набора
Для каждого ЗаписьКУдалению из МассивКУдалению Цикл
НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;
// Сохраняем изменения в базе
НаборЗаписей.Записать();
Во-первых, использование промежуточного массива исключает ошибки при изменении состава коллекции во время цикла. Во-вторых, метод НаборЗаписей.Удалить(Запись) работает именно так, как ожидает платформа 1С — он находит переданную ссылку внутри коллекции записей и исключает её. В-третьих, выполнение НаборЗаписей.Записать() гарантирует, что все изменения будут зафиксированы в базе данных с корректным пересчетом итогов регистра.
Не забывайте про следующие моменты:
Прочитать() перед началом работы с набором. Без этого метода объект НаборЗаписей будет содержать пустую коллекцию, и ваш цикл просто не выполнится.Используя данный подход, вы сможете безопасно и профессионально управлять содержимым любых регистров в системе 1С:Предприятие.