Довольно часто при разработке прикладных решений на платформе 1С Предприятие 8.3 возникает ситуация, когда в прикладной логике нужно опираться на созданные пользователями элементы – найти нужный склад, чтобы подставить в документ, найти нужную задачу, чтобы программно ее выполнить. И одним из вариантов поиска таких ссылочных объектов является поиск по наименованию. В этой статье мы рассмотрим два основных варианта поиска по наименованию – при помощи метода НайтиПоНаименованию и при помощи запросов.
НайтиПоНаименованию в 1С 8.3
Данный метод есть у многих прикладных объектов – у справочников, задач, планов обмена, и др. Как правило, начинающие разработчики используют именно этот метод, когда им нужно найти по наименованию. Его несомненное достоинство – простота освоения. Написал НайтиПоНаименованию(НужноеНаИмнование) – и готово. Верно?
А вот и нет!
Давайте разбираться.
Метод НайтиПоНаименованию принимает четыре параметра
- Наименование
- ТочноеСоответствие
- Родитель
- Владелец
Только первый параметр является обязательным, остальные можно не указывать.
ТочноеСоответствие – параметр типа Булево, который влияет на то, как именно платформа будет искать по наименованию. Если указать Ложь – будет проверяться соответствие левой части наименования. Если указать Истина – должно полностью совпадать наименование, за исключением “концевых” пробелов
Пример:
В справочнике Склады есть следующие значения:
- Основной склад
- Филиал 1
- Филиал 2
- Второй филиальный склад
// Будет найден Филиал 1 НайденныйСклад = Справочники.Склады.НайтиПоНаименованию("Филиал"); // Склад не будет найден, т.к. строго равного наименования не нашлось. НайденныйСклад = Справочники.Склады.НайтиПоНаименованию("Филиал", Истина);
Примечание. Разумеется, метод будет срабатывать только для прикладных объектов, у которых длина наименования не равна нулю (например, в справочнике можно указать длину наименования равной нулю, чтобы не использовать наименование вовсе).
Родитель – при указании этого параметра поиск будет осуществляться в пределах этого родителя. Иначе – во всем справочнике. Рассмотрим пример. Пусть у нас есть иерархический справочник такой структуры:

// РодительТест - Основная группа Нашли = Справочники.ТестовыйСправочник.НайтиПоНаименованию("Филиал",, РодительТест);
В этом случае будет найден элемент Филиал 2, т.к. поиск осуществляется только в пределах одной папки. Обратите внимание, если будут вложенные подпапки, они не будут учитываться, т.к. проверяется не вхождение в иерархию, а именно равенство реквизита “Родитель”.
Владелец – поиск будет осуществляться в пределах указанного в параметре объекта-владельца.
Недостатки метода НайтиПоНаименованию
Как и много других методов в объектной технике языка 1С, данный метод имеет ряд недостатков. Так, он подбирает первый попавшийся элемент в случае наличия нескольких подходящих записей, в нем нельзя указать сложные условия фильтров или нечеткий поиск по части слова. Кроме того, нельзя с его помощью найти все элементы с подходящим наименованием (например, дубли), или найти следующий, после того как мы обработали текущий найденный объект.
Тем не менее, данный метод вполне имеет право на жизнь, если пользоваться им с умом.
Поиск по наименованию при помощи запроса
Язык запросов намного более гибкий по сравнению с объектной техникой встроенного языка, он обладает большим количеством возможностей по фильтрации, сортировке и группировке данных. Ниже мы рассмотрим лишь простой пример поиска по наименованию при помощи запроса.
Обратите внимание – можно было бы использовать оператор строгого равенства, но мы для демонстрации возможностей запросов используем оператор ПОДОБНО.
Запрос = Новый Запрос("ВЫБРАТЬ | ТестовыйСправочник.Ссылка КАК НайденныйОбъект |ИЗ | Справочник.ТестовыйСправочник КАК ТестовыйСправочник |ГДЕ | ТестовыйСправочник.Наименование ПОДОБНО &Наименование"); Запрос.УстановитьПараметр("Наименование", "%Филиал%"); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Сообщить("Ничего не нашли!"); Иначе Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить("Нашли " + Выборка.Ссылка); КонецЦикла; КонецЕсли;
Указанный в примере код выведет все подходящие элементы, у которых наименование содержит в себе слово “Филиал” – хоть в начале, хоть в середине, хоть в конце.
Например, подойдут такие наименования: “Филиал 1”, “Первый Филиал”, “Вспомогательный Филиал 2”.