К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как по UID получить ссылку на объект в 1С

Как по уникальному идентификатору (UID) получить ссылку на объект в 1С: метод ПолучитьСсылку, проверка битой ссылки, примеры кода для справочников и документов.

В 1С каждый объект базы данных — элемент справочника, документ, план счетов — имеет уникальный идентификатор (GUID, UID), который не меняется в течение всей жизни объекта. По этому идентификатору можно программно получить ссылку на объект и затем работать с ним: читать реквизиты, изменять, удалять. Такая задача возникает при обмене данными между базами, при интеграции с внешними системами и при обработке файлов выгрузки, где объекты идентифицируются именно по UID.

Важно понимать разницу: ссылка — это типизированное значение, указывающее на конкретный объект конкретного вида (например, «СправочникСсылка.Номенклатура»), а UID — просто строка из 36 символов вида «b2c5f0a1-3e8d-4c6a-9f1b-2d7e5a8c3f04». Чтобы получить ссылку из UID, нужно знать, к какому типу метаданных относится объект, и использовать метод ПолучитьСсылку() соответствующего менеджера.

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

Что такое UID и ссылка в 1С

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

Ссылка — это не строка и не число, а значение специального типа, привязанное к виду метаданных. Одна и та же строка UID может существовать у элемента справочника «Номенклатура» и у документа «РеализацияТоваровУслуг» — это будут разные ссылки. Поэтому без указания типа объекта получить ссылку из UID невозможно.

Базовый способ: метод ПолучитьСсылку()

Основной инструмент — метод ПолучитьСсылку(), доступный у менеджеров ссылочных типов: справочников, документов, планов видов характеристик, планов счетов и других. Метод принимает значение типа УникальныйИдентификатор и возвращает ссылку.

СтрокаUID = "b2c5f0a1-3e8d-4c6a-9f1b-2d7e5a8c3f04";

Идентификатор = Новый УникальныйИдентификатор(СтрокаUID);

СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);

Для документа код аналогичен, меняется только менеджер:

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);

Ключевая особенность метода: он не проверяет, есть ли объект с таким UID в базе. Если объекта нет, вы всё равно получите ссылку — но она будет «битой». Это частый источник ошибок, поэтому после получения ссылки нужна проверка существования.

Проверка существования объекта и битые ссылки

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

Первый приём — сравнение через запрос к реквизиту «Ссылка» или проверка через метод ПолучитьОбъект(): если объект не существует, метод вернёт Неопределено. Второй приём — функция проверки «битости» через запрос:

Функция ОбъектСуществует(Ссылка)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ "

+ Ссылка.Метаданные().ПолноеИмя()

+ " ГДЕ Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Возврат Не Запрос.Выполнить().Пустой();

КонецФункции

Если объект был удалён, а UID остался во внешней системе, обращение к реквизитам битой ссылки вернёт строку вида «<Объект не найден> (123:abcd...)». Записывать такие значения в другие объекты нельзя — это приводит к рассогласованию данных при обмене.

Контрольные точки

Как проверить результат

Ссылка получена методом ПолучитьСсылку
Норма

Тип значения — СправочникСсылка или ДокументСсылка нужного вида

Тревожный признак

Тип Строка или Неопределено — ошибка в коде

Объект существует в базе
Норма

Запрос по ссылке возвращает строку, реквизиты читаются

Тревожный признак

Представление содержит «Объект не найден»

UID совпадает с источником
Норма

Строка(Ссылка.УникальныйИдентификатор()) равна исходному UID

Тревожный признак

UID отличается — перепутан объект или база

Обратная задача: получить UID из ссылки

Если нужно двигаться в обратную сторону — выгрузить идентификатор объекта для передачи во внешнюю систему — используется метод УникальныйИдентификатор() ссылки:

UID = СсылкаНаТовар.УникальныйИдентификатор();

СтрокаДляВыгрузки = Строка(UID); // "b2c5f0a1-3e8d-4c6a-9f1b-2d7e5a8c3f04"

Через запрос UID получить напрямую нельзя — в запросах ссылка сравнивается как ссылка, а функции преобразования в идентификатор в языке запросов нет. Поэтому при пакетной выгрузке UID выбирают ссылки запросом, а идентификаторы формируют уже в цикле обхода результата.

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

В универсальных механизмах обмена UID приходит вместе с именем типа, например «Справочник.Номенклатура». В этом случае менеджер получают динамически:

ИмяТипа = "Справочник.Номенклатура"; // из источника данных

Части = СтрРазделить(ИмяТипа, ".");

Если Части[0] = "Справочник" Тогда

Менеджер = Справочники[Части[1]];

ИначеЕсли Части[0] = "Документ" Тогда

Менеджер = Документы[Части[1]];

КонецЕсли;

Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаUID));

Если известна только строка UID без типа, задача не имеет однозначного решения: придётся перебирать виды метаданных и искать объект по идентификатору запросами, что медленно и на больших базах неприемлемо. Правильное решение — всегда передавать тип вместе с UID в формате обмена.

Маршрут решения

Как выбрать действие

Известны UID и вид объекта (справочник, документ)Используйте Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(UID))
Известен UID, тип записан строкой в источникеПолучите менеджер динамически по имени типа через Справочники[Имя] или Документы[Имя]
Известен только UID без типаДоработайте обмен, чтобы тип передавался вместе с UID; перебор метаданных — крайняя мера
Объект по UID не найден, но должен существоватьПроверьте, не удалён ли объект, и не из другой ли базы этот UID

Создание объекта с заданным UID

Метод ПолучитьСсылку() применяют и при загрузке новых объектов из других баз: сначала формируют ссылку по UID источника, затем создают объект и принудительно устанавливают ему эту ссылку. Так гарантируется, что идентификаторы в двух базах совпадут.

НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);

Если Не ОбъектСуществует(НоваяСсылка) Тогда

НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();

НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);

НовыйОбъект.Наименование = "Загруженный элемент";

НовыйОбъект.Записать();

КонецЕсли;

Метод УстановитьСсылкуНового() можно вызвать только до записи объекта. Если попытаться установить ссылку уже записанному объекту, платформа выдаст ошибку. Также нельзя назначить ссылку, которая уже занята другим объектом этого же вида.

Типичные ошибки при работе с UID

Чаще всего проблемы возникают не из-за самого метода, а из-за неверных предположений о данных. Первая ошибка — передача в конструктор Новый УникальныйИдентификатор() строки в неверном формате: без дефисов, с лишними пробелами или фигурными скобками из SQL-выгрузок. Конструктор принимает канонический вид «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx»; скобки и мусор нужно предварительно удалить.

Вторая ошибка — использование ссылки без проверки существования. Третья — попытка получить ссылку одного вида метаданных по UID объекта другого вида: метод выполнится без ошибки, но такой объект никогда не найдётся, и поиск причины займёт время. Четвёртая — сравнение ссылок из разных баз по представлению вместо UID.

Типичные ошибки
01
Передача строки UID с фигурными скобками или пробелами — ошибка конструктора; очищайте строку перед созданием идентификатора
02
Использование ссылки без проверки существования — битые ссылки попадают в документы и регистры
03
Получение ссылки не того вида метаданных — объект не находится, хотя UID корректен
04
Вызов УстановитьСсылкуНового() после записи объекта — исключение платформы
05
Сравнение объектов разных баз по наименованию вместо UID — дубли и рассинхронизация

Ограничения и нюансы производительности

Метод ПолучитьСсылку() сам по себе не обращается к базе данных — он лишь формирует значение ссылки. Обращение к БД происходит при первом чтении реквизитов или вызове ПолучитьОбъект(). Поэтому массовое формирование ссылок дёшево, а вот проверка существования каждой в цикле — дорого: на больших объёмах лучше выбирать существующие UID одним пакетным запросом с временной таблицей.

Дополнительные ограничения: UID нельзя изменить у существующего объекта штатными средствами; в файловых и клиент-серверных базах механика идентична; регистры сведений, сведений и перечисления не имеют UID в том же смысле — перечисления идентифицируются именем значения, а записи регистров — ключом записи.

При интеграциях храните соответствие «UID внешней системы — ссылка 1С» в регистре сведений. Это избавит от повторных поисков и упростит диагностику расхождений при обмене.
ПЗ
Практическое замечание
Итог

Что важно запомнить

Ссылка по UID получается через Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаUID)). Метод не проверяет существование объекта — проверяйте сами. Для загрузки новых объектов с сохранением UID используйте УстановитьСсылкуНового() до записи.

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

Можно ли получить ссылку по UID, не зная типа объекта?

Штатного метода нет. Придётся перебирать виды метаданных и искать объект запросами, что медленно. Правильное решение — передавать имя типа вместе с UID в формате обмена.

Почему ПолучитьСсылку() не выдаёт ошибку для несуществующего UID?

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

Как получить UID из ссылки в запросе?

В языке запросов 1С функции преобразования ссылки в UID нет. Выберите ссылки запросом, а идентификаторы получайте в цикле обхода через Ссылка.УникальныйИдентификатор().

Что делать, если UID приходит в фигурных скобках из SQL?

Удалите скобки и лишние символы строковыми функциями (СтрЗаменить) и приведите строку к виду «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx», затем передайте её в конструктор Новый УникальныйИдентификатор().

Можно ли изменить UID уже записанного объекта?

Штатными средствами — нет. UID фиксируется при создании объекта. Если требуется другой идентификатор, создают новый объект с нужной ссылкой через УстановитьСсылкуНового() и переносят данные.

Работает ли ПолучитьСсылку() для перечислений и регистров?

Нет. Перечисления идентифицируются именем значения и получаются через Перечисления.Имя.ИмяЗначения. Записи регистров не имеют UID — они адресуются ключом записи (измерения, период, регистратор).