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