Справочники и Данные · 9 мин
Как указать ссылку на справочник 1С
Как указать ссылку на справочник 1С в коде, запросе и реквизите документа: поиск по коду и наименованию, ПолучитьСсылку, предопределённые элементы, типичные ошибки.
Ссылка на справочник в 1С — это уникальный идентификатор элемента, а не его код или наименование. Путаница между этими понятиями — самая частая причина ошибок у начинающих: в реквизит записывается именно ссылка (объект типа «СправочникСсылка.ИмяСправочника»), а не строка с названием элемента. Способ получения ссылки зависит от задачи: поиск существующего элемента, работа с предопределёнными элементами, создание нового элемента или указание ссылки в форме.
Ниже разобраны все основные сценарии: получение ссылки в коде встроенного языка, поиск по коду и наименованию, работа с уникальным идентификатором, указание ссылки в запросе и в реквизитах объектов, а также типичные ошибки и способы их проверки.
Что такое ссылка на справочник и чем она отличается от кода
Каждый элемент справочника в 1С имеет несколько идентифицирующих свойств: код, наименование и внутреннюю ссылку. Код и наименование — это «человеческие» реквизиты, они могут меняться и даже дублироваться (наименование — почти всегда, код — если отключён контроль уникальности). Ссылка — внутренний уникальный идентификатор, который не меняется в течение всей жизни элемента.
Именно ссылка хранится в реквизитах документов, регистрах и других справочниках. Когда вы видите в документе поле «Контрагент» с названием организации, в базе фактически записана ссылка, а наименование подставляется только для отображения. Поэтому при программной записи значения в такой реквизит нужно передать ссылку, иначе получите ошибку несоответствия типов.
Тип ссылки в коде выглядит как СправочникСсылка.Номенклатура, а менеджер справочника, через который выполняются операции поиска, — Справочники.Номенклатура.
Как получить ссылку по коду или наименованию
Наиболее распространённый способ — поиск по коду, если коды уникальны и известны заранее:
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если СсылкаНаЭлемент.Пустая() Тогда
Сообщить("Элемент с таким кодом не найден");
КонецЕсли;
Поиск по наименованию работает аналогично, но требует осторожности: наименования могут повторяться, и метод вернёт первый найденный элемент. Для иерархических справочников желательно дополнительно указать родителя, чтобы сузить поиск:
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ 3х2,5", Истина);
Второй параметр (Истина) включает поиск по точному соответствию. Без него поиск может вернуть элемент с частично совпадающим наименованием, что приводит к трудноуловимым ошибкам в данных.
СсылкаНаЭлемент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка", Истина);
Если НЕ СсылкаНаЭлемент.Пустая() Тогда
Документ.Контрагент = СсылкаНаЭлемент;
КонецЕсли;Как получить ссылку по уникальному идентификатору
Если известен GUID элемента (например, он пришёл из внешней системы при обмене данными), ссылку получают методом ПолучитьСсылку():
УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Важная особенность: ПолучитьСсылку() возвращает ссылку даже если элемента с таким идентификатором в базе нет. Проверить существование можно, обратившись к любому реквизиту через получение объекта или проверкой через запрос. Обратная операция — получить GUID из ссылки — выполняется так: Строка(СсылкаНаЭлемент.УникальныйИдентификатор()).
Предопределённые элементы и ссылка на новый элемент
Для элементов, созданных в конфигураторе (предопределённых), ссылку получают напрямую по имени, без поиска:
СсылкаОсновнаяОрганизация = Справочники.Организации.ОсновнаяОрганизация;
Это самый быстрый и надёжный способ: он не требует обращения к базе запросом и не зависит от того, переименовал ли пользователь элемент. Если предопределённый элемент мог быть удалён, используйте ПредопределенноеЗначение() с проверкой.
Когда нужно создать новый элемент и сразу получить на него ссылку, есть два варианта. Простой — создать объект и записать: после Записать() ссылка доступна через свойство Ссылка. Продвинутый — заранее назначить ссылку через УстановитьСсылкуНового(), что полезно при загрузке связанных данных, когда ссылка нужна до записи самого элемента.
Как указать ссылку в запросе и в реквизитах
В запросах ссылка передаётся как параметр — это стандартный способ отбора по конкретному элементу:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", СсылкаНаКонтрагента);
Частая ошибка — передавать в параметр строку с наименованием или кодом. Запрос либо вернёт пустой результат, либо вызовет ошибку сравнения несовместимых типов. Если на входе только наименование, сначала найдите ссылку через НайтиПоНаименованию(), затем передавайте её в запрос.
При заполнении реквизитов документов и справочников правило то же: реквизиту ссылочного типа присваивается только ссылка соответствующего типа. Присвоить ссылку на «Номенклатуру» реквизиту типа «Контрагенты» не получится — платформа выдаст ошибку.
Как указать ссылку в форме и в пользовательском режиме
В пользовательском режиме ссылка указывается через поле ввода: начните вводить наименование или код, и платформа покажет подходящие элементы. Кнопка «Показать все» (или F4) открывает форму выбора справочника. Если элемент не находится, проверьте, не стоит ли в поле ограничение по владельцу или отбор.
Программно в форме ссылку присваивают реквизиту формы или объекта обычным присваиванием. Для открытия формы конкретного элемента по ссылке используется ПоказатьЗначение(, СсылкаНаЭлемент) — удобно для навигации из отчётов и обработок.
- 1Найдите элемент справочника через НайтиПоКоду() или НайтиПоНаименованию()
- 2Проверьте результат: Ссылка.Пустая() должна быть Ложь
- 3Присвойте ссылку реквизиту документа
- 4Запишите документ и убедитесь, что поле отображается заполненным
Как проверить результат
После получения ссылки убедитесь, что она корректна. Базовая проверка — СсылкаНаЭлемент.Пустая(): если Истина, элемент не найден. Для ссылки, полученной через ПолучитьСсылку(), дополнительно проверьте существование элемента, например попыткой прочитать наименование через запрос.
В пользовательском режиме признак корректной ссылки — поле отображает наименование элемента, а не пустое значение или надпись «<Объект не найден>». Последняя означает битую ссылку: элемент был удалён физически (например, при свёртке базы или обмене), и такие ссылки нужно вычищать.
Как проверить результат
Пустая() возвращает Ложь, наименование читается
Пустая() = Истина — элемент не найден
В поле видно наименование элемента
Надпись «Объект не найден» или пустое поле после записи
ТипЗнч() = СправочникСсылка нужного вида
Строка или ссылка другого справочника
Часто задаваемые вопросы
Чем ссылка отличается от кода справочника?
Код — редактируемый реквизит, который видит пользователь и который может повторяться при отключённом контроле уникальности. Ссылка — неизменный внутренний идентификатор, по которому платформа связывает объекты между собой. В реквизиты и запросы передаётся только ссылка.
Как найти элемент, если известна только часть наименования?
Методы НайтиПоНаименованию работают с полным значением. Для поиска по части строки используйте запрос с оператором ПОДОБНО, например: ГДЕ Наименование ПОДОБНО "%кабель%". Учтите, что такой запрос может вернуть несколько элементов.
Что делать, если НайтиПоКоду ничего не находит, хотя элемент есть?
Проверьте тип кода: если код числовой, а вы ищете строку (или наоборот), поиск не сработает. Также проверьте лидирующие нули в строковом коде и не входит ли элемент в другую группу при поиске с указанием родителя.
Можно ли получить ссылку на ещё не записанный элемент?
Да. Создайте объект через Справочники.Имя.СоздатьЭлемент(), затем вызовите УстановитьСсылкуНового(Справочники.Имя.ПолучитьСсылку()). После этого ссылку можно использовать в связанных объектах, а сам элемент записать позже.
Откуда берутся «битые» ссылки и как их найти?
Они возникают при физическом удалении элементов без контроля ссылочной целостности, при обменах и свёртке базы. Найти их помогает тестирование и исправление информационной базы с проверкой ссылочной целостности, а программно — запросы, где у ссылки наименование равно NULL или читается как «Объект не найден».
Как передать ссылку в COM-соединение или внешнюю систему?
Напрямую ссылка за пределы базы не передаётся — передают её уникальный идентификатор в виде строки: Строка(Ссылка.УникальныйИдентификатор()). На приёмной стороне ссылку восстанавливают через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД)).
Что важно запомнить
Ссылка — это внутренний идентификатор элемента, а не код и не наименование. Получайте её через НайтиПоКоду, НайтиПоНаименованию или ПолучитьСсылку, всегда проверяйте на Пустая() и существование элемента, и передавайте в реквизиты и запросы только ссылку.