При разработке программного кода в 1С часто возникает необходимость удалить элемент справочника. Однако попытка обратиться к элементу через выборку запроса или ссылку нередко приводит к ошибке «Поле объекта не обнаружено (ПолучитьОбъект)». Рассмотрим причины возникновения этой ошибки, разберем правильный код для удаления элементов и проанализируем архитектурные риски физического стирания данных из базы.
Проанализируем ситуация, когда при попытке получить объект по ссылке платформа 1С выдает сообщение об ошибке. Основные причины заключаются в следующем:
ПолучитьОбъект() является методом (функцией) ссылочного типа, а не его реквизитом. Если написать Выборка.Ссылка.ПолучитьОбъект без скобок, система воспринимает эту запись как обращение к несуществующему реквизиту объекта и генерирует ошибку.СправочникОбъект) и метод ПолучитьОбъект() недоступны на тонком или веб-клиенте. Попытка выполнить данный код в клиентском контексте приведет к аналогичной ошибке. Все операции чтения объектов для изменения и удаления должны выполняться строго на сервере.Для программного удаления элементов сначала необходимо выбрать их ссылки с помощью запроса, затем получить объект и вызвать метод Удалить(). Посмотрим на пример корректной реализации данного алгоритма:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник1.Ссылка КАК Ссылка
|ИЗ
| Справочник.Справочник1 КАК Справочник1
|ГДЕ
| Справочник1.Код = &Код";
Запрос.УстановитьПараметр("Код", "000000004");
лВыборка = Запрос.Выполнить().Выбрать();
Пока лВыборка.Следующий() Цикл
ТекЭлемент = лВыборка.Ссылка.ПолучитьОбъект();
Если ТекЭлемент <> Неопределено Тогда
ТекЭлемент.Удалить();
КонецЕсли;
КонецЦикла;
Обратим внимание на основные моменты этого кода:
ПолучитьОбъект() вызывается со скобками.Неопределено, что исключает ошибки при обращении к несуществующим или уже удаленным объектам.Метод Удалить() осуществляет физическое стирание записи из базы данных в обход стандартных проверок. Рассмотрим риски, с которыми можно столкнуться при его использовании:
<Объект не найден>. Чтобы этого избежать, перед удалением рекомендуется использовать функцию НайтиПоСсылкам().Удалить() у текущего пользователя должно быть право на непосредственное (административное) удаление объектов данного типа.Часто необходимость удаления элементов возникает при отмене проведения документов, создающих новые элементы справочника. Физическое удаление в этом случае является некорректным шаблоном разработки. Проанализируем два более надежных подхода:
УстановитьПометкуУдаления(Истина). При повторном проведении документа алгоритм сначала ищет существующий элемент (включая помеченные на удаление), снимает пометку и обновляет данные, не создавая дубли.