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

Разработка и Конфигурация · 9 мин

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

Как в 1С создать реквизит типа «СправочникСсылка», присвоить ему значение и получить данные через точку. Примеры кода для управляемых и обычных форм.

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

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

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

Как устроен тип «СправочникСсылка» в платформе

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

Тип ссылки жёстко привязан к конкретному справочнику: реквизит типа «СправочникСсылка.Номенклатура» не примет значение из справочника «Контрагенты». Если нужно хранить ссылки на разные справочники, в конфигураторе у реквизита включают составной тип, отмечая несколько нужных справочников галочками.

Как добавить реквизит со ссылкой на справочник в конфигураторе

Откройте конфигуратор, найдите нужный объект (документ, справочник, регистр сведений) и добавьте новый реквизит. В свойстве «Тип» нажмите кнопку выбора и отметьте «СправочникСсылка», затем раскройте узел и выберите конкретный справочник — например, «Номенклатура» или «Контрагенты».

После выбора типа проверьте связанные свойства. «Проверка заполнения» определяет, обязателен ли реквизит. «Связь по типу» и «Связи параметров выбора» позволяют ограничить выбор: например, показывать в поле «Договор» только договоры выбранного контрагента. Эти настройки делаются один раз в метаданных и работают во всех формах автоматически.

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

Добавление реквизита-ссылки в конфигураторе
  1. 1
    Откройте объект метаданных и добавьте новый реквизит
  2. 2
    В свойстве «Тип» выберите СправочникСсылка и нужный справочник
  3. 3
    Настройте проверку заполнения и связи параметров выбора
  4. 4
    Обновите конфигурацию базы данных (F7)
  5. 5
    Проверьте заполнение реквизита в пользовательском режиме

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

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

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

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

Объект.Товар = НайденнаяСсылка;

Иначе

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

КонецЕсли;

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

СсылкаВалюта = Справочники.Валюты.Рубль; // предопределённый элемент

НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(

Новый УникальныйИдентификатор("8f3b2a1c-..."));

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

Код, наименование и предопределённые реквизиты доступны прямо «через точку» от ссылки — платформа сама выполнит обращение к базе. Это удобно для одиночных обращений:

НаименованиеТовара = Объект.Товар.Наименование;

АртикулТовара = Объект.Товар.Артикул;

Однако каждое обращение через точку — отдельный запрос к базе данных. В цикле по тысяче строк такой подход заметно замедлит работу. Для массового чтения данные выбирают запросом, соединяя таблицу документа со справочником по полю-ссылке. Это главный критерий выбора: одно-два обращения — допустимо через точку, цикл — только запрос.

Для изменения элемента справочника ссылки недостаточно — нужен объект:

ЭлементОбъект = СсылкаНаТовар.ПолучитьОбъект();

ЭлементОбъект.Комментарий = "Обновлено обработкой";

ЭлементОбъект.Записать();

Ссылка на реквизит в запросах и на форме

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

ВЫБРАТЬ

Реализация.Контрагент КАК КонтрагентСсылка,

Реализация.Контрагент.ИНН КАК ИНН

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Контрагент = &Контрагент

На управляемой форме реквизит ссылочного типа отображается как поле ввода с кнопкой выбора. Чтобы ограничить список выбора программно, у элемента формы задают параметры выбора или обрабатывают событие «НачалоВыбора». Для открытия карточки выбранного элемента из своего кода используют ПоказатьЗначение с переданной ссылкой.

Типичные ошибки и как их проверить

Самая частая ошибка — присвоение реквизиту строки вместо ссылки: Объект.Товар = "Гвоздь 100" вызовет ошибку преобразования типов. Реквизиту нужна именно ссылка, полученная поиском или созданием элемента. Вторая частая ситуация — попытка изменить данные через ссылку: Ссылка.Наименование = "Новое" недоступно для записи, требуется ПолучитьОбъект.

Третья группа проблем — «битые» ссылки после физического удаления элементов или обмена данными. Их находят запросом с проверкой ГДЕ Таблица.Реквизит.Ссылка ЕСТЬ NULL при соединении или штатной обработкой поиска и удаления битых ссылок. После загрузки данных из внешних источников всегда проверяйте результат поиска на пустую ссылку до записи объекта.

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

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

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

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

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

Строка, число или Неопределено

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

Метод Пустая() возвращает Ложь

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

Пустая ссылка записывается в обязательный реквизит

Целостность данных
Норма

По ссылке открывается карточка элемента

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

В списках отображается «Объект не найден»

FAQ

Итог

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

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

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

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

Как проверить, что ссылка пустая?

Вызовите у ссылки метод Пустая() — он вернёт Истина для пустого значения. Альтернатива — сравнение с Справочники.Имя.ПустаяСсылка(). В запросах используют условие «Реквизит = &ПустаяСсылка» или проверку на значение по умолчанию через ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка).

Можно ли хранить в одном реквизите ссылки на разные справочники?

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

Что делать, если в реквизите появилась надпись «Объект не найден»?

Это «битая» ссылка: элемент был удалён физически, а ссылка на него осталась. Найдите такие записи запросом или обработкой поиска битых ссылок, затем либо замените значение на существующий элемент, либо очистите реквизит. В дальнейшем удаляйте элементы только через пометку удаления с контролем ссылочной целостности.

Как найти элемент справочника, если код и наименование неизвестны?

Используйте НайтиПоРеквизиту, указав имя и значение любого реквизита справочника — например, ИНН для контрагента или штрихкод для номенклатуры. Для ускорения поиска у реквизита в конфигураторе должно быть включено индексирование, особенно в больших справочниках.