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

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

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

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

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

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

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

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

В 1С работа с элементами справочника строится на двух типах данных. СправочникСсылка — это компактный идентификатор записи, содержащий по сути только уникальный идентификатор (GUID) и служебную информацию о типе. Через точку от ссылки доступны основные поля элемента (Код, Наименование, ПометкаУдаления и реквизиты), но платформа при каждом таком обращении выполняет обращение к базе данных.

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

Проверить тип значения можно через ТипЗнч():

Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда

// это ссылка на номенклатуру

КонецЕсли;

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

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

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

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

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

Иначе

Сообщить("Найден: " + СсылкаНаЭлемент.Наименование);

КонецЕсли;

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

Поиск по коду в иерархическом справочнике

Для иерархических справочников у методов поиска есть параметр «Родитель», позволяющий искать внутри конкретной группы. Также можно указать владельца, если справочник подчинённый. Это сужает выборку и ускоряет поиск.

Поиск ссылки по реквизиту

Когда код и наименование не подходят, используют НайтиПоРеквизиту(). Метод принимает имя реквизита и искомое значение. Типичный сценарий — найти контрагента по ИНН или товар по артикулу:

КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7707083893");

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

// работаем с найденным контрагентом

КонецЕсли;

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

Когда нужно получить все подходящие элементы или искать по сложному условию, используют запрос — из результата запроса ссылка извлекается напрямую из поля «Ссылка».

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

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", "АРТ-100");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// Выборка.Ссылка — это готовая СправочникСсылка

КонецЦикла;

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

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

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

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

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

Проверить существование элемента можно через запрос по ссылке или через попытку получить объект. Обратное преобразование — из ссылки в строку GUID — делается так:

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

Создание нового элемента и получение его ссылки

Когда элемент нужно создать программно, работа идёт через СправочникОбъект, а ссылка появляется после записи:

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

НовыйЭлемент.Наименование = "Новый товар";

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

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

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

Порядок действий
  1. 1
    Вызовите Справочники.ИмяСправочника.СоздатьЭлемент() — получите СправочникОбъект
  2. 2
    Заполните обязательные реквизиты: наименование, родителя, владельца при необходимости
  3. 3
    Вызовите Записать() и убедитесь, что исключений не возникло
  4. 4
    Прочитайте свойство Ссылка у объекта — это готовая СправочникСсылка нового элемента
  5. 5
    Проверьте элемент в пользовательском режиме, открыв список справочника

Как проверить результат и избежать типичных ошибок

Любой поиск ссылки должен завершаться проверкой результата. Два стандартных способа: метод Пустая() у ссылки и функция ЗначениеЗаполнено(). Оба возвращают Истина/Ложь, различие в том, что ЗначениеЗаполнено универсальна и подходит для любых типов.

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

// элемент не найден

КонецЕсли;

Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда

// ссылка непустая

КонецЕсли;

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

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

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

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

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

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

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

Ссылка непустая, поля элемента читаются

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

Пустая ссылка — элемент не найден, условие поиска нужно пересмотреть

Обращение к реквизитам
Норма

Поля возвращают ожидаемые значения

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

Ошибка или пустые значения при непустой ссылке — признак битой ссылки

Новый элемент после Записать()
Норма

Свойство Ссылка заполнено, элемент виден в списке

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

Исключение при записи — проверьте обязательные реквизиты и права

Выбор способа получения ссылки под задачу

Единого «правильного» метода нет — выбор определяется исходными данными и требованиями к производительности. Ориентируйтесь на следующую логику: известен код или наименование — НайтиПоКоду/НайтиПоНаименованию; известен GUID из обмена — ПолучитьСсылку с обязательной проверкой существования; нужен отбор по произвольному условию или несколько элементов — запрос; элемент создаётся — СоздатьЭлемент и чтение свойства Ссылка после записи.

Сравнение вариантов

НайтиПоКоду / НайтиПоНаименованию

Быстро и просто, но возвращает максимум один элемент и требует точного совпадения

НайтиПоРеквизиту

Подходит для поиска по ИНН, артикулу и т.п.; реквизит должен быть индексирован

ПолучитьСсылку(УИД)

Единственный способ восстановить ссылку по GUID; не проверяет существование элемента

Запрос

Гибкие условия и выбор множества ссылок; требует написания текста запроса

СоздатьЭлемент + Записать

Для новых элементов; ссылка доступна только после успешной записи

В клиент-серверном режиме помните о контексте исполнения: все перечисленные методы менеджеров справочников — серверные. Из клиентской процедуры формы их вызывают через серверный вызов, а ссылка спокойно передаётся между клиентом и сервером как сериализуемое значение.

Итог

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

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

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

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

Вызовите у ссылки метод Пустая() — он вернёт Истина для пустой ссылки. Альтернатива — функция ЗначениеЗаполнено(Ссылка), которая вернёт Ложь для пустого значения. Проверку стоит выполнять после каждого поиска, прежде чем обращаться к реквизитам элемента.

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

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

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

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

Как получить ссылку из строки с GUID?

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

Что такое «битая ссылка» и как её найти?

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

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

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