И чего не сделаешь ради клиента!
Говоришь: «Нельзя этого! Не предусмотрели разрабы 1С!»
А он: «Хоцца!»
И ведь не приемлют отказа… А может, это только тогда, когда со мной работают? Умеют же другие говорить «нет», и им охотно верят! Помнится, какой-то новый клиент на полном серьезе уверял меня, что нельзя в отчет 1С вывести одновременно сумму из шапки и из табличной части одного документа по строкам, чтобы сумма в шапке не умножилась на количество строк. Так программист сказал… И сделал поэтому дублирующий табличную часть и шапку регистр, чтобы данные в отчеты выводить. Разумеется, взял за свою работу оплату…
Но в моем случае, ситуация хуже, хотя проблему начинаешь понимать только в процессе реализации. На первый взгляд, кажется, что все просто, ведь выпадающий список заполнить по вхождению не сложно. Используем ПОДОБНО и — вуаля: список есть!
З=Новый Запрос(
"ВЫБРАТЬ
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &Наименование
| И НЕ Контрагенты.ПометкаУдаления
| И НЕ Контрагенты.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Наименование");
З.УстановитьПараметр("Наименование","%"+Текст+"%");
Рез=З.Выполнить().Выгрузить();
СписокКА.ЗагрузитьЗначения(Рез.ВыгрузитьКолонку("Наименование"));
Осталось решить вопрос, как присоединенный к полю ввода список открыть. Казалось бы, простая функция: изменить программно видимость существующего списка, привязанного к элементу формы. А нету!
Но решение вроде как дает метод «ВыбратьИзСписка». Он позволяет открыть сформированный список и что-то из него выбрать. Правда, список в этом случае уже не будет списком поля ввода, а должен быть создан программно. Но разве это проблема?
...
СписокКА = Новый СписокЗначений;
СписокКА.ЗагрузитьЗначения(Рез.ВыгрузитьКолонку("Наименование"));
ВыбратьИзСписка(СписокКА, ЭлементыФормы.ПолеКА);
Проблема появляется, когда мы это решим опробовать в работе: открывающийся список подло перехватывает фокус ввода и ждет, чтобы мы что-нибудь из него выбрали. А если мы хотим продолжить ввод слова, как тогда?
Похоже, и это решение не подходит, ведь во всех нормальных средах разработки имеется возможность продолжать ввод в поле ввода, а список найденных значений, не перехватывая фокус ввода, снизу сам по себе обновляется, дружелюбно ожидая, пока на него обратят внимание. Или не обратят. И тогда он сам закроется, как только мы перестанем вводить нужную нам информацию и займемся чем-то еще…
Похоже, придется делать все самим. Но тому, кто столкнулся с проблемой впервые, придется потратить пару часов на поиск решения в сети, ведь хочется же верить, что большой брат заботится о нас и предусмотрел программное открытие списка выбора. И пару часов точно придется потратить, чтобы себя убедить в обратном. Потому и публикую.
И так, решение:
- — Делаем список на форме, видимость = false
- — Заполнение вешаем на обработчик автоподбора текста
- — Заполнили — делаем видимым
И — фишка! Привязываем к форме обработчик ожидания: если список выбора открыт и фокус на поле ввода или этом списке — все ок. Как только фокус ушел на что-то еще — список закрываем.
Работает! Можно скачать в прилагаемом архиве и использовать.
А если список справочника содержит десятки тысяч наименований, какая будет производительность у этого решения?
И ещё. Можно ли сделать распознавание регистра верхний/нижний.
З.УстановитьПараметр(«Наименование»,»%»+Текст+»%») — если искать товары с % и другими спецсимволами — не прокатит, будь мужиком, прокачай до конца =)
(1)ВЫБРАТЬ ПЕРВЫЕ 100 подойдет?
(2) За наименования со спецсимволами нужно отрывать мышку…
(3) the1, в ЗУП при подборе сотрудников стандартом идет 50, (1) еще можно начинать искать только после набора 3 букв и более..
(4) интересно можно ли подобную феньку прикрутить к табличной части?
И еще, мне ж все-таки иногда нужно из списка выбрать значение, а не просто его видеть..
У меня там тоже есть параметр, после скольки символов в слове начинать искать. А по поводу ТЧ, если очень захотеть, то можно.
(6) предлагаете двигать по форме список?
А полнотекстовый поиск не пробовали, потестите…думаю по скорости он опередит ваш механизм
1Совцы об этом тоже подумали…
http://v8.1c.ru/o7/201302ss/
(12) Круто! И всего то каких-то шесть — семь лет понадобилось 🙂
Интересно, сколько лет понадобится, чтобы к этому ещё произвольные фильтры прикрутить?
По хорошему, надо выделить поставщика данных для такого поля ввода, и дать им рулить как хочешь. Фильтруй по чём и как хочешь, показывай что хочешь (например, остатки товара полезно показывать). Хорошо бы ещё иконками в списке рулить, и строки раскрашивать. Но этого конечно 1С никогда не сделает.
А в семёрке это реализовано 🙂
(12) maxis33, подумали: …а-а-а! — не нам обновлять!..
чё-та не пойму, обещалово не работает
http://v8.1c.ru/o7/201304rl/index.htm
платформа 8.3.2.172 — ни областей, ни ссылок
Спасибо! Натолкнуло на мысль =)))
Буду пробовать в упр. приложении реализовать… А вот это будет очень интересно =))
O-Planet Добрый день! можно у Вас попросить обработку.
Сам автоподбор у меня работает, все хорошо, но не могу победить перехват фокуса.
Идея с дополнительным списком на форме понравилась, но застрял с ее реализацией. Как то корявенько получается.
Можно поглядеть? если не трудно, скиньте на oslokot(собака)mail.ru
(12) maxis33, чет не могу найти у себя подобных свойств.
а у тебя их нет, это 8.3
а в тонком клиенте будет работать? 😉
Столкнулся с подобной проблемой. Решил несколько по другому. Поле списка создается программно.
Показать
Пример прикрепил.
Класс!!! Жаль что у меня 8.1 Очень нужная вещь!!!
зачем изобретать велосипеды? В 8.2 все работает через процедуру
ОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Значение = ОтобратьЗначения(Текст);
(21) hibico, это нормально работает с полем ввода, но не работает с табличным полем, а ведь именно в табличном поле пользователи и набирают товар.