Как найти по наименованию в запросе 1с

Господа, мне нужно в запросе получить договора, в наименовании которых есть словосочетания «№100500» и «рублевый»

Наименование «Мой договор за нумером №100500 всех собак рублевый» должен попасть в выборку.

Запрос.Текст = «ВЫБРАТЬ

               |    ДоговорыКонтрагентов.Ссылка

               |ИЗ

               |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

               |ГДЕ

               |ДоговорыКонтрагентов.Наименование ПОДОБНО &Наименование»;

Запрос.установитьПараметр(«наименование»,»%№100500%»); //установит отбор только на «№100500», а нужно еще на «рублевый»

как такое сделать?

 0 

   

Распечатать

1С 8.3 : Запрос по вхождению искомой строки в наименования элементов справочника

В данной статье я расскажу вам как быстро найти в справочнике элементы у которых в наименовании присутствует вхождение искомой нами строки:

Текст запроса будет выглядеть так:

Код 1C v 8.х

 Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Товары КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска";

Запрос.УстановитьПараметр("ПараметрСтрокаПоиска", ПараметрСтрокаПоиска);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;

где оператор запроса ПОДРОБНО как раз и будет искать вхождения ПараметрСтрокаПоиска по всем элементам справочника Номенклатура.

Установить значение параметра ПараметрСтрокаПоиска можно командой:

Код 1C v 8.х

 РезультатПоиска.Параметры.УстановитьЗначениеПараметра("ПараметрСтрокаПоиска", "%" + СтрокаПоиска + "%");   

Подобным образом можно организовать поиск по точному вхождению строки. Такой способ подходит для поиска элемента справочника например по коду. Строка запроса изменится и будет выглядеть так:

|Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска

Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.

Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

  • % (процент): последовательность, содержащая любое количество произвольных символов
  • _ (подчеркивание): один произвольный символ
  • […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
  • [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания

Содержание:

При реализации прикладных задач в программе 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С компании «Кодерлайн»

Быков Владимир

Слушатель курса Разработка и оптимизация запросов в 1С:Предприятие 8.3 столкнулся с трудностями при обращении к конкретному объекту непосредственно в запросе. С аналогичной задачей может столкнуться каждый, поэтому мы решили опубликовать вопрос слушателя и ответ тренера из Мастер-группы курса.

Вопрос

В самом начале курса было показано, как найти объект на встроенном языке, например, НайтиПоНаименованию или НайтиПоКоду и передать его в запрос через параметр. А можно ли обратиться к объекту прямо в запросе, не используя параметр. Например, найти номенклатуру, зная её точное название  или артикул?

Ответ тренера

Искать по произвольному реквизиту в запросе тоже можно, сравнивая значение этого реквизита с примитивными типами. Разумеется, значение реквизита так же должно иметь примитивный тип.

Выборка номенклатуры по конкретному значению артикула:

ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Артикул = "Арт1234"

Если значение реквизита не является примитивным типом, требуется через точку перейти на следующий уровень детализации.

То есть, чтобы выбрать номенклатуру с единицей измерения “штука”, нельзя написать

Номенклатура.ЕдиницаИзмерения = "Шт" 

Правильным будет следующее условие:

Номенклатура.ЕдиницаИзмерения.Наименование = "Шт".

P.S.

Понимать, как работают запросы и уметь их строить — обязательный навык для всех, кто дорабатывает и внедряет 1С.

После курса Вы сможете:

  • Строить сложные запросы с несколькими источниками данных
  • Уверенно задействовать вложенные запросы и временные таблицы
  • Использовать встроенный язык для обработки результатов запроса
  • Учитывать особенности соединений и объединений нескольких таблиц.
  • Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.

1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

1

Плевое дело — найти товар по наименованию

26.04.2011, 00:34. Показов 26806. Ответов 13


Студворк — интернет-сервис помощи студентам

Всем хорош и удал метод «НайтиПоНаименованию». Только в жизни не все так просто. Иногда нужно найти строку спр-ка по совпадению наименования и парочки реквизитов.
Когда проблема аналогична, но найти только по реквизитам, из них хоть один с признаком «Сортировка» я делаю «ВыбратьЭлементыПоРеквизиту». В цикле пробегаю по нескольким строкам (у них совпадает основной реквизит) и сравниваю остальные реквизиты. Получается быстро.
А как быть с наименованием? Только полный перебор всех строк справочника! Вот ж. !

Примечание: ВыбратьЭлементыПоРеквизиту(«Наименование») не катит.

Вопрос не горячий, просто давно мучал а сейчас опять всплыл.
У кого есть идеи? Открываю конкурс геев.



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

26.04.2011, 01:08

2

А запрос не подходит? Еще и прямой может быть.

Цитата
Сообщение от Дайнеко

Открываю конкурс геев.

Чего?



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

26.04.2011, 01:26

3

Конкурс гениев. Хотел написать.

Цитата
Сообщение от unknown181538

А запрос не подходит? Еще и прямой может быть.

Запрос однозначно проиграет, когда мне нужно раз 300 поискать товар. Запрос может и быстро шарит, но очень медленно запрягает. Механизм обычно нужен при импорте больших массивов. Поэтому как представлю, что все 300 раз сообщение «Выполняется запрос», так вздрогну. Я пишу не голословно, т.к. уже проверял поиск товара среди 50 тыс. строк. Время почти сопоставимо с полным перебором.

Добавлено: «Прямой», я так понимаю, это нестандартными ср-ми. Вот не знаком. Но стоит ли эффект затрат на освоение метода?



0



0 / 0 / 1

Регистрация: 22.06.2013

Сообщений: 9

26.04.2011, 02:18

4

Значит, в справочнике есть несколько элементов с одинаковым наименованием ?
Или я не понял проблему ?

Если понял, то можно попробовать примерно следующее :

Код

    STR = "Буженина";
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|NM = Справочник.Номенклатура.ТекущийЭлемент;
|Name = Справочник.Номенклатура.Наименование;
|Condition (TrimAll(Name) = STR);
|Группировка NM Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
TZ = "";
Запрос.Выгрузить(TZ);

Вот такое точно работает (проверено, мин нет ).
Ну а дальше обойти табличку, сравнивая «боковые» реквизиты

Цитата
Сообщение от Дайнеко

Примечание: ВыбратьЭлементыПоРеквизиту(«Наименование») не катит.

… и даже ясно, почему

P.S. Все вышенаписанное было изготовлено в процессе эксперимента с запросом, так что про неприязнь автора к нему я заметил поздно

Добавлено:

Цитата
Сообщение от Дайнеко

Запрос однозначно проиграет, когда мне нужно раз 300 поискать товар

Тогда можно попробовать при импорте сформировать список для условия, а потом уже одним запросом сформировать таблицу

Или еще вариант : создать из справочника ТЗ и в ней делать поиск



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

26.04.2011, 03:18

5

Цитата
Сообщение от Дайнеко

Но стоит ли эффект затрат на освоение метода?

Если критична производительность то стоит… Тем более, что запрос к справочнику — не сложно.
Но вот как он «запрягает» на малых объемах в цикле тоже надо смотреть.

Не ясна задача — зачем искать 300 раз? Почему тогда не сделать одним запросом?



0



0 / 0 / 0

Регистрация: 28.03.2004

Сообщений: 1,913

26.04.2011, 08:02

6

Но стоит ли эффект затрат на освоение метода?

Поверь, оно того стоит. Если в результате поиска ВСЕГДА будет всего 1 элемент, лучше использовать параметризированный запрос, который будет запрягаться всего 1 раз, а потом выполняться часто и быстро. Например, при помощи такого запроса очень даже кошерно выводить, скажем, остатки в колонку в списке справочника.



0



0 / 0 / 0

Регистрация: 07.07.2008

Сообщений: 1,401

26.04.2011, 09:49

7

Запрос может и быстро шарит, но очень медленно запрягает

Ну так по сути для скуля ВыбратьПоРеквизиту — это тоже запрос. ;-)

Так что те-же яйца, вид сбоку. Единственно что прямой запрос к скулю побыстрее будет

Как вариант шоб быстрее искало — делаешь список что надо проверить, делаешь прямой запрос к бд, результаты в временную таблицу и потом мелкозапросами к ней — записей мало, только те что надо.Будет быстро работать.



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

27.04.2011, 00:49

8

Извините, на день пропал в трудах.
Благодарю всех ответивших. Я не предполагал такого количества вариантов.
Все-таки повторю задание, кто-то не понял. При импорте массива товаров (я махнул аж 300) в справочник (50тыс, не меньше) программа должна проверить существование каждого товара по совпадению наименования (могут повторятся) и 2-3 реквизитов (и они не обязательны). Вот почему много поисков.

Главное, я хотел обратить внимание, насколько обижено Наименование по сравнению с методами реквизитов. Аналогичная проблема поиск только по реквизитам решилась бы легко.

Концептуально свожу предложения к след-му: одним запросом выбрать подходящие по наимен-ию товары (чуть больше 300) и далее работать с ними.

В моем конкурсе победили:
1 место — ветерану, за инвариантность
2 место — коллеге, за передовые технологии
3 место — Unknow, за оперативность
Vytfil — почетный приз за глубокомыслие



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

27.04.2011, 03:20

9

Цитата
Сообщение от Дайнеко

Благодарю всех ответивших. Я не предполагал такого количества вариантов.
Все-таки повторю задание, кто-то не понял. При импорте массива товаров (я махнул аж 300) в справочник (50тыс, не меньше) программа должна проверить существование каждого товара по совпадению наименования (могут повторятся) и 2-3 реквизитов (и они не обязательны). Вот почему много поисков.

Так ведь один тогда запрос напрашивается. А потом обходить выборку….

Цитата
Сообщение от Дайнеко

Главное, я хотел обратить внимание, насколько обижено Наименование по сравнению с методами реквизитов.

Пришла в голову может быть глупая мысль.
А не работает ВыбратьПоРеквизиту(«Наименование»)? А то что ж оно обижено-то?



0



0 / 0 / 1

Регистрация: 22.06.2013

Сообщений: 9

27.04.2011, 03:59

10

Цитата
Сообщение от unknown181538

Пришла в голову может быть глупая мысль.
А не работает ВыбратьПоРеквизиту(«Наименование»)? А то что ж оно обижено-то?

Так, вроде, Наименование и Код не являются реквизитами

1 место — ветерану, за инвариантность — что-то уместность этого красивого термина вызывает у меня сомнения.
Как ни вертел это слово, так и не догадался, за что же приз ?
Собственно, кто ветеран, догадаться можно, но …инвариантность в чем ?



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

27.04.2011, 19:03

11

Цитата
Сообщение от vbs

Собственно, кто ветеран, догадаться можно, но …инвариантность в чем ?

Решения. Имею в виду, что новичок реализует первое пришедшее в голову решение, а специалист продумает несколько вариантов. И выберет лучший из них.

У нас в коллективе бывает обсуждаем выбор: сделать так или этак. И я тогда спрашиваю: знаете какое лучшее? Третье.



0



0 / 0 / 1

Регистрация: 22.06.2013

Сообщений: 9

27.04.2011, 21:37

12

Не сочти занудством, но я бы, скорее, в данном контексте применил термин «поливариантность»,
ибо «инвариантность» все же не совсем в тему



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

28.04.2011, 11:55

13

Ну ты зануда!



0



0 / 0 / 1

Регистрация: 22.06.2013

Сообщений: 9

28.04.2011, 13:15

14

Занудство и лень — неотъемлемые качества для программиста



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

28.04.2011, 13:15

Помогаю со студенческими работами здесь

Необходимо чтобы когда товар появился, то строка с пользователем, у которого есть этот товар, подсветилась
есть таблица с подпиской на товар
|Пользователь | Дата добавления | Дата изменения | Количество…

Предприниматель, начав дело, взял кредит размером k рублей под p процентов годовых и вложив его в свое дело. По прогноза
Предприниматель, начав дело, взял кредит размером k рублей под p процентов годовых и вложив его в…

Найти просроченный товар
Работа с записями, есть наименование, текущая дата, дата производства, срок годности. Найти…

Найти товар на складе определенного предприятия
необходимо сделать как то чтоб любой фрагмент документа добавлялся в любой другой документ, немогу…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

14

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти яндекс гугл хром
  • Как найти проводимость участка
  • Как найти сумму абсцисс пересечения точек параболы
  • Как составить чертеж комнаты
  • Как найти волшебный карандаш

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии