Поиск элемента, документа или таблицы 1С по GUID: от навигационной ссылки до SQL
Содержание
Быстрее всего найти объект по идентификатору в 1С через навигационную ссылку: переставьте части GUID во внутренний порядок, подставьте в строку вида e1cib/data/Справочник.Номенклатура?ref=<32 символа> и откройте её командой перехода по ссылке. Если тип объекта неизвестен, помогает поиск GUID кодом во внешней обработке по всем справочникам и документам, а для серверной базы — SQL-запрос по полю _IDRRef.
Какой способ выбрать, зависит от того, что у вас на руках. Знаете тип — хватит ссылки. Есть только строка из лога или файла обмена — нужна обработка. Пользователи не могут зайти в базу или надо проверить сотни таблиц разом — идите в SQL, но только на чтение.
| Что известно | Способ | Нужны права |
|---|---|---|
| GUID и тип объекта | Навигационная ссылка | Обычный пользователь |
| Только GUID | Внешняя обработка | Полные права |
Строка <Объект не найден> (N:hex) | Структура хранения + обработка | Полные права |
| GUID, база на MS SQL или PostgreSQL | SQL-запрос по _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 через навигационную ссылку
Этот способ работает в пользовательском режиме, без Конфигуратора. Нужно знать тип объекта и его имя в метаданных.
- Переведите GUID во внутренний вид по таблице выше.
- Соберите строку:
e1cib/data/<Тип>.<Имя>?ref=<32 символа>. Например, для документа реализации:e1cib/data/Документ.РеализацияТоваровУслуг?ref=80c4001e6711223311e912343e6a4f9b. - Откройте главное меню программы (кнопка с тремя полосками в заголовке окна) и выберите команду перехода по навигационной ссылке.
- Вставьте строку и нажмите «Перейти». Откроется форма объекта.
Имя в метаданных — это не синоним с экрана. «Номенклатура» совпадает, а вот «Реализация (акты, накладные, УПД)» в метаданных называется РеализацияТоваровУслуг. Узнать точное имя проще всего так: откройте любой объект этого типа, нажмите на значок ссылки (цепочка) в заголовке формы и скопируйте ссылку. Перед знаком ? будет нужный тип и имя.
Если объекта с таким 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 есть, а объекта уже нет.
- Откройте журнал:
Администрирование → Обслуживание → Журнал регистрации(в БП 3.0, ЗУП 3.1, УТ 11). - Установите отбор по событиям «Данные. Удаление» и «Данные. Запись» и по периоду.
- Если объект ещё существует, в отборе по полю «Данные» выберите его — журнал покажет всю историю изменений.
Для удалённого объекта выбрать его в отборе уже нельзя. Тогда помогает поиск по файлам журнала. Они лежат в каталоге 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 обоих элементов кодом из раздела про обработку.