У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;
В данном случае рассмотрим поиск по наименованию.
Синтаксис:
Справочники.<НазваниеСправочника>.НайтиПоНаименованию (<Значение>, <ПоискПоПолномуСоответсвию>, <Родитель>, <Владелец>)
Параметры:
НазваниеСправочника — наименование справочника, к примеру Сотрудники.
Значение— значение в реквизите Наименование.
ПоискПоПолномуСоответсвию — По умолчанию установлен в значении Ложь, т.е. ищется соответствие левой части (пример: ищем Алекс то найдем Алексей). Но если установить в истину то поиск будет вестись по полному значению, кроме пробелов в конце строки. (необязательный)
Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)
Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)
Результат:
Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.
Если существует несколько элементов, возвращается только 1.
Пример:
НаименованиеЭлемента = "Иванов Иван Иванович"; ТекСправочник = Справочники.Преподаватели; РезультатПоискаПоНаименованию = ТекСправочник.НайтиПоНаименованию(НаименованиеЭлемента); Если РезультатПоискаПоНаименованию = ТекСправочник.ПустаяСсылка() Тогда Сообщить("Не найден"); Иначе Сообщить(РезультатПоискаПоНаименованию.код); КонецЕсли;
Поиск с учетом родителя:
Университет = Справочники.Университеты.НайтиПоНаименованию("МГИМО");
Преподователь = ТекСправочник.НайтиПоНаименованию("Иванов Иваон Иванович",,Университет);
Содержание:
При реализации прикладных задач в программе 1С:Предприятие 8 у разработчика может возникнуть потребность использовать прикладные объекты ссылочного типа. У которых есть свойство «Наименование», но нет возможности с помощью встроенного языка 1С Предприятие обратиться «напрямую» к объекту базы данных 1С, как к предопределенному элементу справочника 1С т.к. они были созданы пользователем в информационной базе 1С 8.
Для решения таких задач можно воспользоваться методом «НайтиПоНаименованию», который присутствует у некоторых объектов конфигурации или с помощью объекта встроенного языка «Запрос».
1. Метод «НайтиПоНаименованию» в конфигурации «Справочник»
Иногда в компаниях реквизит «наименование» элемента справочника формируется пользователем в строго установленной последовательности. В наименовании элемента справочника может присутствовать какое-нибудь свойства товара.
У объекта конфигурации Справочник есть метод НайтиПоНаимнованию (Рис. 1).
Рисунок №1.
Наименование – тип Строка. Текст, по которому нужно найти.
Точное соответствие – тип булево. Истина – искать точное соответствие за исключением пробелов в конце наименования. Ложь – искать соответствие по левой части наименования.
Родитель – тип Справочник. В пределах которого нужно найти элемент справочника 1С.
Владелец – тип Справочник. В пределах которого нужно найти элемент справочника 1С.
Рисунок № 2.
Для иллюстрации будет приведен пример в демонстрационной базе 1С Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.112.34).
Запустим информационную базу в режиме Конфигуратор в 1С. Создадим обработку. В форме обработки создадим команду, реквизит формы (Рис. 3) и опишем действие команды (Рис. 4). Сохраним созданную обработку, как внешнюю обработку.
Рисунок №3.
Рисунок № 4.
Теперь можно запустить работу системы 1С: Предприятия 8.3 в пользовательском режиме. Открыть внешнюю обработку ввести текст в реквизит «Текст поиска». Введем текст «Шоколад» и нажмем команду «Найти».
Рисунок № 5.
Система нашла в справочнике «Номенклатура» первый попавшийся элемент. Система искала соответствие по левой части наименования.
2. Объект встроенного языка «Запрос»
Получить объект базы данных 1С также можно с помощью объекта встроенного языка «Запрос». Запустим информационную базу в режиме Конфигуратор в 1С. Изменим код встроенного языка 1С Предприятие в модуле формы внешней обработки (Рис. 6).
Рисунок № 6.
Сохраним изменения и запустим информационную базу в пользовательском режиме 1С.
Рисунок № 7.
Откроем внешнюю обработку, заполним реквизит «Текст поиска» (Рис. 7). Нажимаем команду «Найти». В результате на экран система выведет сообщения с наименованиями из справочника Номенклатура у которых левая часть наименования начинается с текста «Шоколад».
Специалист 1С компании «Кодерлайн»
Быков Владимир
Как работает поиск по наименованию? |
Я |
18.05.15 – 09:13
Уважаемые коллеги, разъясните пожалуйста, что это такое недокументированное поведение функции или неправильное ее использование?
В коде есть такая строка:
Результат = Неопределено;
Результат = Справочники.Партнеры.НайтиПоНаименованию(“”);
После выполнения этой строки в переменной Результат “сидит первый элемент справочника”
Читаем СП:
Возвращаемое значение:
Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0), то будет возвращено Неопределено.
Платформа 1С:Предприятие 8.3 (8.3.6.1977)
ЧЯНТД?
1 – 18.05.15 – 09:13
(0) прочитай СП целиком
2 – 18.05.15 – 09:13
F tckb Результат = Справочники.Партнеры.НайтиПоНаименованию(“”, Истина); ?
3 – 18.05.15 – 09:15
(1) прочитал уже 5 раз
4 – 18.05.15 – 09:15
(3) не верю
5 – 18.05.15 – 09:16
(2) Да, так пустышка
6 – 18.05.15 – 09:17
(5) И спосле этого ты утверждаешь, что прочитал весь СП?
7 – 18.05.15 – 09:17
(0) Читать не умеешь, вестимо. Какая длина наименования справочника “Номенклатура” в конфигураторе?
8 – 18.05.15 – 09:18
(7) ты тоже не умеешь..
9 – 18.05.15 – 09:19
(0) “в переменной Результат “сидит первый элемент справочника””
Покажи на картинке
10 – 18.05.15 – 09:19
(6) Там написано
Поиск будет успешным, если строка поиска: в случае значения параметра Ложь – будет соответствовать левой части наименования; в случае значения параметра Истина – будет полностью совпадать с наименованием (за исключением “хвостовых” пробелов в наименовании).
Про то что будет найден первый элемент если значение параметра – ложь ничего не сказано
11 – 18.05.15 – 09:20
(10) целиком читай…
12 – 18.05.15 – 09:20
(10) А что в твоём понимании “первый”?
13 – 18.05.15 – 09:22
(10) Так первый элемент и соответствует пустой строке в левой части. Разве нет?
14 – 18.05.15 – 09:22
(12) то, что скуль юзал индекс по наименованию и так уж получилось, что он отсортирован по наименованию. кстати, то, что он “первый” – недокументировано, потому что это не всегда так.
15 – 18.05.15 – 09:23
(12) Делаю запрос:
ВЫБРАТЬ
Партнеры.Ссылка,
Партнеры.Наименование
ИЗ
Справочник.Партнеры КАК Партнеры
В первой строке тот элемент, который возвращает функция.
Проверял на нескольких справочниках
16 – 18.05.15 – 09:24
(15) тебя смущает, что поиск по наименованию идентичен запросу к БД?
17 – 18.05.15 – 09:24
(15) тогда в (14) не индекс по наименованию, а кластерный индекс, который по ссылке. но сути это не меняет – это может быть и не так.
18 – 18.05.15 – 09:24
(11) Там больше ничего нет, там дальше про родителя и владельца и еще Примечание:
Если существует несколько элементов с указанным наименованием, то будет найден только один из них.
19 – 18.05.15 – 09:25
(18) все правильно. то, что будет найден один из них – никак не противоречит тому, что тебе возвращается один из них…
20 – 18.05.15 – 09:25
а вот то, что он “первый” не написано, так что на это полагаться не надо.
21 – 18.05.15 – 09:30
(16) Да нет, это как раз не смущает, просто ожидал, что функция вернет мне пустышку.
Ну теперь буду знать эту особенность 🙂
22 – 18.05.15 – 09:31
(0) Насколько я понимаю, при поиске по неполному соответствию пустой строки – найдутся ВСЕ элементы справочника. Можно сказать, они все начинаются с пустой строки. Ну а возвращает первый попавшийся (без гарантий какой именно, т.к. без явного упорядочивания СУБД никакой определенный порядок не гарантирует).
23 – 18.05.15 – 09:34
Сообщить(Лев(“Как же работает поиск по наименованию”,0) = “”);
24 – 18.05.15 – 09:37
На этой фишке (отсутствие неявного упорядочивания в SQL) еще в 7.7 палились. Ибо в DBF неявное упорядочивание было, как и в файловом движке 8-ки. И при переходе на клиент-сервер алгоритмы на это завязанные – “ломались”. Сам недавно погорел, хотя прекрасно про эту фишку знал. Отладил пакетную печать на файловой и не обратил внимание, что забыл по ссылке упорядочить один запрос. А там последовательный обход двух связанных выборок. В итоге на файловой – всё ок, а в клиент-серверной бессистемно “пропускались” некоторые печатные формы. Чуть голову не сломал. Так и не вкурил, пока сервер в режим отладки не перевёл.
25 – 18.05.15 – 09:41
(19) Элемента с пустым наименованием не существует…
26 – 18.05.15 – 09:42
(25) Зато наименования ВСЕХ элементов НАЧИНАЮТСЯ с пустой строки.
27 – 18.05.15 – 09:44
(25) до кучи иди учи простейшие типы, тебе нужна Строка.
28 – 18.05.15 – 09:45
(27) Причем здесь типы сами по себе? Речь о правилах поиска.
29 – 18.05.15 – 09:45
Имхо, сравнение строк различной длины, не только для 1С “проблематично”, но и при разработке других алгоритмических языков стаяло. Ибо не в математике “проблематично”, а в логике И то, как она “решается” в том или ином языке, становится видно на строке “нулевой” длины.
30 – 18.05.15 – 09:47
А по поводу “Если для справочника наименование не задано…” – это к метаданным 1С. У документов есть дата и номер, а у справочников есть код и наименование… даже если их нет 🙂
31 – 18.05.15 – 09:48
(21) Это не особенность, это вполне документированное поведение функции в зависимости от параметра. А вот не уметь понимать прочитанное – особенность, да.
32 – 18.05.15 – 09:52
(31) Ну так написанное можно по разному трактовать…
33 – 18.05.15 – 09:55
(31) Насчёт “А вот не уметь понимать прочитанное” можно ещё поспорить. “А вот не уметь объяснить написанное” – это я бы к к разработчикам предъявил. Язык написали, а объяснения к нему… другие, видать, писали. Не на столько умные 🙂 Иногда в СП так “объяснят”, что крышу срывает в попытке осознать прочитанное.
34 – 18.05.15 – 09:56
Вот приколупались к человеку. То, что по пустой строке будут найдены все элементы – зависит от конкретной реализации поиска и нифига неочевидно на первый вгляд. Ну, кроме опытнейших разработчиков, собравшихся в этой ветке, конечно же.
35 – 18.05.15 – 10:06
(34) Ценю Ваш юмор и сарказм… но по сути – всё верно, “… не всё так однозначно.”(цы)
36 – 18.05.15 – 10:09
(34) (35) Спасибо за поддержку!
ДенисЧ Огромное спасибо!
37 – 18.05.15 – 10:13
(15) ВЫБРАТЬ ПЕРВЫЕ 1 же…
38 – 18.05.15 – 10:19
Там еще дальше параметр на точное соответствие – по умолчанию “Ложь”
39 – 18.05.15 – 10:20
Поставить в “Истина” и уже ничего не найдется
40 – 18.05.15 – 10:23
(38) (39) Ему это объяснили уже в самом начале
41 – 18.05.15 – 10:29
(40) чукча писатель)
42 – 18.05.15 – 10:58
(0) твой код эквивалентен
Наименование ПОДОБНО “” + %
то бишь все элементы
43 – 18.05.15 – 10:59
(24) что значит “неявное упорядочивание”?
44 – 18.05.15 – 11:30
(43) Наличие некоторого порядка при отсутствии явных указаний на конкретный порядок.
45 – 18.05.15 – 12:46
(44) значит в (24) брехня. Все таблицы БД 1С в sql всегда и строго упорядочены по кластерному индексу
46 – 18.05.15 – 13:06
(45) Резкий ты мой 🙂 Это же не гарантирует, что результат сложного запроса будет отсортирован по кластерному индексу первой таблицы, в нём описанному.
47 – 18.05.15 – 13:14
Это не говоря уже о том, что насколько я понимаю, в postgresql нет прямого аналога кластерных индексов mssql
48 – 18.05.15 – 13:23
(47) Кстати да, у нас postgresql
Kvant1C
49 – 18.05.15 – 13:33
Вот что нашел на счет упорядочивания в запросах:
>>Если в запросе не указано упорядочивание, то сортировка происходит по внутреннему идентификатору записи в таблице, по сути никак.
http://zapros-1c-8.ru/9-yazik-zaprosov-1c-8/8-order
+6
Поиск элемента, найти элемент справочника
&НаКлиенте
Процедура ПоКнопкеНайти(Команда)
// Вставить содержимое обработчика.
Сообщить(НайтиКонтрагента("000000001"));
КонецПроцедуры
&НаСервере
Функция НайтиКонтрагента(КодКонтрагента)
Перем КонрагентДляПоиска, СсылкаНайденногоКонрагента;
КонрагентДляПоиска = Справочники.Контрагенты;
СсылкаНайденногоКонрагента = КонрагентДляПоиска.НайтиПоКоду(КодКонтрагента);
Если СсылкаНайденногоКонрагента = КонрагентДляПоиска.ПустаяСсылка() Тогда
Возврат "Контрагент не найден";
Иначе
Возврат СсылкаНайденногоКонрагента.Наименование;
КонецЕсли;
КонецФункции;
Код 1C v 8.х
// Ниже перечислены несколько способов поиска,если элемент найден, то он возвращается,
// иначе возвращается Неопределено
СпрСотр = Справочники.Сотрудники;
НайденныйСотр = СпрСотр.НайтиПоКоду(123);
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
НайденныйСотр СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//далее нужно проверить найденное значение так:
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030");
Если РезультатПоиска.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
КонецЕсли;
// или так:
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
Если НайденныйСотр = Неопределено Тогда
.....//элемент не найден
КонецЕсли;
Код 1C v 7.x
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.НайтиЭлемент(Сотрудник);
СпрСотр.НайтиПоКоду(123);
СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//если элемент найден, он становится текущим и его можно прочитать так:
Если СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович")=1 Тогда
........НайденныйСотр = СпрСотр.ТекущийЭлемент();
КонецЕсли;
//еще пример
спр=СоздатьОбъект("Справочник.Материалы");
Если спр.НайтиПоНаименованию("Пряжа шерстяная")=1 Тогда
Предупреждение("Найденный элемент справочника имеет код "+спр.ТекущийЭлемент().Код);
Иначе
Предупреждение("Элемент с заданным наименованием не найден");
КонецЕсли;
Поиск товара по наименованию в версии 3.0 отличается от поиска в предыдущих версиях.
Рассмотрим поиск в справочниках и журналах документов.
Для поиска по наименованию необходимо установить курсор в колонку Наименование. Затем воспользоваться кнопкой Еще – Расширенный поиск
Для быстрого перехода можно воспользоваться комбинацией Alt+F с клавиатуры.
В открывшемся окне поиска указываем Что искать и Как искать
Нажимаем кнопку Найти и программа выбирает элементы по заданным параметрам
В версии 2.5 поиск устанавливал курсор на первый элемент списка, удовлетворяющий условиям поиска. В версии 3.0 поиск отбирает и выводит все элементы, удовлетворяющие условиям поиска.
Аналогичным способом осуществляется поиск элементов в журналах документов. Для поиска устанавливаем курсор в колонку, по которой будем искать и задаем параметры отбора по кнопке Еще – Расширенный поиск (Alt+F).
Поиск элементов справочника по наименованию
НазваниеСправочника — наименование справочника, к примеру Сотрудники.
Значение— значение в реквизите Наименование.
ПоискПоПолномуСоответсвию — По умолчанию установлен в значении Ложь, т.е. ищется соответствие левой части (пример: ищем Алекс то найдем Алексей). Но если установить в истину то поиск будет вестись по полному значению, кроме пробелов в конце строки. (необязательный)
Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)
Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)
Результат:
Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.
Удобный поиск товаров
Главная претензия пользователей — невозможность поиска номенклатуры по части наименования (например, если вводить символы не из начала названия, а из середины). Вдобавок, многим не хватает возможности поиска номенклатуры по дополнительному реквизиту.
Поиск товара по части наименования в 1С
Расширение добавляет возможность поиска товаров по части наименования. При этом можно вводить кусок не только из начала названия, но и из середины или конца.
Удобный поиск по штрихкоду в 1С
Теперь для поиска по штрихкоду необязательно вводить его целиком с самого начала, достаточно ввести несколько значимых цифр.
Поиск товаров по дополнительному реквизиту в 1С
Нередко в дополнительных реквизитах номенклатуры содержится какой-либо уникальный идентификатор товара (например, код на сайте). В таком случае пользователям иногда удобнее искать товары по значению этого реквизита.
В таком случае в настройках расширения выберем нужный дополнительный реквизит для поиска.
Для корректной работы расширения необходимо отключить безопасный режим .
Смотреть комментарии (4)
почему то не работает поиск по доп реквизиту. При попытке выбрать доп реквизит в разделе Администрирование открывается пустое окно с неактивными кнопками создать и выбрать
Дмитрий Медведков, 2021-05-30
По всей видимости, у вас вообще отключен функционал доп. реквизитов в базе.
Это работает только через подбор или будет работать и в прайсе или в номеклатуре?
Дмитрий Медведков, 2021-12-02
Если в номенклатурном справочнике или прайсе вы аналогичным образом будете подбирать номенклатуру, то будет работать и там.
Для добавления комментариев необходимо авторизоваться на сайте.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
- Бухгалтерия предприятия 3.0
- Управление торговлей 11.4, 11.5
- Управление торговлей 3 (KZ) *
- Управление торговлей 3 (BY) **
- Комплексная автоматизация 2.4 (BY) **
- Управление предприятием ERP 2.4, 2.5
- Комплексная автоматизация 2.4, 2.5
- Розница 2.2, 2.3
- Управление нашей фирмой 1.6
- Бухгалтерия для Казахстана 3.0
Наверняка, у вас есть много вопросов относительно оплаты (как оплатить, как получить разработку, не возникнут ли проблемы и т.п.).
Ответы на самые распространенные вопросы, относящиеся к процессу покупки моих разработок, приведены на странице заказа. Для перехода к ней нажмите Перейти к оплате .
Там же вы найдете мои контакты, на случай если останутся вопросы.
Для скачивания этой разработки необходимо зарегистрироваться на сайте, потом авторизоваться и приобрести годовую подписку (стоит 1500 руб, оплачивается единоразово). Она даст вам доступ более чем к 200 разработкам на сайте.