Поиск элемента, документа или таблицы 1С по GUID: от навигационной ссылки до SQL

· 10 мин

Содержание

Быстрее всего найти объект по идентификатору в 1С через навигационную ссылку: переставьте части GUID во внутренний порядок, подставьте в строку вида e1cib/data/Справочник.Номенклатура?ref=<32 символа> и откройте её командой перехода по ссылке. Если тип объекта неизвестен, помогает поиск GUID кодом во внешней обработке по всем справочникам и документам, а для серверной базы — SQL-запрос по полю _IDRRef.

Какой способ выбрать, зависит от того, что у вас на руках. Знаете тип — хватит ссылки. Есть только строка из лога или файла обмена — нужна обработка. Пользователи не могут зайти в базу или надо проверить сотни таблиц разом — идите в SQL, но только на чтение.

Что известноСпособНужны права
GUID и тип объектаНавигационная ссылкаОбычный пользователь
Только GUIDВнешняя обработкаПолные права
Строка <Объект не найден> (N:hex)Структура хранения + обработкаПолные права
GUID, база на MS SQL или PostgreSQLSQL-запрос по _IDRRefДоступ к СУБД

Какие идентификаторы бывают в 1С и чем они отличаются

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

В обиходе под «идентификатором» понимают четыре разные вещи:

  • 🔑 GUID объекта данных — строка вида 3e6a4f9b-1234-11e9-80c4-001e67112233. Его возвращает метод Ссылка.УникальныйИдентификатор(), его пишут в файлы обмена и выгрузки.
  • 🧩 Внутреннее шестнадцатеричное представление — те же 16 байт, но в другом порядке и без дефисов: 80c4001e6711223311e912343e6a4f9b. Именно так ссылка выглядит в навигационной ссылке, в «битых» ссылках и в поле _IDRRef в СУБД.
  • 📐 UUID объекта метаданных — идентификатор самого справочника или реквизита в конфигурации. Он виден в XML-выгрузке конфигурации и в некоторых сообщениях об ошибках.
  • 🗄️ Номер таблицы хранения — число в имени таблицы _Reference38, _Document123. По нему определяют, какому объекту метаданных принадлежит таблица.

Код и номер документа идентификатором не являются. Их можно поменять, и они могут повторяться, а GUID — нет.

Как переставить части GUID во внутренний порядок

GUID состоит из пяти групп: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee. Во внутреннем представлении они идут в порядке d, e, c, b, a.

ГруппаВ GUIDПозиция во внутреннем виде
a (8 символов)3e6a4f9bпоследняя
b (4 символа)1234четвёртая
c (4 символа)11e9третья
d (4 символа)80c4первая
e (12 символов)001e67112233вторая

Результат: 80c4 + 001e67112233 + 11e9 + 1234 + 3e6a4f9b = 80c4001e6711223311e912343e6a4f9b. Обратное преобразование — в том же порядке, только наоборот: символы 25–32 дают группу a, 21–24 — b, 17–20 — c, 1–4 — d, 5–16 — e.

Регистр букв роли не играет: 80C4… и 80c4… — одна и та же ссылка.

Как открыть объект по GUID через навигационную ссылку

Этот способ работает в пользовательском режиме, без Конфигуратора. Нужно знать тип объекта и его имя в метаданных.

  1. Переведите GUID во внутренний вид по таблице выше.
  2. Соберите строку: e1cib/data/<Тип>.<Имя>?ref=<32 символа>. Например, для документа реализации: e1cib/data/Документ.РеализацияТоваровУслуг?ref=80c4001e6711223311e912343e6a4f9b.
  3. Откройте главное меню программы (кнопка с тремя полосками в заголовке окна) и выберите команду перехода по навигационной ссылке.
  4. Вставьте строку и нажмите «Перейти». Откроется форма объекта.

Имя в метаданных — это не синоним с экрана. «Номенклатура» совпадает, а вот «Реализация (акты, накладные, УПД)» в метаданных называется РеализацияТоваровУслуг. Узнать точное имя проще всего так: откройте любой объект этого типа, нажмите на значок ссылки (цепочка) в заголовке формы и скопируйте ссылку. Перед знаком ? будет нужный тип и имя.

Если объекта с таким GUID нет, платформа сообщит об ошибке или откроет пустую ссылку. Это первый сигнал, что GUID относится к другому типу или объект удалён.

Поиск GUID по всем объектам внешней обработкой

Когда тип неизвестен, перебор руками займёт час. Обработка проверит все справочники, документы и прочие ссылочные типы за секунды.

Создайте в Конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте форму с реквизитом СтрокаУИД (тип Строка, 36) и кнопкой. Код модуля формы:

&НаКлиенте
Процедура Найти(Команда)
	Результат = НайтиПоУИД(СтрокаУИД);
	Если Результат.Количество() = 0 Тогда
		Сообщить("Объект с таким GUID не найден");
	КонецЕсли;
	Для Каждого Ссылка Из Результат Цикл
		Сообщить(Ссылка);
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция НайтиПоУИД(Знач СтрокаУИД)
	УИД = Новый УникальныйИдентификатор(СокрЛП(СтрокаУИД));
	Найдено = Новый Массив;
	Пары = Новый Массив;
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.Справочники, Справочники));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.Документы, Документы));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.ПланыВидовХарактеристик, ПланыВидовХарактеристик));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.ПланыСчетов, ПланыСчетов));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.ПланыВидовРасчета, ПланыВидовРасчета));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.ПланыОбмена, ПланыОбмена));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.БизнесПроцессы, БизнесПроцессы));
	Пары.Добавить(Новый Структура("МД, Менеджер", Метаданные.Задачи, Задачи));
	Для Каждого Пара Из Пары Цикл
		Для Каждого ОбъектМД Из Пара.МД Цикл
			Ссылка = Пара.Менеджер[ОбъектМД.Имя].ПолучитьСсылку(УИД);
			Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
				Найдено.Добавить(ОбъектМД.ПолноеИмя() + ": " + Строка(Ссылка)
					+ " | " + ПолучитьНавигационнуюСсылку(Ссылка));
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат Найдено;
КонецФункции

Главный момент: ПолучитьСсылку() всегда возвращает ссылку, даже если такого объекта в базе нет. Проверять существование нужно отдельно — здесь через ПолучитьОбъект(), который для несуществующего объекта вернёт Неопределено.

Запускайте обработку под пользователем с полными правами. Иначе на справочнике без прав чтения код упадёт с ошибкой доступа, и вы решите, что дело в GUID.

Обработка только читает данные. Не добавляйте в неё запись или удаление «заодно»: поиск по GUID обычно делают в рабочей базе, а там цена ошибки высока.

Если нужно наоборот — узнать GUID открытого объекта, хватит одной строки в той же обработке: Строка(Ссылка.УникальныйИдентификатор()).

Как расшифровать «битую» ссылку <Объект не найден>

Чаще всего GUID ищут, когда в реквизите документа или в отчёте висит строка вида <Объект не найден> (38:80c4001e6711223311e912343e6a4f9b). В ней два идентификатора сразу:

  • 🔢 38 — номер типа ссылки. Он совпадает с номером таблицы хранения: _Reference38, _Document38 и так далее.
  • 🧬 80c4…4f9b — внутреннее представление GUID удалённого или не загруженного объекта.

Чтобы понять, что это за тип, выполните в той же внешней обработке на сервере:

Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Строка Из Структура Цикл
	Если СтрНайти(Строка.ИмяТаблицыХранения, "38") > 0 Тогда
		Сообщить(Строка.ИмяТаблицыХранения + " — " + Строка.Метаданные);
	КонецЕсли;
КонецЦикла;

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

Объект с таким GUID в этой базе уже не появится сам. Варианты исправления: восстановить его из резервной копии через выгрузку-загрузку, дождаться его прихода по обмену или заменить битое значение в реквизите на правильный элемент.

Поиск по идентификатору в SQL: MS SQL и PostgreSQL

В клиент-серверной базе ссылка хранится в поле _IDRRef типа binary(16) в MS SQL и bytea в PostgreSQL. Порядок байтов в нём — внутренний, тот же, что в навигационной ссылке.

Работайте в СУБД только на чтение и лучше на копии базы. Любое изменение данных напрямую в обход платформы ломает целостность: платформа не узнает о правке, итоги регистров и кеш разойдутся с таблицами.

MS SQL: найти таблицу, в которой лежит GUID

Скрипт проверяет все таблицы, где есть поле _IDRRef, и печатает имена тех, где нашлась запись:

DECLARE @id binary(16) = 0x80C4001E6711223311E912343E6A4F9B;
DECLARE @sql nvarchar(max) = N'';

SELECT @sql = @sql
    + N'IF EXISTS (SELECT 1 FROM ' + QUOTENAME(t.name)
    + N' WHERE _IDRRef = @id) PRINT ''' + t.name + N''';' + CHAR(10)
FROM sys.tables t
JOIN sys.columns c ON c.object_id = t.object_id
WHERE c.name = '_IDRRef';

EXEC sp_executesql @sql, N'@id binary(16)', @id = @id;

Получив имя вроде _Reference38, сопоставьте его с объектом метаданных через ПолучитьСтруктуруХраненияБазыДанных() из предыдущего раздела.

PostgreSQL: запрос по известной таблице

SELECT *
FROM _reference38
WHERE _idrref = '\x80c4001e6711223311e912343e6a4f9b'::bytea;

Имена таблиц и полей в PostgreSQL хранятся в нижнем регистре. Для перебора всех таблиц используйте information_schema.columns с фильтром column_name = '_idrref' и динамический запрос в блоке DO.

Ссылки на объект из других таблиц ищите по полям с окончанием RRef: например, _Fld1234RRef в реквизитах и _RecorderRRef в регистрах. Так находят все места, куда «прилипла» битая ссылка.

Журнал регистрации и логи: где ещё встречается идентификатор

Журнал регистрации помнит, кто и когда записал или удалил объект. Это главный инструмент, когда GUID есть, а объекта уже нет.

  1. Откройте журнал: Администрирование → Обслуживание → Журнал регистрации (в БП 3.0, ЗУП 3.1, УТ 11).
  2. Установите отбор по событиям «Данные. Удаление» и «Данные. Запись» и по периоду.
  3. Если объект ещё существует, в отборе по полю «Данные» выберите его — журнал покажет всю историю изменений.

Для удалённого объекта выбрать его в отборе уже нельзя. Тогда помогает поиск по файлам журнала. Они лежат в каталоге 1Cv8Log:

  • 🖥️ серверная база — srvinfo\reg_1541\<GUID информационной базы>\1Cv8Log;
  • 📁 файловая база — подкаталог 1Cv8Log рядом с файлом 1Cv8.1CD.

В старом формате (.lgp, .lgf) это текстовые файлы, и поиск по 32-символьному внутреннему представлению ссылки находит записи о событиях с этим объектом. В новом формате (.lgd) журнал хранится в базе SQLite, её открывают любым просмотрщиком SQLite.

Здесь же второй частый случай поиска «по идентификатору» — найти, какой каталог в srvinfo принадлежит какой базе. Каталог назван GUID-ом информационной базы. Соответствие показывает утилита администрирования:

rac cluster list
rac infobase summary list --cluster=<GUID кластера>

Первая команда выводит GUID кластера, вторая — GUID и имена всех баз в нём.

GUID в распределённых базах и обменах

В распределённой информационной базе (РИБ) у объекта один GUID во всех узлах. Документ, созданный в филиале, приходит в центральную базу с тем же идентификатором. Поэтому навигационная ссылка из одного узла открывает тот же объект в другом.

С обменами по правилам между разными конфигурациями (например, УТ 11 → БП 3.0) всё иначе. Объект в приёмнике может получить собственный GUID. Связь «GUID в источнике — GUID в приёмнике» хранится в регистре сведений «Соответствия объектов информационных баз» подсистемы обмена данными. Найдите его через Все функции → Регистры сведений (включите «Отображать команду Все функции» в параметрах программы) и отфильтруйте по идентификатору источника.

Типичные ситуации в обменах:

  • 📦 В сообщении обмена (XML) есть GUID, а в базе объекта нет. Объект не прошёл загрузку или ещё не выгружен. Проверьте протокол обмена в карточке синхронизации.
  • 🔁 Пришла битая ссылка <Объект не найден>. Документ загрузился раньше справочника, на который ссылается. Обычно ссылка «оживает» после следующего сеанса обмена, когда справочник приходит с тем же GUID.
  • 👯 Два одинаковых элемента в приёмнике. Сопоставление по GUID не сработало, и объект создан повторно. Сравните GUID обоих элементов кодом из раздела про обработку.

На чём спотыкаются при поиске по GUID

Диагностика: выберите симптом

Частые вопросы

Может ли GUID объекта измениться?
Нет. Он задаётся при первой записи и остаётся неизменным. При копировании элемента копия получает новый GUID.
Бывают ли одинаковые GUID в разных базах?
Да, если база создана копированием, загрузкой из .dt или является узлом РИБ. Внутри одной таблицы GUID уникален.
Можно ли задать GUID вручную при создании объекта?
Да, программно: методом УстановитьСсылкуНового() у нового объекта до первой записи. Так переносят объекты между базами с сохранением ссылок.
Как скопировать ссылку на объект, чтобы отправить коллеге?
Нажмите значок цепочки в заголовке формы объекта и скопируйте навигационную ссылку. Коллега откроет её через переход по ссылке в своей копии программы.
Где найти UUID объекта метаданных?
Выгрузите конфигурацию в файлы из Конфигуратора: у каждого объекта в XML есть атрибут uuid. Поиск по нему в выгрузке показывает, какому справочнику или реквизиту он принадлежит.