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

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

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

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

Ссылка на элемент справочника — это значение типа СправочникСсылка.<ИмяСправочника>, которое однозначно идентифицирует объект в базе данных. Через ссылку программа обращается к реквизитам элемента, записывает его в документы и сравнивает значения между собой. Практически любой код на встроенном языке 1С начинается с того, что разработчик получает ссылку нужным способом.

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

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

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

Порядок действий при поиске по коду
  1. 1
    Определите точный код элемента с учётом ведущих нулей
  2. 2
    Вызовите Справочники.ИмяСправочника.НайтиПоКоду(Код)
  3. 3
    Проверьте результат: если Ссылка.Пустая() — элемент не найден
  4. 4
    Используйте ссылку для чтения реквизитов или передачи в документ

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

Часто ссылку не нужно искать — она уже хранится в реквизите другого объекта. Например, в документе «Реализация товаров» реквизит «Контрагент» содержит ссылку на элемент справочника контрагентов:

КонтрагентСсылка = ДокументОбъект.Контрагент;

ИНН = КонтрагентСсылка.ИНН;

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

При работе с формами ссылка на текущий элемент доступна через Объект.Ссылка в модуле формы элемента справочника. В списке справочника текущую строку можно получить через Элементы.Список.ТекущиеДанные.Ссылка.

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

Каждый элемент справочника имеет уникальный идентификатор — 16-байтовое значение, которое не меняется при переносе данных между базами. Именно по ГУИД работают механизмы обмена. Получить ссылку по известному идентификатору можно так:

ГУИД = Новый УникальныйИдентификатор("952a3e4c-1b2d-11e8-a1c2-00155d0a0b0c");

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

Обратная операция — получить строковое представление идентификатора из ссылки:

СтрокаГУИД = XMLСтрока(Ссылка);

// или

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

Важная особенность: ПолучитьСсылку(ГУИД) всегда возвращает ссылку, даже если элемента с таким идентификатором в базе нет. Проверить существование можно через запрос или попытку обращения к реквизиту. Такие «битые» ссылки отображаются в интерфейсе как «Объект не найден» и являются частой причиной ошибок после обменов.

Как получить ссылки запросом при массовой обработке

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления

| И НЕ Номенклатура.ЭтоГруппа";

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

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

ТекущаяСсылка = Выборка.Ссылка;

КонецЦикла;

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

Альтернатива без запроса — метод Выбрать() менеджера справочника: Выборка = Справочники.Номенклатура.Выбрать(). Он проще в написании, но менее гибок: сложные условия отбора придётся реализовывать проверками внутри цикла.

Способы получения ссылки

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

Подходит для поиска одного элемента по известному значению. Ограничение: наименование не уникально, код зависит от настроек нумерации.

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

Подходит для обмена и интеграций, когда известен идентификатор. Ограничение: не проверяет существование элемента.

Запрос

Подходит для массовой выборки и сложных условий. Требует знания языка запросов.

Из реквизита объекта

Самый быстрый вариант, когда ссылка уже хранится в документе или другом справочнике. Поиск не требуется.

Как получить ссылку на новый, ещё не записанный элемент

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

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

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

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

НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

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

// Теперь НоваяСсылка указывает на записанный элемент

Метод УстановитьСсылкуНового() фиксирует идентификатор до записи. Если не установить ссылку заранее, платформа сгенерирует её автоматически при записи, и узнать её можно будет из свойства НовыйЭлемент.Ссылка после вызова Записать().

Как проверить результат и какие ошибки встречаются чаще всего

После получения ссылки убедитесь в трёх вещах: ссылка не пустая, элемент существует и это именно тот тип данных, который ожидается. Проверка типа выполняется функцией ТипЗнч(Ссылка) = Тип("СправочникСсылка.Номенклатура"). Это особенно важно в универсальных процедурах, куда ссылка может прийти параметром.

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

Вторая частая проблема — обращение к реквизитам ссылки внутри цикла. Конструкция вида Выборка.Ссылка.Наименование на каждой итерации порождает отдельный запрос к СУБД. Вместо этого выбирайте нужные поля сразу в тексте запроса.

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

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

Ссылка получена
Норма

Ссылка.Пустая() возвращает Ложь

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

Пустая() возвращает Истина — элемент не найден

Элемент существует
Норма

Запрос по ссылке возвращает строку

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

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

Правильный тип
Норма

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

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

Тип не совпадает — возможна ошибка при записи в реквизит

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

Чем отличается Предопределенный элемент от обычного при получении ссылки?

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

Можно ли получить ссылку, зная только часть наименования?

Да, метод НайтиПоНаименованию с третьим параметром Истина выполняет поиск по началу строки. Для поиска по вхождению подстроки в любом месте надёжнее использовать запрос с оператором ПОДОБНО и шаблоном "%текст%".

Как получить ссылку на группу справочника?

Те же методы: НайтиПоКоду, НайтиПоНаименованию или запрос с условием ЭтоГруппа = Истина. У справочников с иерархией групп и элементов группы и элементы хранятся в одной таблице и различаются флагом ЭтоГруппа.

Как узнать GUID ссылки без программирования?

Откройте элемент справочника в режиме предприятия и посмотрите адресную строку браузера (в веб-клиенте) либо используйте команду «Вывести список» с добавлением поля «Ссылка». Также GUID виден в универсальных отчётах и обработках поиска ссылок на объект.

Что делать, если НайтиПоКоду не находит существующий элемент?

Проверьте длину кода и ведущие нули: код "123" и "000000123" — разные значения. Также убедитесь, что у справочника не отключена автонумерация и что поиск выполняется в правильном справочнике. Если код нестроковый, передайте число, а не строку.

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

Нет, ссылку нельзя создать присваиванием строки. Строковый GUID сначала преобразуют в значение типа УникальныйИдентификатор, а затем вызывают ПолучитьСсылку у менеджера справочника. Прямое присваивание строки реквизиту типа СправочникСсылка вызовет ошибку преобразования типов.

Итог

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

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