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

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

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

Как указать ссылку на справочник 1С в коде, запросе и реквизите документа: поиск по коду и наименованию, ПолучитьСсылку, предопределённые элементы, типичные ошибки.

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

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

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

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

Именно ссылка хранится в реквизитах документов, регистрах и других справочниках. Когда вы видите в документе поле «Контрагент» с названием организации, в базе фактически записана ссылка, а наименование подставляется только для отображения. Поэтому при программной записи значения в такой реквизит нужно передать ссылку, иначе получите ошибку несоответствия типов.

Тип ссылки в коде выглядит как СправочникСсылка.Номенклатура, а менеджер справочника, через который выполняются операции поиска, — Справочники.Номенклатура.

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

Наиболее распространённый способ — поиск по коду, если коды уникальны и известны заранее:

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

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

Сообщить("Элемент с таким кодом не найден");

КонецЕсли;

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

СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ 3х2,5", Истина);

Второй параметр (Истина) включает поиск по точному соответствию. Без него поиск может вернуть элемент с частично совпадающим наименованием, что приводит к трудноуловимым ошибкам в данных.

bsl
СсылкаНаЭлемент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка", Истина);
Если НЕ СсылкаНаЭлемент.Пустая() Тогда
    Документ.Контрагент = СсылкаНаЭлемент;
КонецЕсли;

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

Если известен GUID элемента (например, он пришёл из внешней системы при обмене данными), ссылку получают методом ПолучитьСсылку():

УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

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

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

Предопределённые элементы и ссылка на новый элемент

Для элементов, созданных в конфигураторе (предопределённых), ссылку получают напрямую по имени, без поиска:

СсылкаОсновнаяОрганизация = Справочники.Организации.ОсновнаяОрганизация;

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

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

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

В запросах ссылка передаётся как параметр — это стандартный способ отбора по конкретному элементу:

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

Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Контрагент = &Контрагент";

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

Частая ошибка — передавать в параметр строку с наименованием или кодом. Запрос либо вернёт пустой результат, либо вызовет ошибку сравнения несовместимых типов. Если на входе только наименование, сначала найдите ссылку через НайтиПоНаименованию(), затем передавайте её в запрос.

При заполнении реквизитов документов и справочников правило то же: реквизиту ссылочного типа присваивается только ссылка соответствующего типа. Присвоить ссылку на «Номенклатуру» реквизиту типа «Контрагенты» не получится — платформа выдаст ошибку.

Типичные ошибки
01
Присваивать реквизиту строку с наименованием вместо ссылки — ошибка несоответствия типов
02
Не проверять результат НайтиПоКоду() на Пустая() — дальше работа идёт с пустой ссылкой
03
Искать по наименованию без точного соответствия — находится не тот элемент
04
Использовать ПолучитьСсылку() без проверки существования — появляются битые ссылки

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

В пользовательском режиме ссылка указывается через поле ввода: начните вводить наименование или код, и платформа покажет подходящие элементы. Кнопка «Показать все» (или F4) открывает форму выбора справочника. Если элемент не находится, проверьте, не стоит ли в поле ограничение по владельцу или отбор.

Программно в форме ссылку присваивают реквизиту формы или объекта обычным присваиванием. Для открытия формы конкретного элемента по ссылке используется ПоказатьЗначение(, СсылкаНаЭлемент) — удобно для навигации из отчётов и обработок.

Порядок действий при записи ссылки в документ
  1. 1
    Найдите элемент справочника через НайтиПоКоду() или НайтиПоНаименованию()
  2. 2
    Проверьте результат: Ссылка.Пустая() должна быть Ложь
  3. 3
    Присвойте ссылку реквизиту документа
  4. 4
    Запишите документ и убедитесь, что поле отображается заполненным

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

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

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

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

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

Значение ссылки после поиска
Норма

Пустая() возвращает Ложь, наименование читается

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

Пустая() = Истина — элемент не найден

Отображение в документе
Норма

В поле видно наименование элемента

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

Надпись «Объект не найден» или пустое поле после записи

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

ТипЗнч() = СправочникСсылка нужного вида

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

Строка или ссылка другого справочника

Часто задаваемые вопросы

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

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

Как найти элемент, если известна только часть наименования?

Методы НайтиПоНаименованию работают с полным значением. Для поиска по части строки используйте запрос с оператором ПОДОБНО, например: ГДЕ Наименование ПОДОБНО "%кабель%". Учтите, что такой запрос может вернуть несколько элементов.

Что делать, если НайтиПоКоду ничего не находит, хотя элемент есть?

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

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

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

Откуда берутся «битые» ссылки и как их найти?

Они возникают при физическом удалении элементов без контроля ссылочной целостности, при обменах и свёртке базы. Найти их помогает тестирование и исправление информационной базы с проверкой ссылочной целостности, а программно — запросы, где у ссылки наименование равно NULL или читается как «Объект не найден».

Как передать ссылку в COM-соединение или внешнюю систему?

Напрямую ссылка за пределы базы не передаётся — передают её уникальный идентификатор в виде строки: Строка(Ссылка.УникальныйИдентификатор()). На приёмной стороне ссылку восстанавливают через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД)).

Итог

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

Ссылка — это внутренний идентификатор элемента, а не код и не наименование. Получайте её через НайтиПоКоду, НайтиПоНаименованию или ПолучитьСсылку, всегда проверяйте на Пустая() и существование элемента, и передавайте в реквизиты и запросы только ссылку.