Как проверить на объект не найден в запросе 1с

Перестаньте гадать, почему 1С не видит данные. Простые способы отловить "Объект не найден" и заставить запрос работать как часы.

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Ошибка «Объект не найден» (в интерфейсе отображается как <Объект не найден>) — одна из самых распространенных проблем при работе с базами данных 1С:Предприятие 8. Она возникает, когда ссылка на объект (элемент справочника, документ и т.д.) сохранена в базе, но сам объект был удален. В результате получается «битая ссылка», которая имеет тип и GUID, но не указывает на существующую запись в таблице СУБД.

В этой статье подробно разберем, как обнаружить такие ссылки с помощью языка запросов, как отфильтровать их и как правильно проверять ссылки на «битость» в коде.

Природа проблемы: почему возникает «Объект не найден»

В 1С ссылки, это не просто указатели на память, а уникальные идентификаторы (GUID), хранящиеся в полях таблиц базы данных; Основные причины появления битых ссылок:

  • Удаление объекта без контроля ссылочной целостности. Если в настройках удаления объекта стоит режим «Не проверять» или удаление выполняется через прямые SQL-запросы/обработки (например, «Выгрузка/загрузка данных XML»), ссылки на этот объект в других таблицах остаются «висеть в воздухе».
  • Ошибки при обмене данными (РИБ). Объект удален в центральной базе, а в периферийной пришел только маркер удаления, но ссылки в документах периферийной базы не были очищены.
  • Сбои СУБД или некорректное восстановление из бэкапа. Например, ошибка Не удалось найти объект Acc.dbo._RefSInf... указывает на отсутствие физической таблицы или строки в SQL Server.

Метод 1: Проверка через строковое представление (Классический способ)

Самый распространенный способ проверки «битости» ссылки в коде 1С — преобразование её в строку и поиск подстроки <Объект не найден>.

Пример в коде (модуль формы, команды, серверные процедуры):

Ссылка = Справочники.Партнеры.ПолучитьСсылку(Новый УникальныйИдентификатор("d8e9518f-4737-11ea-baa9-ecaa1256a417"));

// Метод Пустая вернет ЛОЖЬ, так как ссылка НЕ пустая (у нее есть тип и GUID)
// Если Ссылка.Пустая Тогда ... // Сработает только для пустых ссылок (000...000)

Если Найти(Строка(Ссылка), "<Объект не найден>") > 0 Тогда
 Сообщить("Ссылка БИТАЯ: " + Строка(Ссылка));
Иначе
 Сообщить("Ссылка корректная");
КонецЕсли;

Важный нюанс: Метод Ссылка.Пустая для битых ссылок возвращает Ложь, потому что формально значение ссылки существует (это не нулевой GUID). Поэтому проверка на пустоту не подходит для поиска битых ссылок.

Метод 2: Проверка в языке запросов (SQL-уровень)

В запросах 1С нельзя напрямую использовать функцию Найти над полем типа «Ссылка» так просто, как в коде. Есть несколько подходов.

Вариант А: Приведение к строке в запросе (для небольших выборок)

Можно привести поле к строке функцией ВЫРАЗИТЬ(.;. КАК СТРОКА) и использовать ПОДОБНО или НАЙТИ (если поддерживается СУБД).

ВЫБРАТЬ
 Товары.Ссылка КАК Товар,
 ВЫРАЗИТЬ(Товары.Ссылка КАК СТРОКА(100)) КАК СтрокаСсылки
ИЗ
 Справочник.Номенклатура КАК Товары
ГДЕ
 ВЫРАЗИТЬ(Товары.Ссылка КАК СТРОКА(100)) ПОДОБНО "%<Объект не найден>%"

Минусы: Низкая производительность на больших таблицах (полное сканирование, не используются индексы), зависит от формата строкового представления (язык интерфейса).

Вариант Б: Левое соединение с таблицей объектов (Рекомендуемый, быстрый)

Самый правильный и производительный способ — сделать ЛЕВОЕ СОЕДИНЕНИЕ с таблицей справочника/документа и отобрать записи, где в правой части соединения получились NULL.

ВЫБРАТЬ
 Документы.Ссылка КАК ДокументСсылка,
 Документы.Контрагент КАК БитойКонтрагент
ИЗ
 Документ.РеализацияТоваровУслуг КАК Документы
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
 ПО Документы.Контрагент = Контрагенты.Ссылка
ГДЕ
 Контрагенты.Ссылка ЕСТЬ NULL
 И Документы.Контрагент НЕ ЕСТЬ NULL // Исключаем просто пустые ссылки

Принцип: Если у документа заполнен реквизит Контрагент, но в таблице Справочник.Контрагенты нет записи с таким GUID, то при левом соединении поля Контрагенты будут NULL. Это и есть признак битой ссылки.

Вариант В: Использование виртуальных таблиц (для регистров накопления/сведений)

Если битая ссылка сидит в измерении регистра, можно соединять регистр с объектом метаданных.

ВЫБРАТЬ
 Остатки.Номенклатура КАК БитойТовар
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
 ПО Остатки.Номенклатура = Номенклатура.Ссылка
ГДЕ
 Номенклатура.Ссылка ЕСТЬ NULL

Метод 3: Проверка через системные поля (для продвинутых)

В некоторых конфигурациях (управляемые формы, БСП) можно использовать проверку существования объекта через менеджер, но в запросе это не применимо напрямую. Однако, зная, что у битой ссылки заполнен GUID, но нет записи в таблице _ReferenceXXX или _DocumentXXX, можно писать запросы прямо к системным таблицам (не рекомендуется для прикладного кода, полезно для администрирования/ремонта).

Инструментальные средства поиска и исправления

Помимо ручного написания запросов, существуют готовые решения:

  1. Тестирование и исправление (ТиР), «Проверка ссылочной целостности». Стандартный режим конфигуратора. Находит все битые ссылки во всей базе. В настройках можно выбрать «Очищать ссылки» или «Удалять объекты».
  2. Обработка «Поиск и исправление битой ссылки по GUID» (или аналогичные из Инфостарт/Гитхаб). Позволяет ввести GUID (который виден в строке <Объект не найден (84:bf56...)...>) и найти, где он используется, а также восстановить объект из резервной копии через «Конвертацию данных 2» (выгрузка/загрузка XML).
  3. Журнал регистрации. Если ошибка только что появилась, в журнале регистрации (Сервис -> Монитор пользователей -> Журнал регистрации) можно найти событие удаления объекта и его GUID.

Резюме: какой способ выбрать?

Задача Рекомендуемый метод
Проверка одной переменной в коде (модуль) Найти(Строка(Ссылка), "<Объект не найден>") > 0
Отбор в запросе для отчета/обработки (малые таблицы) ВЫРАЗИТЬ(Поле КАК СТРОКА) ПОДОБНО "%<Объект не найден>%"
Отбор в запросе для отчета/обработки (большие таблицы, производительность) ЛЕВОЕ СОЕДИНЕНИЕ с таблицей объекта + ГДЕ ТаблицаОбъекта.Ссылка ЕСТЬ NULL
Глобальный поиск всех битой ссылок в базе Конфигуратор -> Администрирование -> Тестирование и исправление -> Проверка ссылочной целостности
Восстановление удаленного объекта по известному GUID Обработка «Выгрузка/загрузка данных XML» (Конвертация данных 2) из резервной копии

Проверка на «Объект не найден» в запросе 1С эффективнее всего реализуется через ЛЕВОЕ СОЕДИНЕНИЕ с таблицей метаданных объекта и проверку на NULL. Это обеспечивает высокую скорость за счет использования индексов СУБД и независимость от языковых настроек строкового представления. Для разовых проверок в коде удобен метод поиска подстроки в строковом представлении ссылки. Регулярное проведение «Тестирования и исправления» с включенной проверкой ссылочной целостности — лучшая профилактика массового появления таких ошибок.