Быстрый подбор по вхождению слова в наименование

10.01.13

Разработка - Инструментарий разработчика

Все мы знаем, что быстрый подбор чего-то выполняется по совпадению первых символов наименования с введенным словом. А можно ли сделать, чтобы в выпадающий список попадали позиции, совпадающие по произвольному вхождению введенного слова в наименование?

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Быстрый подбор по вхождению слова
.zip 4,64Kb
159
159 Скачать (1 SM) Купить за 1 850 руб.

И чего не сделаешь ради клиента!

Говоришь: "Нельзя этого! Не предусмотрели разрабы 1С!"

А он: "Хоцца!"

И ведь не приемлют отказа... А может, это только тогда, когда со мной работают? Умеют же другие говорить "нет", и им охотно верят! Помнится, какой-то новый клиент на полном серьезе уверял меня, что нельзя в отчет 1С вывести одновременно сумму из шапки и из табличной части одного документа по строкам, чтобы сумма в шапке не умножилась на количество строк. Так программист сказал... И сделал поэтому дублирующий табличную часть и шапку регистр, чтобы данные в отчеты выводить. Разумеется, взял за свою работу оплату...

Но в моем случае, ситуация хуже, хотя проблему начинаешь понимать только в процессе реализации. На первый взгляд, кажется, что все просто, ведь выпадающий список заполнить по вхождению не сложно. Используем ПОДОБНО и - вуаля: список есть!

З=Новый Запрос(

"ВЫБРАТЬ

| Контрагенты.Наименование КАК Наименование

|ИЗ

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

|ГДЕ

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

| И НЕ Контрагенты.ПометкаУдаления

| И НЕ Контрагенты.ЭтоГруппа

|

|УПОРЯДОЧИТЬ ПО

| Наименование");

З.УстановитьПараметр("Наименование","%"+Текст+"%");

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

СписокКА.ЗагрузитьЗначения(Рез.ВыгрузитьКолонку("Наименование"));

Осталось решить вопрос, как присоединенный к полю ввода список открыть. Казалось бы, простая функция: изменить программно видимость существующего списка, привязанного к элементу формы. А нету!

Но решение вроде как дает метод "ВыбратьИзСписка". Он позволяет открыть сформированный список и что-то из него выбрать. Правда, список в этом случае уже не будет списком поля ввода, а должен быть создан программно. Но разве это проблема? 

...

СписокКА = Новый СписокЗначений;

СписокКА.ЗагрузитьЗначения(Рез.ВыгрузитьКолонку("Наименование"));

ВыбратьИзСписка(СписокКА, ЭлементыФормы.ПолеКА);

Проблема появляется, когда мы это решим опробовать в работе: открывающийся список подло перехватывает фокус ввода и ждет, чтобы мы что-нибудь из него выбрали. А если мы хотим продолжить ввод слова, как тогда?

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

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

И так,  решение:

  • - Делаем список на форме, видимость = false
  • - Заполнение вешаем на обработчик автоподбора текста
  • - Заполнили - делаем видимым

И - фишка! Привязываем к форме обработчик ожидания: если список выбора открыт и фокус на поле ввода или этом списке - все ок. Как только фокус ушел на что-то еще - список закрываем.

Работает! Можно скачать в прилагаемом архиве и использовать.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169303    937    403    

905

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    12614    99    42    

101

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    26539    90    48    

134

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    16831    41    15    

75

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

15000 руб.

10.11.2023    11398    40    27    

66

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    190552    1150    0    

918

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    780    2    0    

4

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    103934    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. andru_dv 10.01.13 13:31 Сейчас в теме
А если список справочника содержит десятки тысяч наименований, какая будет производительность у этого решения?
И ещё. Можно ли сделать распознавание регистра верхний/нижний.
3. ixijixi 1975 10.01.13 17:01 Сейчас в теме
(1)ВЫБРАТЬ ПЕРВЫЕ 100 подойдет?
5. TMV 14 10.01.13 21:17 Сейчас в теме
(3) the1, в ЗУП при подборе сотрудников стандартом идет 50, (1) еще можно начинать искать только после набора 3 букв и более..
(4) интересно можно ли подобную феньку прикрутить к табличной части?
И еще, мне ж все-таки иногда нужно из списка выбрать значение, а не просто его видеть..
2. serega3333 10.01.13 16:30 Сейчас в теме
З.УстановитьПараметр("Наименование","%"+Текст+"%") - если искать товары с % и другими спецсимволами - не прокатит, будь мужиком, прокачай до конца =)
4. O-Planet 6452 10.01.13 18:17 Сейчас в теме
(2) За наименования со спецсимволами нужно отрывать мышку...
6. O-Planet 6452 11.01.13 00:50 Сейчас в теме
У меня там тоже есть параметр, после скольки символов в слове начинать искать. А по поводу ТЧ, если очень захотеть, то можно.
7. TMV 14 11.01.13 11:57 Сейчас в теме
(6) предлагаете двигать по форме список?
8. petrov_al 10 14.01.13 08:54 Сейчас в теме
А полнотекстовый поиск не пробовали, потестите...думаю по скорости он опередит ваш механизм
9. пользователь 19.02.13 19:36
Сообщение было скрыто модератором.
...
10. пользователь 19.02.13 19:36
Сообщение было скрыто модератором.
...
11. пользователь 19.02.13 19:39
Сообщение было скрыто модератором.
...
12. maxis33 45 11.03.13 10:56 Сейчас в теме
1Совцы об этом тоже подумали...
http://v8.1c.ru/o7/201302ss/
farraf; mumilkin; a-novoselov; +3 Ответить
13. ADirks 187 30.04.13 09:13 Сейчас в теме
(12) Круто! И всего то каких-то шесть - семь лет понадобилось :)
Интересно, сколько лет понадобится, чтобы к этому ещё произвольные фильтры прикрутить?

По хорошему, надо выделить поставщика данных для такого поля ввода, и дать им рулить как хочешь. Фильтруй по чём и как хочешь, показывай что хочешь (например, остатки товара полезно показывать). Хорошо бы ещё иконками в списке рулить, и строки раскрашивать. Но этого конечно 1С никогда не сделает.

А в семёрке это реализовано :)
14. tango 546 30.04.13 10:13 Сейчас в теме
(12) maxis33, подумали: ...а-а-а! - не нам обновлять!..
18. kenza 22.07.13 12:14 Сейчас в теме
(12) maxis33, чет не могу найти у себя подобных свойств.
15. tango 546 30.04.13 10:23 Сейчас в теме
чё-та не пойму, обещалово не работает
http://v8.1c.ru/o7/201304rl/index.htm
платформа 8.3.2.172 - ни областей, ни ссылок
16. Alexander.Shvets 222 30.04.13 16:57 Сейчас в теме
Спасибо! Натолкнуло на мысль =)))
Буду пробовать в упр. приложении реализовать... А вот это будет очень интересно =))
17. oslokot 196 24.06.13 15:01 Сейчас в теме
O-Planet Добрый день! можно у Вас попросить обработку.
Сам автоподбор у меня работает, все хорошо, но не могу победить перехват фокуса.
Идея с дополнительным списком на форме понравилась, но застрял с ее реализацией. Как то корявенько получается.
Можно поглядеть? если не трудно, скиньте на oslokot(собака)mail.ru
19. oslokot 196 23.07.13 09:20 Сейчас в теме
20. stepman3 7 28.08.13 13:17 Сейчас в теме
а в тонком клиенте будет работать? ;-)
21. hibico 268 12.03.14 13:54 Сейчас в теме
Столкнулся с подобной проблемой. Решил несколько по другому. Поле списка создается программно.
Перем мПолеПодбора, мЭлементПодбора;

Процедура ВыборВПоле(Элемент, ЭлементСписка)
	мЭлементПодбора.Значение = ЭлементСписка.Значение;
	ЭлементыФормы.Удалить(Элемент);
КонецПроцедуры

Процедура ПолеВводаАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	СписокВыбора = ЭлементыФормы.Найти("ПолеПодбора");
	Если СписокВыбора = Неопределено Тогда
		СписокВыбора = ЭлементыФормы.Добавить(Тип("ПолеСписка"),"ПолеПодбора");
		СписокВыбора.Верх = Элемент.Верх+Элемент.Высота;
		СписокВыбора.Лево = Элемент.Лево;
		СписокВыбора.Ширина = Элемент.Ширина;
		СписокВыбора.УстановитьДействие("Выбор",Новый Действие("ВыборВПоле"));
		СписокВыбора.ПорядокОбхода = Элемент.ПорядокОбхода+1;
	КонецЕсли;
	
	мЭлементПодбора = Элемент;
	мПолеПодбора = СписокВыбора;
	
	СписокОтбора = ОтобратьЗначения(Текст); // отдельная процедура подбора по первым символам
	                                        // здесь не привожу
	Если СписокОтбора.Количество()<2 Тогда
		ЭлементыФормы.Удалить(СписокВыбора);
		мПолеПодбора = Неопределено;
	Иначе
		СписокВыбора.Значение = СписокОтбора;
		СписокВыбора.Высота = 20*СписокОтбора.Количество();
	КонецЕсли;
	
	Если СписокОтбора.Количество()=1 Тогда
		ТекстАвтоПодбора = СписокОтбора[0].Значение;
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбновлениеОтображения()
	Если мПолеПодбора <> Неопределено И ТекущийЭлемент <> мПолеПодбора И ТекущийЭлемент <> мЭлементПодбора Тогда
		ЭлементыФормы.Удалить(мПолеПодбора);
	КонецЕсли;	
КонецПроцедуры

Показать

Пример прикрепил.
Прикрепленные файлы:
Автоподбор.epf
blich; galuna256; akR00b; vsozansky; +4 Ответить
25. sokir 2 19.08.16 18:13 Сейчас в теме
(21) hibico, это нормально работает с полем ввода, но не работает с табличным полем, а ведь именно в табличном поле пользователи и набирают товар.
22. пользователь 14.04.14 16:38
Сообщение было скрыто модератором.
...
23. luic 17.08.14 10:03 Сейчас в теме
Класс!!! Жаль что у меня 8.1 Очень нужная вещь!!!
24. adapter 418 05.06.15 12:27 Сейчас в теме
зачем изобретать велосипеды? В 8.2 все работает через процедуру

ОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Значение = ОтобратьЗначения(Текст);

26. qwera 29.01.24 22:42 Сейчас в теме
O-Planet, очень хочется сравнить ваш вариант обработки с предложенным hibico. Не сможете прислать мне на почту kval(собака)ya.ru ? Был бы очень признателен!!
Оставьте свое сообщение