Господа, мне нужно в запросе получить договора, в наименовании которых есть словосочетания «№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 |
Конкурс гениев. Хотел написать.
А запрос не подходит? Еще и прямой может быть. Запрос однозначно проиграет, когда мне нужно раз 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) и далее работать с ними. В моем конкурсе победили:
0 |
0 / 0 / 0 Регистрация: 24.12.2008 Сообщений: 1,399 |
|
27.04.2011, 03:20 |
9 |
Благодарю всех ответивших. Я не предполагал такого количества вариантов. Так ведь один тогда запрос напрашивается. А потом обходить выборку….
Главное, я хотел обратить внимание, насколько обижено Наименование по сравнению с методами реквизитов. Пришла в голову может быть глупая мысль.
0 |
0 / 0 / 1 Регистрация: 22.06.2013 Сообщений: 9 |
|
27.04.2011, 03:59 |
10 |
Пришла в голову может быть глупая мысль. Так, вроде, Наименование и Код не являются реквизитами 1 место — ветерану, за инвариантность — что-то уместность этого красивого термина вызывает у меня сомнения.
0 |
1 / 1 / 0 Регистрация: 15.11.2009 Сообщений: 947 |
|
27.04.2011, 19:03 |
11 |
Собственно, кто ветеран, догадаться можно, но …инвариантность в чем ? Решения. Имею в виду, что новичок реализует первое пришедшее в голову решение, а специалист продумает несколько вариантов. И выберет лучший из них. У нас в коллективе бывает обсуждаем выбор: сделать так или этак. И я тогда спрашиваю: знаете какое лучшее? Третье.
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 процентов годовых и вложив его в свое дело. По прогноза
Найти товар на складе определенного предприятия Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 14 |