Справочники и Данные · 11 мин
Как получить ссылку на справочник в 1С
Разбираем, как получить ссылку на справочник в 1С: метод ПолучитьСсылку, уникальный идентификатор, навигационная ссылка и поиск элемента по GUID.
Ссылка на справочник в 1С — это объект типа СправочникСсылка.<ИмяСправочника>, который указывает на конкретный элемент справочника без загрузки всего его содержимого в память. Получить такую ссылку нужно в десятках задач: при записи документов, обмене данными, программном поиске элементов, передаче параметров между формами и формировании отчётов.
Путаница возникает из-за того, что «ссылкой» называют три разные вещи: объект встроенного языка СправочникСсылка, уникальный идентификатор (GUID) элемента и навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=..., которую можно вставить в браузер или передать коллеге. Каждый вариант получается своим способом и решает свою задачу.
Материал подходит для конфигураций на управляемых и обычных формах (1С:Предприятие 8.2 и 8.3). Примеры кода работают в модуле формы, общем модуле или внешней обработке — контекст выполнения указан отдельно для каждого способа.
Что такое ссылка на справочник и чем она отличается от объекта
В 1С элемент справочника существует в двух ипостасях. Ссылка — это лёгкий указатель: она содержит только идентификатор элемента и имя таблицы. Ссылку можно сравнивать, присваивать реквизитам, передавать в запросы — при этом данные элемента из базы не читаются.
Объект (СправочникОбъект) — это полная копия данных элемента в памяти: все реквизиты, табличные части, возможность изменения и записи. Объект получают из ссылки методом ПолучитьОбъект(), и это дорогая операция — она читает данные из базы.
Практическое следствие: если нужно только проверить, что реквизит документа заполнен, или сравнить два элемента — работайте со ссылкой. Обращение к реквизитам через точку от ссылки (Ссылка.Наименование) тоже выполняет чтение из базы, поэтому в циклах и запросах так делать не стоит.
Как получить ссылку в пользовательском режиме без программирования
Простейший случай — вам нужно отправить коллеге ссылку на конкретный элемент, чтобы он открыл его у себя в той же базе. В управляемом интерфейсе это делается штатно.
- 1Откройте нужный элемент справочника в режиме предприятия
- 2Нажмите кнопку «Ещё» в командной панели формы
- 3Выберите пункт «Получить ссылку» (или нажмите Ctrl+F11)
- 4В открывшемся окне скопируйте навигационную ссылку кнопкой «Скопировать»
- 5Передайте ссылку коллеге — он вставит её через «Ещё → Перейти по ссылке» или Ctrl+F11 в главном окне
Полученная строка имеет вид e1cib/data/Справочник.Номенклатура?ref=9ff50050568dcb2d11ee.... Она работает только внутри той же информационной базы: если базу опубликовали на веб-сервере, ссылку можно открыть и в браузере, дополнив адресом базы, но в другой базе она бесполезна.
Если пункт «Получить ссылку» недоступен, проверьте права: у пользователя должно быть право просмотра этого справочника. Также ссылку нельзя получить для ещё не записанного (нового) элемента — сначала выполните «Записать».
Как получить ссылку программно: основные способы
Во встроенном языке ссылку получают через менеджер справочника. Ниже — три рабочих сценария, которые покрывают большинство задач.
Ссылка из нового или существующего объекта
Если у вас уже есть объект справочника (например, вы создали его программно), ссылка доступна через свойство Ссылка:
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовая позиция";
НовыйЭлемент.Записать();
СсылкаНаЭлемент = НовыйЭлемент.Ссылка;
Для нового, ещё не записанного объекта свойство Ссылка вернёт пустую ссылку. Если идентификатор нужен до записи (например, чтобы заранее заполнить реквизит другого объекта), используйте пару методов ПолучитьСсылкуНового() и УстановитьСсылкуНового().
Ссылка по уникальному идентификатору
Когда известен GUID элемента — например, он пришёл из другой базы при обмене или хранится в регистре соответствий — ссылку получают так:
Идентификатор = Новый УникальныйИдентификатор("9ff50050-568d-cb2d-11ee-...");
СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Ссылка через поиск элемента
Чаще всего элемент ищут по коду, наименованию или реквизиту, а затем берут его ссылку:
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000001234");
Если СсылкаНаЭлемент.Пустая() Тогда
// элемент не найден — создаём или сообщаем об ошибке
КонецЕсли;
Методы НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту сразу возвращают ссылку, а не объект — это быстрый способ без чтения данных элемента. Для сложных условий поиска используйте запрос с выборкой поля Ссылка.
Как получить навигационную ссылку программно
Навигационная ссылка нужна, чтобы сформировать адрес, по которому элемент откроется в клиентском приложении или браузере. Для этого есть функция глобального контекста:
НавСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаЭлемент);
// результат: e1cib/data/Справочник.Номенклатура?ref=...
Функция принимает ссылку на любой объект базы — элемент справочника, документ, запись регистра сведений (с ключом записи). Дополнительным параметром можно указать имя реквизита, чтобы ссылка вела на конкретное поле элемента.
Типовой сценарий — рассылка уведомлений из базы: в текст письма вставляют полный адрес, собранный из строки подключения и навигационной ссылки, чтобы получатель открыл элемент одним кликом.
Как узнать GUID элемента и найти элемент по GUID
Обратная задача решается методом УникальныйИдентификатор():
Идентификатор = СсылкаНаЭлемент.УникальныйИдентификатор();
СтрокаGUID = Строка(Идентификатор); // для передачи в другую систему
При обмене между базами GUID — главный ключ сопоставления. Типовая схема: в базе-источнике выгружают строку GUID, в базе-приёмнике выполняют ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) и проверяют существование элемента.
Проверка существования делается двумя способами. Надёжнее — запросом:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлемент);
ЭлементСуществует = Не Запрос.Выполнить().Пустой();
Как проверить результат и не создать проблем в данных
После получения ссылки убедитесь, что она рабочая, прежде чем записывать её в реквизиты документов или регистров. Ориентируйтесь на контрольные точки ниже.
Как проверить результат
Ссылка.Пустая() возвращает Ложь
Пустая ссылка — элемент не найден или не записан
Запрос по ссылке возвращает строку
Пустой результат запроса — «битая» ссылка
Ссылка.ПометкаУдаления = Ложь
Элемент помечен на удаление — использование в новых документах нежелательно
Через «Перейти по ссылке» открывается нужный элемент
Ошибка открытия или открывается другой объект — GUID из другой базы
Если «битые» ссылки уже появились в базе, их находят типовой обработкой поиска и удаления помеченных объектов либо запросом с конструкцией ГДЕ Реквизит.Ссылка ЕСТЬ NULL для соединений. В клиент-серверном варианте массовую чистку лучше выполнять в монопольном режиме после резервной копии.
Какой способ выбрать под свою задачу
Как выбрать действие
Ключевой критерий выбора — откуда у вас исходные данные. Есть объект — берите свойство Ссылка. Есть GUID — ПолучитьСсылку. Есть только человекочитаемые данные (код, наименование) — поиск. Есть только задача «показать пользователю» — навигационная ссылка.
Что важно запомнить
Ссылка на справочник — это лёгкий указатель на элемент, а не его данные. Программно её получают через свойство Ссылка, метод ПолучитьСсылку по GUID или поиск; в пользовательском режиме — через «Получить ссылку» (Ctrl+F11). Любую ссылку, полученную по идентификатору извне, проверяйте на существование, чтобы не создать «битые» значения.
Частые вопросы
Чем пустая ссылка отличается от «битой»?
Пустая ссылка — это штатное значение «ничего не выбрано», оно безопасно и проверяется методом Пустая(). «Битая» ссылка указывает на элемент, которого нет в базе (удалён или никогда не существовал): она не пустая, но запрос по ней ничего не возвращает, а в интерфейсе отображается как «Объект не найден».
Можно ли получить ссылку на предопределённый элемент?
Да, через имя предопределённого элемента: Справочники.Валюты.НайтиПредопределенный("RUB") или обращение Справочники.Валюты.Рубли, если имя задано в конфигураторе. Оба способа возвращают готовую ссылку без поиска по базе.
Как получить ссылку на группу справочника?
Точно так же, как на элемент: группа — это тоже элемент иерархического справочника, просто с признаком ЭтоГруппа. Создаётся группа методом СоздатьГруппу(), а ссылка берётся из свойства Ссылка после записи.
Почему ПолучитьСсылку возвращает ссылку, а элемент не открывается?
Метод не обращается к базе и не проверяет существование — он просто конструирует ссылку из GUID. Если элемента с таким идентификатором нет, ссылка будет «битой». Проверьте её запросом перед использованием.
Как передать ссылку между сеансами или сохранить в файл?
Сериализуйте её через ЗначениеВСтрокуВнутр(Ссылка) — получится строка, которую можно сохранить и восстановить обратно через ЗначениеИзСтрокиВнутр. Для обмена с внешними системами вместо этого используйте строковое представление GUID.
Работает ли навигационная ссылка в файловой базе?
Да, внутри той же базы ссылка вида e1cib/data/... работает и в файловом варианте — через «Перейти по ссылке». Для открытия в браузере базу нужно опубликовать на веб-сервере, тогда к ссылке добавляется адрес публикации.