При работе с базами данных 1С:Предприятие мы периодически сталкиваемся с неприятным явлением: при обращении к ссылке, которая была удалена или повреждена, система выдает сообщение <Объект не найден>. Часто в такой строке мы видим некую комбинацию цифр и идентификатора, например: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824). Разберемся, что это означает и как извлечь из этой «битой» ссылки информацию о том, какой именно тип объекта (документ это, справочник или иной элемент) там был скрыт.
Рассмотрим подробнее, из чего состоит данная строка. Число перед двоеточием (в нашем примере это 84) — это не случайный набор символов, а идентификатор таблицы в структуре базы данных (номер таблицы в SDBL). Платформа 1С использует эти номера для внутренней адресации данных в SQL. Вторая часть строки — это шестнадцатеричное представление УникальныйИдентификатор (GUID) объекта.
Важно понимать, что прямого штатного метода в объектной модели 1С для получения типа по этой строке не существует. Однако, поскольку мы знаем, что номер таблицы жестко связан с определенным метаданным в конкретной конфигурации, мы можем создать таблицу соответствий.
Вместо того чтобы при каждой проверке перебирать все справочники и документы (что крайне медленно на больших конфигурациях), мы построим карту соответствий один раз. Для этого проанализируем содержимое конфигурации и сохраним связь «Номер таблицы — Имя объекта».
Рассмотрим пример кода, который позволяет сформировать такое соответствие:
&НаСервере
Функция ПолучитьСоответствиеНомеровМетаданных()
Соотв = Новый Соответствие;
ВеткиМетаданных = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуВМассивПодстрок("Документы,Справочники");
Для Каждого Ветка из ВеткиМетаданных Цикл
Для Каждого ОбъектМетаданных из Метаданные[Ветка] Цикл
ПустаяСсылка = Вычислить("" + Ветка + "." + ОбъектМетаданных.Имя + ".ПустаяСсылка()");
ВнутрПредставление = ЗначениеВСтрокуВнутр(ПустаяСсылка);
// Извлекаем номер таблицы с помощью регулярных выражений
НомерТаблицы = RegExpExtract(ВнутрПредставление, ".*\,(\d+):00000000000000000000000000000000}");
Соотв[НомерТаблицы] = "" + Ветка + "." + ОбъектМетаданных.Имя;
КонецЦикла;
КонецЦикла;
Возврат Соотв;
КонецФункции
Когда у нас есть сформированное Соответствие, задача определения типа сводится к мгновенному извлечению значения по ключу. Если строка имеет вид <Объект не найден> (45:bf56...), мы просто берем число 45 и получаем полное имя объекта, например: Документ.ПриходнаяНакладная.
Разберем этапы работы с такой ссылкой:
Соответствие.МенеджерОбъекта.СоздатьЭлемент() или СоздатьДокумент() и с помощью метода УстановитьСсылкуНового() привязываем к нему сохраненный GUID.При реализации этого подхода следует учитывать несколько критически важных моментов:
Вычислить() или Метаданные тяжел для системы, поэтому выполняйте его только один раз при старте обработки или при необходимости обновления кэша.Используя этот алгоритм, вы сможете быстро диагностировать «битые» ссылки и при необходимости восстанавливать их в автоматическом режиме, экономя время на поиске проблемных объектов в больших информационных системах.