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

10.01.13

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

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

Скачать файлы

Наименование Файл Версия Размер
Быстрый подбор по вхождению слова
.zip 4,64Kb
158
.zip 4,64Kb 158 Скачать

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

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

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

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

|

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

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

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

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

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

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

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

...

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

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

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

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

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

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

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

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

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

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

См. также

SALE! 20%

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    121632    670    389    

711

SALE! 25%

Infostart PrintWizard

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

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

18000 15300 руб.

06.10.2023    7268    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

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

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

10000 8000 руб.

10.11.2023    3513    11    1    

33

SALE! 30%

PowerTools

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

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

3600 2520 руб.

14.01.2013    177729    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

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

5000 руб.

07.02.2018    99342    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18104    6    8    

39

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28099    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23598    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. andru_dv 10.01.13 13:31 Сейчас в теме
А если список справочника содержит десятки тысяч наименований, какая будет производительность у этого решения?
И ещё. Можно ли сделать распознавание регистра верхний/нижний.
3. ixijixi 1775 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 6431 10.01.13 18:17 Сейчас в теме
(2) За наименования со спецсимволами нужно отрывать мышку...
6. O-Planet 6431 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 186 30.04.13 09:13 Сейчас в теме
(12) Круто! И всего то каких-то шесть - семь лет понадобилось :)
Интересно, сколько лет понадобится, чтобы к этому ещё произвольные фильтры прикрутить?

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

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

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

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