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

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

ПолучитьСсылку в 1С: что возвращает метод и как с ним работать

Разбираем метод ПолучитьСсылку в 1С 8.3: что он возвращает, синтаксис, примеры кода, типичные ошибки, отличие от НайтиПоСсылке и проверка результата.

Метод ПолучитьСсылку() в платформе 1С:Предприятие 8.3 доступен у менеджеров ссылочных объектов: справочников, документов, планов видов характеристик, планов счетов и планов обмена. Его назначение — получить значение ссылки на объект информационной базы, не обращаясь к самим данным объекта. Это принципиально важно: метод работает быстро и не читает таблицы реквизитов.

Возвращает ПолучитьСсылку значение типа «Ссылка» — например, СправочникСсылка.Номенклатура или ДокументСсылка.РеализацияТоваровУслуг. Если передать конкретный уникальный идентификатор (GUID), метод вернёт ссылку именно с этим идентификатором — независимо от того, существует ли объект с таким GUID в базе на самом деле.

Именно последнее обстоятельство вызывает больше всего вопросов у начинающих разработчиков: метод не проверяет существование объекта и не выдаёт ошибку, если объекта нет. Разберём подробно, что происходит при вызове, чем отличаются варианты использования и как не получить «битую» ссылку в обмене данными.

Что именно возвращает ПолучитьСсылку

Метод вызывается у менеджера объекта и всегда возвращает ссылочное значение соответствующего типа. Пример для справочника:

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

// Тип значения: СправочникСсылка.Номенклатура

// GUID уже сгенерирован, но объект в базе НЕ создан

Важно понимать: возвращаемая ссылка — это только идентификатор, «указатель» на объект. Сам объект с его реквизитами, табличными частями и движениями при этом не создаётся и не загружается. Поэтому вызов метода выполняется практически мгновенно и не нагружает СУБД.

Проверить тип возвращаемого значения можно стандартными средствами:

Сообщить(ТипЗнч(НоваяСсылка)); // Справочник ссылка: Номенклатура

Сообщить(НоваяСсылка.УникальныйИдентификатор()); // GUID ссылки

Два режима работы: с параметром и без

Вызов без параметров — новый GUID

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

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

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

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

НовыйОбъект.Наименование = "ООО Ромашка";

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

Здесь связка ПолучитьСсылку() + УстановитьСсылкуНового() позволяет узнать GUID объекта до его записи. Это удобно, когда в одной транзакции нужно создать несколько связанных объектов и проставить между ними ссылки.

Вызов с GUID — ссылка на существующий (или нет) объект

Второй вариант — передать строку с уникальным идентификатором:

Идентификатор = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

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

Метод просто «оборачивает» переданный GUID в ссылку нужного типа. Платформа не выполняет запрос к базе и не проверяет, есть ли документ с таким идентификатором. Если объекта нет — вы получите ссылку на несуществующий объект, и никакого исключения не возникнет.

Как проверить, существует ли объект по ссылке

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

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка";

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

Если Запрос.Выполнить().Пустой() Тогда

// Объекта нет в базе

КонецЕсли;

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

Объект = Ссылка.ПолучитьОбъект();

Если Объект = Неопределено Тогда

// «Битая» ссылка — объект отсутствует

КонецЕсли;

Первый вариант предпочтительнее при массовых проверках: запрос не выгружает данные объекта целиком. Второй проще для разовой проверки в коде.

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

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

Тип возвращённого значения
Норма

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

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

Неопределено или строка

Существование объекта по ссылке
Норма

Запрос по ссылке возвращает строку

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

Запрос пустой — ссылка «битая»

GUID ссылки
Норма

Совпадает с переданным идентификатором

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

GUID отличается — проверьте формат строки GUID

Типичное применение: обмен данными и синхронизация

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

Ссылка = Справочники.Номенклатура.ПолучитьСсылку(

Новый УникальныйИдентификатор(GUIDИзСообщения));

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда

// Создаём новый элемент с этим же GUID

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

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

Иначе

НовыйОбъект = Ссылка.ПолучитьОбъект();

КонецЕсли;

// Заполняем реквизиты и записываем

Такой подход обеспечивает идентичность ссылок в разных базах: один и тот же товар будет иметь одинаковый GUID и в учётной системе, и на сайте, и в складской программе. Это основа большинства нетиповых интеграций через HTTP-сервисы, файлы XML/JSON и очереди сообщений.

При передаче GUID строкой следите за регистром и форматом: строка должна соответствовать шаблону xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Конструктор Новый УникальныйИдентификатор вызовет исключение на некорректной строке — оберните его в Попытка/Исключение при разборе внешних данных.
ПЗ
Практическое замечание

Отличие от похожих методов

Начинающие разработчики часто путают ПолучитьСсылку с другими способами получения ссылок. Различия принципиальны:

МетодЧто делаетОбращение к БДЕсли объекта нет
ПолучитьСсылку()Генерирует новый GUIDНет—
ПолучитьСсылку(GUID)Оборачивает GUID в ссылкуНетВернёт «битую» ссылку
НайтиПоКоду() / НайтиПоНаименованию()Ищет объект по реквизитуДаВернёт пустую ссылку
Ссылка.ПолучитьОбъект()Загружает объект целикомДаВернёт Неопределено
ПустаяСсылка()Возвращает пустую ссылку типаНет—

Ключевое отличие: методы поиска (НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту) выполняют запрос к базе и гарантированно возвращают либо существующую ссылку, либо пустую. ПолучитьСсылку работает только с идентификатором и ничего не ищет.

Сравнение вариантов

ПолучитьСсылку(GUID)

Подходит для обмена по GUID и создания объектов с заданным идентификатором. Не проверяет существование.

НайтиПоКоду / НайтиПоНаименованию

Подходит для поиска по прикладным данным. Медленнее, но результат гарантированно существует или ссылка пустая.

Запрос с условием по ссылке

Подходит для массовой проверки существования. Один запрос может проверить таблицу из тысяч ссылок.

Типичные ошибки и ограничения

Первая ошибка — ожидание, что метод вернёт Неопределено или пустую ссылку для несуществующего объекта. Этого не происходит никогда: метод детерминированно строит ссылку из GUID. Проверку существования нужно реализовывать отдельно.

Вторая ошибка — чтение реквизитов через ссылку без проверки: Ссылка.Наименование для «битой» ссылки вызывает обращение к базе и возвращает Неопределено (в управляемом коде) либо приводит к ошибкам логики. В журнале регистрации это часто проявляется как записи вида «Объект не найден» с GUID.

Третья ошибка — использование ПолучитьСсылку() без параметров и последующая запись объекта без УстановитьСсылкуНового(). В этом случае сгенерированная ссылка просто теряется, а объект при записи получит другой GUID, что ломает заранее построенные связи.

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

Производительность и безопасные сценарии

Сам по себе вызов ПолучитьСсылку не выполняет SQL-запросов и стоит практически ничего. Проблемы с производительностью возникают не из-за метода, а из-за того, что делают с результатом: массовые вызовы ПолучитьОбъект() в цикле, обращения к реквизитам через точку в запросах без необходимости, запись объектов по одному вместо пакетной обработки.

Безопасный шаблон для массовой обработки: сначала собрать все GUID в таблицу значений, одним запросом через временную таблицу определить, какие объекты существуют, и только потом создавать недостающие. Это сокращает число обращений к СУБД с тысяч до единиц.

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

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

Нужно создать объект с заранее известной ссылкойВызовите ПолучитьСсылку() без параметров и передайте результат в УстановитьСсылкуНового
Из внешней системы пришёл GUID объектаИспользуйте ПолучитьСсылку(GUID), затем проверьте существование через ПолучитьОбъект или запрос
Нужно найти объект по коду или наименованиюИспользуйте НайтиПоКоду / НайтиПоНаименованию, а не ПолучитьСсылку
Нужно проверить тысячи ссылок на существованиеСоберите ссылки во временную таблицу и выполните один запрос с соединением

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

Что возвращает ПолучитьСсылку, если объекта с таким GUID нет в базе?

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

Можно ли использовать ПолучитьСсылку для документов?

Да, метод доступен у менеджеров всех ссылочных типов: Документы.ИмяДокумента.ПолучитьСсылку(), Справочники, ПланыВидовХарактеристик, ПланыСчетов, ПланыОбмена. Поведение идентично — возвращается ссылка соответствующего типа.

Чем ПолучитьСсылку отличается от НайтиПоСсылке?

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

Зачем нужен вызов ПолучитьСсылку() без параметров?

Чтобы получить GUID будущего объекта до его записи. Это нужно, когда в одной транзакции создаются связанные объекты: сначала генерируются ссылки, потом объекты записываются с уже проставленными связями через УстановитьСсылкуНового.

Влияет ли ПолучитьСсылку на производительность базы?

Нет, метод не выполняет запросов к СУБД. Нагрузку создают последующие действия с полученной ссылкой: ПолучитьОбъект, обращение к реквизитам, запись. При массовой обработке заменяйте циклические обращения пакетными запросами.

Как получить GUID из ссылки обратно?

Методом УникальныйИдентификатор(): СтрокаGUID = Ссылка.УникальныйИдентификатор(). Результат можно передать в другую систему, а там восстановить ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)).

Итог

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

ПолучитьСсылку возвращает ссылочное значение (СправочникСсылка, ДокументСсылка и т.д.) и не обращается к базе. Без параметра — генерирует новый GUID для будущего объекта, с параметром — оборачивает заданный GUID без проверки существования. Существование объекта проверяйте запросом или ПолучитьОбъект(), а при создании объекта с заданной ссылкой не забывайте УстановитьСсылкуНового.