Как найти элемент справочника в 1С: все способы с примерами
Для поиска по одному стандартному полю используйте методы менеджера справочника:
НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту().
Для поиска по уникальному идентификатору — ПолучитьСсылку() через
Справочники.Имя.ПолучитьСсылку(Новый УникальныйИдентификатор(...)).
Если условий несколько (по двум реквизитам или по владельцу и наименованию) —
надёжнее и быстрее запрос.
Все методы возвращают ссылку на элемент, а если ничего не найдено —
пустую ссылку (а не Неопределено). Это ключевой момент для
правильной проверки результата.
Найти элемент справочника по коду
Самый быстрый способ найти элемент справочника в 1С по коду — метод менеджера
НайтиПоКоду(). Подходит, если код уникален (по умолчанию так и есть):
НайденныйЭлемент = Справочники.Номенклатура.НайтиПоКоду("00-000123");
Если НЕ НайденныйЭлемент.Пустая() Тогда
Сообщить("Нашли: " + НайденныйЭлемент.Наименование);
КонецЕсли;
Если код неуникален (в настройках справочника снята уникальность), метод вернёт первый попавшийся элемент. Для управляемого поиска в этом случае лучше запрос.
Найти элемент справочника по наименованию
Поиск элемента справочника 1С по наименованию выполняет метод НайтиПоНаименованию():
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Ссылка.Пустая() Тогда
Сообщить("Контрагент не найден");
КонецЕсли;
По умолчанию идёт поиск по полному совпадению наименования. Второй параметр включает поиск по началу строки:
// ТочноеСоответствие = Ложь → найдёт "Ромашка, ООО" по началу
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка", Ложь);
Помните: наименование не уникально, метод вернёт первый совпавший элемент. Для точного поиска используйте код, реквизит или запрос.
Найти элемент справочника по реквизиту
Когда элемент справочника нужно найти по произвольному реквизиту (ИНН, артикул, внешний код),
в 1С используют метод НайтиПоРеквизиту():
Ссылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");
Если НЕ Ссылка.Пустая() Тогда
Сообщить("Контрагент по ИНН: " + Ссылка);
КонецЕсли;
НайтиПоРеквизиту() работает только с реквизитами верхнего уровня
(не с табличными частями) и ищет по первому совпадению. Поиск по нескольким реквизитам одним
вызовом невозможен — для этого нужен запрос (см. ниже).
Найти элемент справочника по GUID (уникальному идентификатору)
Частая задача при интеграциях и обмене данными в 1С: на входе есть строка GUID, нужно получить
ссылку на элемент справочника. Отдельного метода «найти по GUID» нет — используется
ПолучитьСсылку():
Идентификатор = Новый УникальныйИдентификатор("a1b2c3d4-0000-0000-0000-000000000000");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
// ВАЖНО: ПолучитьСсылку НЕ проверяет существование объекта в базе.
// Ссылка вернётся всегда — проверяем через ПолучитьОбъект():
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Элемента с таким идентификатором нет");
КонецЕсли;
Это принципиально отличается от НайтиПо…: ПолучитьСсылку()
формирует ссылку по идентификатору без обращения к базе, поэтому .Пустая()
здесь не сработает — существование проверяется только через ПолучитьОбъект()
или запросом.
Найти элемент справочника запросом: несколько условий, владелец, скорость
Когда условий несколько (два реквизита, владелец + наименование, отбор по группе), найти элемент справочника в 1С надёжнее и быстрее запросом, чем перебором в цикле:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул
| И Номенклатура.ЕдиницаИзмерения = &Единица";
Запрос.УстановитьПараметр("Артикул", "А-100");
Запрос.УстановитьПараметр("Единица", ЕдиницаСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.Ссылка;
Иначе
Ссылка = Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Поиск по владельцу (для подчинённых справочников) — тот же запрос
с условием Владелец = &Владелец. Конструкция ВЫБРАТЬ ПЕРВЫЕ 1
не даёт лишней нагрузки, если совпадений может быть много.
Частые ошибки при поиске элемента справочника в 1С
-
Сравнение результата с
Неопределено. МетодыНайтиПо…возвращают пустую ссылку, а неНеопределено. Правильная проверка —.Пустая(). -
Проверка
.Пустая()послеПолучитьСсылку(). Не сработает: ссылка формируется всегда. Существование — только черезПолучитьОбъект()или запрос. - Поиск по неуникальному полю без учёта дублей. Наименование и (иногда) код неуникальны — вернётся первый попавшийся. Если важна точность, ищите по реквизиту-ключу или запросом с явными условиями.
-
Опечатка в имени реквизита.
НайтиПоРеквизиту("Инн", ...)вместо"ИНН"приведёт к ошибке выполнения — имя реквизита должно точно совпадать с тем, что задано в конфигураторе именно вашей базы. -
Поиск в цикле вместо запроса. Перебор элементов с
НайтиПо…внутри цикла по тысячам строк — источник тормозов. Один запрос с соединением решает задачу за одно обращение к СУБД.
Какой способ поиска в справочнике 1С выбрать
- По коду — когда код уникален и известен точно.
- По наименованию — быстрый черновой поиск; помните про неуникальность.
- По реквизиту — поиск по ключевому полю (ИНН, артикул), одно условие.
- По GUID — интеграции и обмен, когда на входе идентификатор.
- Запросом — несколько условий, владелец, отбор по группе, большие объёмы.
Частые вопросы о поиске элемента справочника в 1С
Чем отличается НайтиПоКоду от ПолучитьСсылку?
НайтиПоКоду() обращается к базе и возвращает пустую ссылку, если элемента нет.
ПолучитьСсылку() формирует ссылку по GUID без обращения к базе и возвращает её
всегда — существование проверяется отдельно через ПолучитьОбъект().
Как найти элемент по двум реквизитам сразу?
Штатного метода нет — используйте запрос с двумя условиями в секции ГДЕ
(см. раздел «Поиск запросом»). Это быстрее и надёжнее перебора в цикле.
Что вернёт поиск, если совпадений несколько?
Методы НайтиПо… вернут первый найденный элемент. Если нужен конкретный —
добавьте уточняющее условие и ищите запросом.