Разработка и Конфигурация · 9 мин
Как получить ссылку на объект 1С
Как получить ссылку на объект 1С: ПолучитьСсылку(), навигационная ссылка, работа с GUID, поиск по уникальному идентификатору. Примеры кода и типичные ошибки.
Ссылка — это основной способ обращения к объекту базы данных 1С: документу, элементу справочника, записи регистра. Без ссылки невозможно открыть объект для чтения, передать его в запрос, сравнить два значения или записать связанные данные. В зависимости от задачи ссылку получают по-разному: из выборки запроса, через метод ПолучитьСсылку(), по уникальному идентификатору или как навигационную ссылку для передачи пользователю.
Частая путаница возникает из-за того, что словом «ссылка» называют три разные вещи: ссылочное значение встроенного языка (тип СправочникСсылка, ДокументСсылка), уникальный идентификатор GUID и навигационную ссылку вида e1cib/data/..., которую можно отправить коллеге в сообщении. Ниже разобраны все три сценария с примерами кода и ограничениями.
Что такое ссылка в 1С и чем она отличается от объекта
Ссылка — это лёгкое значение, которое содержит только идентификатор объекта и его тип, но не содержит реквизитов. Объект (СправочникОбъект, ДокументОбъект) — это полная копия данных в памяти, которую можно изменять и записывать. Получение объекта через метод ПолучитьОбъект() — дорогая операция: платформа читает все данные из базы. Если нужно только сравнить значения или передать параметр в запрос, достаточно ссылки.
Отдельно существует навигационная ссылка — текстовая строка формата e1cib/data/Справочник.Товары?ref=..., которая открывает объект в клиенте 1С. Её используют, чтобы поделиться объектом с коллегой или вставить в письмо из внешней системы. Навигационная ссылка не является значением встроенного языка и не может участвовать в запросах.
Получение ссылки из запроса и выборки
Самый частый способ — получить ссылку в результате запроса. Поле ссылочного типа, выбранное в запросе, и есть готовая ссылка. Менеджер объекта для этого не нужен:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Товары.Ссылка КАК Ссылка
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Код = &Код";
Запрос.УстановитьПараметр("Код", "000000123");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ТоварСсылка = Выборка.Ссылка;
КонецЕсли;
Аналогично работает метод НайтиПоКоду(), НайтиПоНаименованию() и НайтиПоРеквизиту() у менеджера справочника — все они возвращают ссылку, а не объект. Если ничего не найдено, возвращается пустая ссылка, которую проверяют функцией ЗначениеЗаполнено() или сравнением с Справочники.Товары.ПустаяСсылка().
Получение ссылки по уникальному идентификатору (GUID)
Когда ссылка хранится во внешней системе или в текстовом поле как GUID, её восстанавливают методом ПолучитьСсылку() менеджера объекта:
ИдСтрокой = "b2e0c8f1-3a4d-4e5b-9c6a-1f2d3e4b5a6c";
Ид = Новый УникальныйИдентификатор(ИдСтрокой);
ТоварСсылка = Справочники.Товары.ПолучитьСсылку(Ид);
Важная особенность: ПолучитьСсылку(Ид) не проверяет, существует ли объект в базе. Если объекта с таким GUID нет, метод всё равно вернёт ссылку — «битую». Проверка существования выполняется отдельно, например запросом к полю Ссылка или проверкой реквизита через ОбщегоНазначения.ЗначенияРеквизитовОбъекта() в типовых конфигурациях.
Обратная задача — получить GUID из ссылки — решается свойством УникальныйИдентификатор(): СтрокаГУИД = XMLСтрока(ТоварСсылка.УникальныйИдентификатор()). Это нужно для интеграций, где внешняя система идентифицирует объекты по GUID.
Как получить навигационную ссылку для пользователя
Навигационная ссылка позволяет открыть объект в клиенте 1С по строке. Её получают функцией ПолучитьНавигационнуюСсылку():
НавСсылка = ПолучитьНавигационнуюСсылку(ТоварСсылка);
// Результат: e1cib/data/Справочник.Товары?ref=b2e0...
В тонком и веб-клиенте пользователь может получить навигационную ссылку самостоятельно: в форме объекта через меню «Ещё» → «Получить ссылку» либо сочетанием клавиш (в большинстве версий платформы — Ctrl+F11, зависит от режима). Скопированную строку можно вставить в письмо или мессенджер — получатель откроет её через «Файл» → «Перейти по ссылке» или диалог добавления в избранное.
- 1Откройте нужный объект в клиенте 1С
- 2Нажмите «Ещё» → «Получить ссылку» или сочетание клавиш
- 3Скопируйте строку e1cib/data/... в буфер обмена
- 4Отправьте коллеге; он откроет её через «Перейти по ссылке»
- 5Проверьте, что у получателя есть права на этот объект
Ограничение: навигационная ссылка работает только внутри той же информационной базы. При переносе данных в другую базу (например, из рабочей в тестовую) GUID объектов обычно сохраняется при штатном обмене, но при загрузке «с нуля» может измениться — тогда старые ссылки перестанут открываться.
Ссылка на новый объект до записи
Иногда ссылка нужна до того, как объект записан: например, чтобы заранее заполнить реквизит-владелец у подчинённых данных. Для этого используют ПолучитьСсылку() без параметров и метод УстановитьСсылкуНового():
НовыйТовар = Справочники.Товары.СоздатьЭлемент();
НоваяСсылка = Справочники.Товары.ПолучитьСсылку();
НовыйТовар.УстановитьСсылкуНового(НоваяСсылка);
НовыйТовар.Наименование = "Новая позиция";
НовыйТовар.Записать();
// Теперь НоваяСсылка указывает на записанный объект
Это единственный безопасный способ «заранее» знать ссылку: присвоенный GUID гарантированно совпадёт с тем, под которым объект будет записан. Просто сгенерировать GUID и надеяться, что платформа запишет объект под ним, нельзя — без УстановитьСсылкуНового() платформа назначит идентификатор сама.
Проверка результата и диагностика
После получения ссылки полезно убедиться, что она корректна. Минимальный набор проверок: ссылка не пустая, объект существует в базе, тип соответствует ожидаемому. Тип проверяют функцией ТипЗнч() или сравнением с Тип("СправочникСсылка.Товары").
Как проверить результат
ЗначениеЗаполнено(Ссылка) = Истина
Пустая ссылка — поиск не дал результата
Запрос по ссылке возвращает строку
Запрос пуст — ссылка битая
ТипЗнч совпадает с ожидаемым ссылочным типом
Строка или УникальныйИдентификатор вместо ссылки
Открывается объект в клиенте 1С
Ошибка «объект не найден» или нет прав
Если навигационная ссылка не открывается у коллеги, чаще всего причина в правах доступа или в том, что он работает в другой базе. Если ссылка в коде «пустая», хотя объект в интерфейсе виден, проверьте отбор в запросе: регистр кода, лишние пробелы в наименовании, отбор по владельцу или пометку удаления.
FAQ
Чем ссылка отличается от GUID в 1С?
GUID — это только 16-байтовый идентификатор без информации о типе. Ссылка содержит и GUID, и тип объекта, поэтому платформа знает, в какой таблице искать данные. Из ссылки GUID извлекается свойством УникальныйИдентификатор(), обратно ссылка восстанавливается через менеджер конкретного типа объекта.
Можно ли получить ссылку, не обращаясь к базе данных?
Да, если известен GUID: метод ПолучитьСсылку(Ид) формирует значение без чтения данных. Но такая ссылка не гарантирует существование объекта — проверку нужно делать отдельно перед использованием в записях.
Почему НайтиПоНаименованию() вернул не тот элемент?
Наименование не уникально: в справочнике может быть несколько элементов с одинаковым текстом, и метод вернёт первый попавшийся. Для точного поиска используйте код, GUID или запрос с дополнительными условиями по реквизитам.
Как открыть объект по навигационной ссылке в браузере?
Если база опубликована на веб-сервере, к строке e1cib добавляется адрес публикации, и ссылка открывается в веб-клиенте. Точный формат зависит от настроек публикации; в файловой базе без веб-сервера навигационные ссылки работают только внутри клиентского приложения.
Что делать, если в реквизите оказалась битая ссылка?
Сначала найдите такие записи запросом с соединением, где основная таблица не находит пару. Затем либо восстановите объект по GUID (если есть источник), либо очистите реквизит. Массовую чистку выполняйте на копии базы и с учётом того, что битые ссылки могут участвовать в движениях документов.
Что важно запомнить
Ссылку получают из запроса, методами поиска менеджера или по GUID через ПолучитьСсылку(). Навигационную ссылку для пользователя возвращает ПолучитьНавигационнуюСсылку(). Всегда проверяйте ссылку на пустоту и существование объекта, а для сравнения не вызывайте ПолучитьОбъект() без необходимости.