Разработка и Конфигурация · 11 мин
Как получить ссылку реквизита в 1С
Разбираем, как получить ссылку реквизита в 1С: методы ПолучитьСсылку, НайтиПоНаименованию, навигационные ссылки, типичные ошибки и примеры кода.
Под «ссылкой реквизита» в 1С обычно понимают одно из двух: программную ссылку на объект базы данных (элемент справочника, документ), который хранится в реквизите, или навигационную ссылку — строку вида e1cib/data/..., по которой объект открывается в браузере или другом сеансе. Оба смысла встречаются на практике, и способы получения различаются.
Ссылка — это не сам объект, а указатель на него. Через ссылку нельзя напрямую прочитать или изменить реквизиты: для этого ссылку превращают в объект методом ПолучитьОбъект(). Понимание этой разницы — ключ к корректной работе с данными и к устранению типовой ошибки «Поле объекта не обнаружено».
Ниже разобраны основные сценарии: получение ссылки из реквизита формы и запроса, создание ссылки по уникальному идентификатору, работа с навигационными ссылками, проверка битых ссылок и ограничения каждого подхода.
Что такое ссылка в 1С и чем она отличается от объекта
Ссылка — это легковесное значение, содержащее тип объекта и его уникальный идентификатор (GUID). Она занимает мало памяти, быстро передаётся между процедурами и используется в реквизитах других объектов для связи данных. Когда в документе «Реализация» заполнен реквизит «Контрагент», в базе хранится именно ссылка на элемент справочника.
Объект — это полная копия данных в памяти со всеми реквизитами, табличными частями и методами записи. Объект получают вызовом Ссылка.ПолучитьОбъект(), что требует обращения к базе. Поэтому массовое преобразование ссылок в объекты в цикле — частая причина медленной работы обработок.
Как получить ссылку из реквизита объекта или формы
Если у вас уже есть объект или данные формы, ссылка на связанный объект читается напрямую из реквизита — никаких дополнительных методов не требуется. Значение реквизита ссылочного типа и есть ссылка.
// Ссылка из реквизита объекта
СсылкаНаКонтрагента = ДокументОбъект.Контрагент;
// Ссылка на сам объект
СсылкаНаДокумент = ДокументОбъект.Ссылка;
// Ссылка из реквизита формы (управляемая форма)
СсылкаНаОрганизацию = Объект.Организация;
На управляемой форме реквизит с типом «ДанныеФормыСтруктура» хранит ссылку в поле Ссылка — это основной способ узнать, какой объект редактируется. Для нового, ещё не записанного объекта ссылка будет пустой, и это нужно учитывать в проверках.
Для проверки, заполнена ли ссылка, используют функцию ЗначениеЗаполнено() или сравнение с пустой ссылкой: Если Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда ....
Как получить ссылку через запрос
В запросах ссылка извлекается обращением к полю реквизита. Это самый производительный способ массового получения ссылок: данные выбираются одним обращением к базе без создания объектов.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ,
| Реализация.Контрагент КАК КонтрагентСсылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &Начало И &Конец";
Поля Документ и КонтрагентСсылка в выборке будут содержать готовые ссылки. Их можно передавать в параметры других запросов, сравнивать, сохранять в таблицы значений. Обращение к реквизитам «через точку» (например, Реализация.Контрагент.ИНН) тоже работает, но порождает неявные соединения таблиц — при больших объёмах это замедляет запрос.
Как получить ссылку по уникальному идентификатору
Когда известен GUID объекта — например, он пришёл из внешней системы по обмену — ссылку создают методом ПолучитьСсылку() менеджера соответствующего типа. При этом обращения к базе не происходит: ссылка формируется «вслепую».
Идентификатор = Новый УникальныйИдентификатор("8b3a9c1e-...");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Обратная задача — узнать GUID существующей ссылки — решается свойством УникальныйИдентификатор(). Именно так строят сопоставление объектов при интеграциях.
Важный нюанс: полученная таким способом ссылка может указывать на несуществующий объект. Проверить это помогает сравнение Ссылка.ПолучитьОбъект() = Неопределено или запрос по ссылке. Подробнее — в разделе про битые ссылки.
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
// объекта с таким GUID нет в базе
КонецЕсли;Как получить навигационную ссылку для открытия объекта извне
Навигационная ссылка — это строка, которую можно отправить коллеге по почте или вставить в браузер: при переходе откроется нужный объект в тонком или веб-клиенте. Её возвращает функция ПолучитьНавигационнуюСсылку().
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаДокумент);
// Результат вида: e1cib/data/Документ.РеализацияТоваровУслуг?ref=...
Для формирования полного адреса, доступного извне, навигационную ссылку объединяют с адресом публикации информационной базы. В типовых конфигурациях есть готовые механизмы: например, команда «Получить ссылку» в меню «Ещё» формы объекта или кнопка копирования ссылки в общих командах.
В пользовательском режиме навигационную ссылку можно скопировать без программирования: откройте объект и выберите команду получения ссылки — строка попадёт в буфер обмена. Это удобно для согласований и переписки.
Как найти ссылку поиском по данным
Если GUID неизвестен, ссылку ищут по реквизитам: коду, наименованию, номеру документа. Менеджеры объектов предоставляют методы НайтиПоКоду(), НайтиПоНаименованию(), для документов — НайтиПоНомеру().
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка", Истина);
Если Ссылка.Пустая() Тогда
// не найдено — создаём или сообщаем пользователю
КонецЕсли;
Методы поиска возвращают пустую ссылку, если объект не найден, — это штатная ситуация, а не ошибка. Для сложных условий поиска (по нескольким реквизитам, по периоду) надёжнее использовать запрос с отбором и взять поле Ссылка из результата.
Как выбрать способ получения ссылки
Проверка результата и битые ссылки
Битая ссылка — это ссылка, указывающая на удалённый или несуществующий объект. В интерфейсе она отображается как «<Объект не найден> (…)». Такие ссылки появляются после прямого удаления объектов без контроля ссылочной целостности или после обменов.
Программно битая ссылка определяется тем, что ПолучитьОбъект() возвращает Неопределено. Для массовой проверки эффективнее запрос: выбрать ссылки, для которых соединение с таблицей объекта дало NULL.
Как проверить полученную ссылку
ТипЗнч возвращает ожидаемый ссылочный тип, например СправочникСсылка.Номенклатура
Тип — строка или Неопределено: ссылка не получена
ЗначениеЗаполнено(Ссылка) = Истина
Пустая ссылка — поиск не дал результата или реквизит не заполнен
Ссылка.ПолучитьОбъект() возвращает объект
Возвращается Неопределено — ссылка битая
Объект открывается в клиенте по ссылке
Ошибка открытия — проверьте адрес публикации базы и права пользователя
Типичные ошибки и ограничения
Самая частая ошибка — попытка прочитать реквизит через ссылку в контексте, где это недопустимо, или обращение к свойству объекта, когда в переменной только ссылка. В управляемых формах на клиенте возможности ссылки ограничены: многие операции требуют серверного вызова.
Вторая группа ошибок — работа с GUID как со строкой без преобразования: метод ПолучитьСсылку() принимает именно значение типа УникальныйИдентификатор, а не произвольный текст. Строку нужно явно преобразовать конструктором.
Сравнение способов получения ссылки
| Способ | Когда применять | Ограничение |
|---|---|---|
| Чтение реквизита | Ссылка уже хранится в объекте или форме | Требует наличия объекта или данных формы |
| Запрос | Массовое получение, сложные отборы | Нужно знать структуру метаданных |
| НайтиПоКоду / НайтиПоНаименованию | Точечный поиск по известному значению | Неточный при дублях наименований |
| ПолучитьСсылку(GUID) | Интеграции и обмены по GUID | Не гарантирует существование объекта |
| ПолучитьНавигационнуюСсылку | Передача ссылки пользователю, открытие извне | Требует корректной публикации базы |
Выбор зависит от исходных данных: если есть хоть какое-то значение для поиска — начинайте с запроса или методов поиска; если есть GUID — с ПолучитьСсылку(); если задача пользовательская («отправить коллеге») — с навигационной ссылки.
Что важно запомнить
Ссылка — это указатель на объект, а не сам объект. Из реквизита она читается напрямую, по GUID создаётся методом ПолучитьСсылку, поиском — НайтиПоНаименованию или запросом, для внешнего открытия — ПолучитьНавигационнуюСсылку. Всегда проверяйте ссылку на заполненность и существование объекта.
Частые вопросы
Чем ссылка отличается от объекта в 1С?
Ссылка содержит только тип и уникальный идентификатор объекта и служит для идентификации и связей. Объект — полная копия данных в памяти с возможностью изменения и записи. Объект получают из ссылки методом ПолучитьОбъект(), что требует обращения к базе.
Как узнать GUID существующей ссылки?
Вызовите метод УникальныйИдентификатор() у ссылки: ГУИД = Ссылка.УникальныйИдентификатор();. Результат можно преобразовать в строку для передачи во внешние системы.
Почему НайтиПоНаименованию вернул пустую ссылку?
Объект с таким наименованием не найден: проверьте точность строки (пробелы, регистр не влияют, но лишние символы — да), признак точного соответствия и отбор по владельцу или пометке удаления, если они заданы параметрами метода.
Как проверить, битая ли ссылка?
Сравните результат Ссылка.ПолучитьОбъект() с Неопределено: если возвращено Неопределено — объекта в базе нет. Для массовой проверки используйте запрос с левым соединением к таблице объекта и отбором по NULL.
Можно ли получить ссылку на ещё не записанный объект?
Да, методом ПолучитьСсылку() у объекта перед записью или назначив ссылку заранее через УстановитьСсылкуНового(). Это используют при обменах, чтобы сохранить GUID из системы-источника.
Как открыть объект по навигационной ссылке из браузера?
Добавьте навигационную ссылку к адресу публикации базы на веб-сервере и перейдите по полученному URL. Потребуется аутентификация пользователя с правами на просмотр соответствующего объекта.