Как правильно удалить элемент справочника в 1С и исправить ошибку «Поле объекта не обнаружено (ПолучитьОбъект)»

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

При разработке программного кода в 1С часто возникает необходимость удалить элемент справочника. Однако попытка обратиться к элементу через выборку запроса или ссылку нередко приводит к ошибке «Поле объекта не обнаружено (ПолучитьОбъект)». Рассмотрим причины возникновения этой ошибки, разберем правильный код для удаления элементов и проанализируем архитектурные риски физического стирания данных из базы.

Выясним причины ошибки «Поле объекта не обнаружено (ПолучитьОбъект)»

Проанализируем ситуация, когда при попытке получить объект по ссылке платформа 1С выдает сообщение об ошибке. Основные причины заключаются в следующем:

  1. Отсутствие скобок при вызове метода: В платформе 1С ПолучитьОбъект() является методом (функцией) ссылочного типа, а не его реквизитом. Если написать Выборка.Ссылка.ПолучитьОбъект без скобок, система воспринимает эту запись как обращение к несуществующему реквизиту объекта и генерирует ошибку.
  2. Контекст исполнения кода (Клиент/Сервер): Объектные типы (такие как СправочникОбъект) и метод ПолучитьОбъект() недоступны на тонком или веб-клиенте. Попытка выполнить данный код в клиентском контексте приведет к аналогичной ошибке. Все операции чтения объектов для изменения и удаления должны выполняться строго на сервере.

Разберем правильный алгоритм удаления через запрос

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Справочник1.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Справочник1 КАК Справочник1
    |ГДЕ
    |	Справочник1.Код = &Код";

Запрос.УстановитьПараметр("Код", "000000004");

лВыборка = Запрос.Выполнить().Выбрать();

Пока лВыборка.Следующий() Цикл
    ТекЭлемент = лВыборка.Ссылка.ПолучитьОбъект();
    Если ТекЭлемент <> Неопределено Тогда
        ТекЭлемент.Удалить();
    КонецЕсли;
КонецЦикла;

Обратим внимание на основные моменты этого кода:

  1. Метод ПолучитьОбъект() вызывается со скобками.
  2. Перед удалением выполняется проверка на Неопределено, что исключает ошибки при обращении к несуществующим или уже удаленным объектам.
  3. Весь процесс выполняется на стороне сервера.

Оценим риски прямого метода Удалить() и ссылочную целостность

Метод Удалить() осуществляет физическое стирание записи из базы данных в обход стандартных проверок. Рассмотрим риски, с которыми можно столкнуться при его использовании:

  1. Появление «битых» ссылок: Если на удаляемый элемент справочника ссылаются другие документы, справочники или регистры, после физического удаления в них останется запись вида <Объект не найден>. Чтобы этого избежать, перед удалением рекомендуется использовать функцию НайтиПоСсылкам().
  2. Ограничение прав доступа: Для вызова метода Удалить() у текущего пользователя должно быть право на непосредственное (административное) удаление объектов данного типа.
  3. Иерархические справочники: Если элемент является родителем (группой) и содержит подчиненные элементы, прямое удаление без очистки иерархии вызовет исключение платформы.

Рассмотри альтернативные архитектурные решения

Часто необходимость удаления элементов возникает при отмене проведения документов, создающих новые элементы справочника. Физическое удаление в этом случае является некорректным шаблоном разработки. Проанализируем два более надежных подхода:

  1. Пометка на удаление и повторное использование (Re-use): Вместо физического удаления вызовем метод УстановитьПометкуУдаления(Истина). При повторном проведении документа алгоритм сначала ищет существующий элемент (включая помеченные на удаление), снимает пометку и обновляет данные, не создавая дубли.
  2. Использование регистра сведений: Если данные жестко привязаны к документу-регистратору и не используются самостоятельными сущностями в других разделах базы, их целесообразно хранить в подчиненном регистре сведений. При отмене проведения документа записи регистра автоматически удаляются платформой без риска нарушения ссылочной целостности.
← На главную