Разработка и Конфигурация · 12 мин
Как в 1С получить ссылку по уникальному идентификатору
Как в 1С получить ссылку на объект по уникальному идентификатору: метод ПолучитьСсылку, работа с GUID в запросах, обмене и внешних системах.
Уникальный идентификатор (GUID) — это 36-символьная строка вида «8b3b9c2e-1234-4abc-9def-0123456789ab», которую платформа 1С присваивает каждому объекту базы: элементу справочника, документу, записи плана обмена. По этому идентификатору можно однозначно восстановить ссылку на объект, даже если код или наименование изменились.
Задача получения ссылки по GUID возникает регулярно: при интеграции с внешними системами (сайт, CRM, мобильное приложение), при обмене между базами 1С, при восстановлении «битых» ссылок и при отладке. Внешние системы хранят именно идентификаторы, а не внутренние ссылки, поэтому уметь преобразовывать GUID в ссылку и обратно — базовый навык разработчика и администратора 1С.
В этой статье разобраны основные способы: метод ПолучитьСсылку() для справочников и документов, получение GUID из существующей ссылки, работа с идентификаторами в запросах, а также типичные ошибки — «битые» ссылки, битый порядок байтов и попытки применить метод к перечислениям.
Что такое уникальный идентификатор в 1С и где он хранится
Уникальный идентификатор присваивается объекту в момент записи и не меняется в течение всей жизни объекта. Даже при обмене данными между базами GUID сохраняется, если обмен построен корректно — именно поэтому он используется как ключ сопоставления объектов в распределённых системах.
Важно понимать: GUID хранится не в отдельном реквизите, а является частью самой ссылки. Ссылка в 1С — это комбинация типа объекта и его уникального идентификатора. Поэтому один и тот же GUID, поданный в менеджеры разных типов (например, справочника «Номенклатура» и справочника «Контрагенты»), даст две разные ссылки, указывающие на разные объекты или на несуществующие объекты.
Получить GUID существующей ссылки можно методом УникальныйИдентификатор():
GUID = СсылкаНаОбъект.УникальныйИдентификатор();
СтрокаGUID = Строка(GUID); // "8b3b9c2e-..."
Базовый способ: метод ПолучитьСсылку()
Основной инструмент — метод ПолучитьСсылку(), доступный у менеджера любого ссылочного типа: справочника, документа, плана видов характеристик, плана счетов и других. Метод принимает параметр типа УникальныйИдентификатор и возвращает ссылку.
СтрокаGUID = "8b3b9c2e-1234-4abc-9def-0123456789ab";
Ид = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Если GUID уже есть в виде значения типа УникальныйИдентификатор (например, получен из другой ссылки), конструктор Новый УникальныйИдентификатор не нужен — передайте значение напрямую. Конструктор со строковым параметром нужен только для преобразования строки в тип.
Для документов синтаксис идентичен:
СсылкаДок = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Ид);
- 1Определите тип объекта: справочник, документ или другой ссылочный тип
- 2Преобразуйте строку GUID в тип УникальныйИдентификатор через конструктор
- 3Вызовите ПолучитьСсылку(Ид) у менеджера нужного типа
- 4Проверьте, что ссылка указывает на существующий объект, запросом или через ПолучитьОбъект()
- 5Используйте ссылку: установите в реквизит, получите объект для редактирования
Проверка существования объекта по ссылке
Критически важный момент: ПолучитьСсылку() не проверяет, есть ли объект с таким GUID в базе. Метод всегда возвращает формально корректную ссылку, даже если объект удалён или никогда не существовал. Такая ссылка называется «битой», и при обращении к её реквизитам вы получите строку вида «<Объект не найден>».
Проверить существование объекта можно запросом — это самый быстрый способ, не требующий чтения всего объекта:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
ОбъектСуществует = Не Запрос.Выполнить().Пустой();
Альтернативный вариант — попытаться получить объект и проверить на Неопределено:
Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
// объекта нет в базе
КонецЕсли;
Способ с ПолучитьОбъект() медленнее, так как читает все данные объекта, но удобен, если объект всё равно нужен для дальнейшей работы.
Как проверить результат
Запрос по ссылке возвращает одну строку
Запрос пуст — объект с таким GUID отсутствует
Выводится наименование или номер объекта
Отображается «<Объект не найден>»
ТипЗнч(Ссылка) соответствует ожидаемому типу
GUID подан в менеджер другого типа
Получение GUID из ссылки и обратное преобразование в обмене
В интеграциях типичен двусторонний сценарий: 1С отдаёт во внешнюю систему GUID объектов, а потом принимает обратно строки идентификаторов для поиска. Важно хранить и передавать GUID в едином строковом формате — стандартном представлении с дефисами в нижнем регистре.
// Отдаём наружу
СтрокаДляВнешнейСистемы = Строка(Ссылка.УникальныйИдентификатор());
// Принимаем обратно
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(
Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы));
Если тип объекта заранее неизвестен (внешняя система присылает идентификаторы разных сущностей), передавайте вместе с GUID имя типа и выбирайте менеджер через Справочники[ИмяТипа] или Документы[ИмяТипа].
При обмене между базами 1С через типовые механизмы (конвертация данных, универсальный формат EnterpriseData) сопоставление по GUID выполняется автоматически, и вручную вызывать ПолучитьСсылку обычно не требуется. Ручная работа нужна при самописных обменах через HTTP, файлы или веб-сервисы.
GUID в запросах и поиск по строковому представлению
Передать GUID в запрос напрямую нельзя — запрос работает со ссылками, а не с идентификаторами. Поэтому строку GUID сначала преобразуют в ссылку через ПолучитьСсылку, а уже ссылку передают параметром. Это стандартный и единственный корректный путь.
Обратная задача — получить GUID в запросе — решается по-разному в зависимости от платформы. В запросе нет функции УникальныйИдентификатор(), поэтому для выгрузки GUID списком обычно выгружают ссылки и затем в цикле вызывают УникальныйИдентификатор() для каждой. При больших объёмах это медленно; альтернатива — вычислять GUID на стороне СУБД или хранить его в дополнительном реквизите, заполняемом при записи.
Если интеграция часто ищет объекты по GUID, добавьте в объект служебный строковый реквизит с идентификатором и проиндексируйте его. Поиск по индексированному реквизиту в запросе работает быстрее и проще, чем преобразование строк в ссылки на каждый запрос, особенно при массовой загрузке данных.
Особые случаи и ограничения
Перечисления и предопределённые значения
У перечислений нет метода ПолучитьСсылку с GUID — значения перечислений определяются в конфигурации и идентифицируются по имени. Попытка применить к ним тот же подход приведёт к ошибке компиляции или выполнения.
Новый объект с заданным GUID
ПолучитьСсылку используют и для создания объекта с заранее известным идентификатором: получают ссылку, устанавливают её новому объекту через УстановитьСсылкуНового(), затем записывают. Так делают при синхронизации, чтобы объект в приёмнике имел тот же GUID, что и в источнике:
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(СсылкаИзИсточника);
НовыйОбъект.Наименование = "Загружено из обмена";
НовыйОбъект.Записать();
Разный порядок байтов в COM и SQL
При работе с GUID через COM-соединение, прямые запросы к SQL или внешние компоненты можно столкнуться с тем, что идентификатор выглядит «перевёрнутым»: группы байтов идут в другом порядке. Это следствие разного представления GUID в платформе 1С и в СУБД. Прямая работа с базой средствами SQL не поддерживается вендором и может нарушить целостность данных — используйте её только для чтения и только понимая риски.
Типичные ошибки при работе с GUID
Отдельно стоит упомянуть производительность: преобразование строки в УникальныйИдентификатор и вызов ПолучитьСсылку — быстрые операции, но в цикле на сотнях тысяч записей вместе с проверками существования они дают заметную нагрузку. Для массовой загрузки группируйте проверки пакетными запросами.
Как выбрать подход под свою задачу
Как выбрать действие
Для разовой отладки удобно использовать консоль кода или внешнюю обработку: вставить строку GUID, выполнить преобразование и сразу посмотреть результат. Для регулярной интеграции оформляйте преобразование в общем модуле с проверками и обработкой ошибок — это избавит от дублирования кода и битых ссылок в данных.
Что важно запомнить
Ссылку по GUID получают методом ПолучитьСсылку у менеджера конкретного типа, предварительно преобразовав строку в УникальныйИдентификатор. Метод не проверяет существование объекта — проверку делайте запросом. GUID привязан к типу: один идентификатор в разных типах даёт разные ссылки. Для создания объекта с заданным GUID используйте УстановитьСсылкуНового.
Частые вопросы
Можно ли получить ссылку по GUID, не зная тип объекта?
Напрямую — нет, потому что ссылка состоит из типа и идентификатора. Практический вариант — перебрать предполагаемые менеджеры (Справочники, Документы), для каждого получить ссылку и проверить запросом, существует ли объект. В интеграциях правильнее передавать имя типа вместе с GUID.
Почему ПолучитьСсылку вернул ссылку, а объекта в базе нет?
Метод не обращается к данным — он просто конструирует ссылку из типа и идентификатора. Если объект удалён или GUID ошибочен, вы получите «битую» ссылку. Проверяйте существование запросом или через ПолучитьОбъект() с проверкой на Неопределено.
Как получить GUID элемента справочника в пользовательском режиме?
Штатной кнопки в интерфейсе нет. Обычно используют внешнюю обработку или консоль кода: открыть ссылку и выполнить Сообщить(Ссылка.УникальныйИдентификатор()). В некоторых конфигурациях GUID выводится в служебных регистрах сопоставления обмена данными.
Меняется ли GUID при переносе объекта между базами?
Зависит от способа переноса. При обмене через типовые механизмы и при создании объекта с УстановитьСсылкуНового идентификатор сохраняется. Если объект просто создать заново в другой базе, платформа назначит новый GUID.
Можно ли использовать GUID в запросе напрямую?
Нет, язык запросов работает со ссылками, а не с идентификаторами, и функции получения GUID в запросе не существует. Сначала преобразуйте строку в ссылку через ПолучитьСсылку в коде, затем передайте ссылку параметром запроса.
Что делать, если GUID из SQL или COM выглядит «перевёрнутым»?
Это различие порядка байтов в представлении идентификатора между платформой и СУБД. Для разовой задачи существуют функции перестановки байтов, но надёжнее получать GUID штатно — через COM-объект 1С, веб-сервис или выгрузку из самой базы, а не прямыми запросами к таблицам.