Как найти по наименованию в 1С 8.3?

Довольно часто при разработке прикладных решений на платформе 1С Предприятие 8.3 возникает ситуация, когда в прикладной логике нужно опираться на созданные пользователями элементы – найти нужный склад, чтобы подставить в документ, найти нужную задачу, чтобы программно ее выполнить. И одним из вариантов поиска таких ссылочных объектов является поиск по наименованию. В этой статье мы рассмотрим два основных варианта поиска по наименованию – при помощи метода НайтиПоНаименованию и при помощи запросов.

НайтиПоНаименованию в 1С 8.3

Данный метод есть у многих прикладных объектов – у справочников, задач, планов обмена, и др. Как правило, начинающие разработчики используют именно этот метод, когда им нужно найти по наименованию. Его несомненное достоинство – простота освоения. Написал НайтиПоНаименованию(НужноеНаИмнование) – и готово. Верно?
А вот и нет!
Давайте разбираться.

Метод НайтиПоНаименованию принимает четыре параметра

  • Наименование
  • ТочноеСоответствие
  • Родитель
  • Владелец

Только первый параметр является обязательным, остальные можно не указывать.
ТочноеСоответствие – параметр типа Булево, который влияет на то, как именно платформа будет искать по наименованию. Если указать Ложь – будет проверяться соответствие левой части наименования. Если указать Истина – должно полностью совпадать наименование, за исключением “концевых” пробелов

Пример:
В справочнике Склады есть следующие значения:

  • Основной склад
  • Филиал 1
  • Филиал 2
  • Второй филиальный склад
// Будет найден Филиал 1
НайденныйСклад = Справочники.Склады.НайтиПоНаименованию("Филиал");

// Склад не будет найден, т.к. строго равного наименования не нашлось.
НайденныйСклад = Справочники.Склады.НайтиПоНаименованию("Филиал", Истина);

Примечание. Разумеется, метод будет срабатывать только для прикладных объектов, у которых длина наименования не равна нулю (например, в справочнике можно указать длину наименования равной нулю, чтобы не использовать наименование вовсе).

Родитель – при указании этого параметра поиск будет осуществляться в пределах этого родителя. Иначе – во всем справочнике. Рассмотрим пример. Пусть у нас есть иерархический справочник такой структуры:

Найтипонаименованию с указанием родителя
// РодительТест - Основная группа
Нашли = Справочники.ТестовыйСправочник.НайтиПоНаименованию("Филиал",, РодительТест);

В этом случае будет найден элемент Филиал 2, т.к. поиск осуществляется только в пределах одной папки. Обратите внимание, если будут вложенные подпапки, они не будут учитываться, т.к. проверяется не вхождение в иерархию, а именно равенство реквизита “Родитель”.

Владелец – поиск будет осуществляться в пределах указанного в параметре объекта-владельца.

Недостатки метода НайтиПоНаименованию

Как и много других методов в объектной технике языка 1С, данный метод имеет ряд недостатков. Так, он подбирает первый попавшийся элемент в случае наличия нескольких подходящих записей, в нем нельзя указать сложные условия фильтров или нечеткий поиск по части слова. Кроме того, нельзя с его помощью найти все элементы с подходящим наименованием (например, дубли), или найти следующий, после того как мы обработали текущий найденный объект.
Тем не менее, данный метод вполне имеет право на жизнь, если пользоваться им с умом.

Поиск по наименованию при помощи запроса

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

Обратите внимание – можно было бы использовать оператор строгого равенства, но мы для демонстрации возможностей запросов используем оператор ПОДОБНО.

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

Указанный в примере код выведет все подходящие элементы, у которых наименование содержит в себе слово “Филиал” – хоть в начале, хоть в середине, хоть в конце.

Например, подойдут такие наименования: “Филиал 1”, “Первый Филиал”, “Вспомогательный Филиал 2”.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

семнадцать + 8 =

К НАЧАЛУ