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