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

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

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

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

Под «ссылкой реквизита» в 1С обычно понимают одно из двух: программную ссылку на объект базы данных (элемент справочника, документ), который хранится в реквизите, или навигационную ссылку — строку вида e1cib/data/..., по которой объект открывается в браузере или другом сеансе. Оба смысла встречаются на практике, и способы получения различаются.

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

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

Что такое ссылка в 1С и чем она отличается от объекта

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

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

Как получить ссылку из реквизита объекта или формы

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

// Ссылка из реквизита объекта

СсылкаНаКонтрагента = ДокументОбъект.Контрагент;

// Ссылка на сам объект

СсылкаНаДокумент = ДокументОбъект.Ссылка;

// Ссылка из реквизита формы (управляемая форма)

СсылкаНаОрганизацию = Объект.Организация;

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

Для проверки, заполнена ли ссылка, используют функцию ЗначениеЗаполнено() или сравнение с пустой ссылкой: Если Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда ....

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

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

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

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка КАК Документ,

| Реализация.Контрагент КАК КонтрагентСсылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Дата МЕЖДУ &Начало И &Конец";

Поля Документ и КонтрагентСсылка в выборке будут содержать готовые ссылки. Их можно передавать в параметры других запросов, сравнивать, сохранять в таблицы значений. Обращение к реквизитам «через точку» (например, Реализация.Контрагент.ИНН) тоже работает, но порождает неявные соединения таблиц — при больших объёмах это замедляет запрос.

Как получить ссылку по уникальному идентификатору

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

Идентификатор = Новый УникальныйИдентификатор("8b3a9c1e-...");

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

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

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

bsl
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
	// объекта с таким GUID нет в базе
КонецЕсли;

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

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

НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаДокумент);

// Результат вида: e1cib/data/Документ.РеализацияТоваровУслуг?ref=...

Для формирования полного адреса, доступного извне, навигационную ссылку объединяют с адресом публикации информационной базы. В типовых конфигурациях есть готовые механизмы: например, команда «Получить ссылку» в меню «Ещё» формы объекта или кнопка копирования ссылки в общих командах.

В пользовательском режиме навигационную ссылку можно скопировать без программирования: откройте объект и выберите команду получения ссылки — строка попадёт в буфер обмена. Это удобно для согласований и переписки.

Как найти ссылку поиском по данным

Если GUID неизвестен, ссылку ищут по реквизитам: коду, наименованию, номеру документа. Менеджеры объектов предоставляют методы НайтиПоКоду(), НайтиПоНаименованию(), для документов — НайтиПоНомеру().

Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка", Истина);

Если Ссылка.Пустая() Тогда

// не найдено — создаём или сообщаем пользователю

КонецЕсли;

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

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

Как выбрать способ получения ссылки

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

Проверка результата и битые ссылки

Битая ссылка — это ссылка, указывающая на удалённый или несуществующий объект. В интерфейсе она отображается как «<Объект не найден> (…)». Такие ссылки появляются после прямого удаления объектов без контроля ссылочной целостности или после обменов.

Программно битая ссылка определяется тем, что ПолучитьОбъект() возвращает Неопределено. Для массовой проверки эффективнее запрос: выбрать ссылки, для которых соединение с таблицей объекта дало NULL.

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

Как проверить полученную ссылку

Тип значения
Норма

ТипЗнч возвращает ожидаемый ссылочный тип, например СправочникСсылка.Номенклатура

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

Тип — строка или Неопределено: ссылка не получена

Заполненность
Норма

ЗначениеЗаполнено(Ссылка) = Истина

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

Пустая ссылка — поиск не дал результата или реквизит не заполнен

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

Ссылка.ПолучитьОбъект() возвращает объект

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

Возвращается Неопределено — ссылка битая

Открытие навигационной ссылки
Норма

Объект открывается в клиенте по ссылке

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

Ошибка открытия — проверьте адрес публикации базы и права пользователя

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

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

Вторая группа ошибок — работа с GUID как со строкой без преобразования: метод ПолучитьСсылку() принимает именно значение типа УникальныйИдентификатор, а не произвольный текст. Строку нужно явно преобразовать конструктором.

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

Сравнение способов получения ссылки

СпособКогда применятьОграничение
Чтение реквизитаСсылка уже хранится в объекте или формеТребует наличия объекта или данных формы
ЗапросМассовое получение, сложные отборыНужно знать структуру метаданных
НайтиПоКоду / НайтиПоНаименованиюТочечный поиск по известному значениюНеточный при дублях наименований
ПолучитьСсылку(GUID)Интеграции и обмены по GUIDНе гарантирует существование объекта
ПолучитьНавигационнуюСсылкуПередача ссылки пользователю, открытие извнеТребует корректной публикации базы

Выбор зависит от исходных данных: если есть хоть какое-то значение для поиска — начинайте с запроса или методов поиска; если есть GUID — с ПолучитьСсылку(); если задача пользовательская («отправить коллеге») — с навигационной ссылки.

Итог

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

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

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

Чем ссылка отличается от объекта в 1С?

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

Как узнать GUID существующей ссылки?

Вызовите метод УникальныйИдентификатор() у ссылки: ГУИД = Ссылка.УникальныйИдентификатор();. Результат можно преобразовать в строку для передачи во внешние системы.

Почему НайтиПоНаименованию вернул пустую ссылку?

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

Как проверить, битая ли ссылка?

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

Можно ли получить ссылку на ещё не записанный объект?

Да, методом ПолучитьСсылку() у объекта перед записью или назначив ссылку заранее через УстановитьСсылкуНового(). Это используют при обменах, чтобы сохранить GUID из системы-источника.

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

Добавьте навигационную ссылку к адресу публикации базы на веб-сервере и перейдите по полученному URL. Потребуется аутентификация пользователя с правами на просмотр соответствующего объекта.