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