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

Справочники и Данные · 11 мин

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

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

Ссылка на справочник в 1С — это объект типа СправочникСсылка.<ИмяСправочника>, который указывает на конкретный элемент справочника без загрузки всего его содержимого в память. Получить такую ссылку нужно в десятках задач: при записи документов, обмене данными, программном поиске элементов, передаче параметров между формами и формировании отчётов.

Путаница возникает из-за того, что «ссылкой» называют три разные вещи: объект встроенного языка СправочникСсылка, уникальный идентификатор (GUID) элемента и навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=..., которую можно вставить в браузер или передать коллеге. Каждый вариант получается своим способом и решает свою задачу.

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

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

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

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

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

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

Простейший случай — вам нужно отправить коллеге ссылку на конкретный элемент, чтобы он открыл его у себя в той же базе. В управляемом интерфейсе это делается штатно.

Как скопировать ссылку на элемент справочника
  1. 1
    Откройте нужный элемент справочника в режиме предприятия
  2. 2
    Нажмите кнопку «Ещё» в командной панели формы
  3. 3
    Выберите пункт «Получить ссылку» (или нажмите Ctrl+F11)
  4. 4
    В открывшемся окне скопируйте навигационную ссылку кнопкой «Скопировать»
  5. 5
    Передайте ссылку коллеге — он вставит её через «Ещё → Перейти по ссылке» или Ctrl+F11 в главном окне

Полученная строка имеет вид e1cib/data/Справочник.Номенклатура?ref=9ff50050568dcb2d11ee.... Она работает только внутри той же информационной базы: если базу опубликовали на веб-сервере, ссылку можно открыть и в браузере, дополнив адресом базы, но в другой базе она бесполезна.

Если пункт «Получить ссылку» недоступен, проверьте права: у пользователя должно быть право просмотра этого справочника. Также ссылку нельзя получить для ещё не записанного (нового) элемента — сначала выполните «Записать».

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

Во встроенном языке ссылку получают через менеджер справочника. Ниже — три рабочих сценария, которые покрывают большинство задач.

Ссылка из нового или существующего объекта

Если у вас уже есть объект справочника (например, вы создали его программно), ссылка доступна через свойство Ссылка:

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

НовыйЭлемент.Наименование = "Тестовая позиция";

НовыйЭлемент.Записать();

СсылкаНаЭлемент = НовыйЭлемент.Ссылка;

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

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

Когда известен GUID элемента — например, он пришёл из другой базы при обмене или хранится в регистре соответствий — ссылку получают так:

Идентификатор = Новый УникальныйИдентификатор("9ff50050-568d-cb2d-11ee-...");

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

Ссылка через поиск элемента

Чаще всего элемент ищут по коду, наименованию или реквизиту, а затем берут его ссылку:

СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000001234");

Если СсылкаНаЭлемент.Пустая() Тогда

// элемент не найден — создаём или сообщаем об ошибке

КонецЕсли;

Методы НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту сразу возвращают ссылку, а не объект — это быстрый способ без чтения данных элемента. Для сложных условий поиска используйте запрос с выборкой поля Ссылка.

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

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

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

// результат: e1cib/data/Справочник.Номенклатура?ref=...

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

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

Как узнать GUID элемента и найти элемент по GUID

Обратная задача решается методом УникальныйИдентификатор():

Идентификатор = СсылкаНаЭлемент.УникальныйИдентификатор();

СтрокаGUID = Строка(Идентификатор); // для передачи в другую систему

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

Проверка существования делается двумя способами. Надёжнее — запросом:

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

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

ЭлементСуществует = Не Запрос.Выполнить().Пустой();

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

Как проверить результат и не создать проблем в данных

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

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

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

Ссылка не пустая
Норма

Ссылка.Пустая() возвращает Ложь

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

Пустая ссылка — элемент не найден или не записан

Элемент существует в базе
Норма

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

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

Пустой результат запроса — «битая» ссылка

Пометка удаления
Норма

Ссылка.ПометкаУдаления = Ложь

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

Элемент помечен на удаление — использование в новых документах нежелательно

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

Через «Перейти по ссылке» открывается нужный элемент

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

Ошибка открытия или открывается другой объект — GUID из другой базы

Если «битые» ссылки уже появились в базе, их находят типовой обработкой поиска и удаления помеченных объектов либо запросом с конструкцией ГДЕ Реквизит.Ссылка ЕСТЬ NULL для соединений. В клиент-серверном варианте массовую чистку лучше выполнять в монопольном режиме после резервной копии.

Какой способ выбрать под свою задачу

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

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

Нужно отправить коллеге ссылку на элемент в той же базеИспользуйте «Ещё → Получить ссылку» (Ctrl+F11) в режиме предприятия
Нужна ссылка в коде из уже созданного объектаВозьмите свойство Ссылка после вызова Записать()
Есть GUID из обмена или внешней системыИспользуйте ПолучитьСсылку(УникальныйИдентификатор) с обязательной проверкой существования
Элемент нужно найти по известным даннымИспользуйте НайтиПоКоду, НайтиПоНаименованию или запрос с выборкой поля Ссылка
Нужен адрес для письма или браузераСформируйте ПолучитьНавигационнуюСсылку() и добавьте URL опубликованной базы

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

Итог

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

Ссылка на справочник — это лёгкий указатель на элемент, а не его данные. Программно её получают через свойство Ссылка, метод ПолучитьСсылку по GUID или поиск; в пользовательском режиме — через «Получить ссылку» (Ctrl+F11). Любую ссылку, полученную по идентификатору извне, проверяйте на существование, чтобы не создать «битые» значения.

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

Чем пустая ссылка отличается от «битой»?

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

Можно ли получить ссылку на предопределённый элемент?

Да, через имя предопределённого элемента: Справочники.Валюты.НайтиПредопределенный("RUB") или обращение Справочники.Валюты.Рубли, если имя задано в конфигураторе. Оба способа возвращают готовую ссылку без поиска по базе.

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

Точно так же, как на элемент: группа — это тоже элемент иерархического справочника, просто с признаком ЭтоГруппа. Создаётся группа методом СоздатьГруппу(), а ссылка берётся из свойства Ссылка после записи.

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

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

Как передать ссылку между сеансами или сохранить в файл?

Сериализуйте её через ЗначениеВСтрокуВнутр(Ссылка) — получится строка, которую можно сохранить и восстановить обратно через ЗначениеИзСтрокиВнутр. Для обмена с внешними системами вместо этого используйте строковое представление GUID.

Работает ли навигационная ссылка в файловой базе?

Да, внутри той же базы ссылка вида e1cib/data/... работает и в файловом варианте — через «Перейти по ссылке». Для открытия в браузере базу нужно опубликовать на веб-сервере, тогда к ссылке добавляется адрес публикации.