Как получить тип объекта 1С по строке «Объект не найден»?

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

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

Понимание структуры «битой» ссылки

Рассмотрим подробнее, из чего состоит данная строка. Число перед двоеточием (в нашем примере это 84) — это не случайный набор символов, а идентификатор таблицы в структуре базы данных (номер таблицы в SDBL). Платформа 1С использует эти номера для внутренней адресации данных в SQL. Вторая часть строки — это шестнадцатеричное представление УникальныйИдентификатор (GUID) объекта.

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

Решение задачи: алгоритм кэширования метаданных

Вместо того чтобы при каждой проверке перебирать все справочники и документы (что крайне медленно на больших конфигурациях), мы построим карту соответствий один раз. Для этого проанализируем содержимое конфигурации и сохраним связь «Номер таблицы — Имя объекта».

Рассмотрим пример кода, который позволяет сформировать такое соответствие:


&НаСервере
Функция ПолучитьСоответствиеНомеровМетаданных()
    Соотв = Новый Соответствие;
    ВеткиМетаданных = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуВМассивПодстрок("Документы,Справочники");
    
    Для Каждого Ветка из ВеткиМетаданных Цикл
        Для Каждого ОбъектМетаданных из Метаданные[Ветка] Цикл
            ПустаяСсылка = Вычислить("" + Ветка + "." + ОбъектМетаданных.Имя + ".ПустаяСсылка()");
            ВнутрПредставление = ЗначениеВСтрокуВнутр(ПустаяСсылка);
            // Извлекаем номер таблицы с помощью регулярных выражений
            НомерТаблицы = RegExpExtract(ВнутрПредставление, ".*\,(\d+):00000000000000000000000000000000}");
            Соотв[НомерТаблицы] = "" + Ветка + "." + ОбъектМетаданных.Имя;
        КонецЦикла;
    КонецЦикла;
    Возврат Соотв;
КонецФункции

Как использовать полученные данные

Когда у нас есть сформированное Соответствие, задача определения типа сводится к мгновенному извлечению значения по ключу. Если строка имеет вид <Объект не найден> (45:bf56...), мы просто берем число 45 и получаем полное имя объекта, например: Документ.ПриходнаяНакладная.

Разберем этапы работы с такой ссылкой:

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

Важные технические нюансы

При реализации этого подхода следует учитывать несколько критически важных моментов:

Используя этот алгоритм, вы сможете быстро диагностировать «битые» ссылки и при необходимости восстанавливать их в автоматическом режиме, экономя время на поиске проблемных объектов в больших информационных системах.

← На главную