1с автоподбор нет в списке

Обновлено: 07.07.2024

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

среда, 15 января 2014 г.

Переопределение процедуры ввода по строке в управляемом приложении

Для того, чтобы определить свой набор данных, которые формируются при вводе по строке нужно использовать событие АвтоПодбор() элемента формы.
Справка из синтаксис-помощника:
АвтоПодбор(<Текст>, <ДанныеВыбора>, <Ожидание>, <СтандартнаяОбработка>)
  • Значение (Value) - собственно значение;
  • ПометкаУдаления (DeletionMark) - пометка удаления;
  • Предупреждение (Warning) - текст предупреждения, который будет выбран при выборе элемента и списка значений.
Тип: Число.
Интервал в секундах после ввода текста, через который произошло событие. Если 0, то это означает, что событие было вызвано не по поводу ввода текста, а для формирования списка быстрого выбора.
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Параметр позволяет отменить стандартное заполнение системой ДанныеВыбора. При этом все действия (отображение списка, предупреждения) выполняются системой на основе возвращенного значения параметра <ДанныеВыбора> независимо от значения параметра <СтандартнаяОбработка>.
Значение по умолчанию: Истина
Возникает во время начала ожидания ввода текста (в процессе набора текста сделана пауза). Также возникает при нажатии клавиши "Стрелка вниз" после ввода текста (или части текста).
При стандартной отработке события происходит поиск в порядке полей, определенном при конфигурировании в свойстве объекта метаданных "Ввод по строке".
Если найдено найдено одно или более значений, то будет показан список с найденными значениями. Если значений найдено больше 50, то список показан не будет.

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

Переопределять мы будем список значений ДанныеВыбора, который заменим на свой - сформированный запросом:

&НаКлиенте
Процедура РайонАвтоПодбор ( Элемент , Текст , ДанныеВыбора , Ожидание , СтандартнаяОбработка )

Если ЗначениеЗаполнено ( Текст ) И НЕ ТипЗнч ( Район ) = Тип ( "Строка" ) Тогда
СтандартнаяОбработка = Ложь;

ДанныеВыбора = ПолучитьДанныеВыбораГородов ( Текст , Истина, ПредопределенноеЗначение ( "Справочник.Города.ПустаяСсылка" ));

Функция ПолучитьДанныеВыбораГородов ( Текст , ЭтоРайон , Родитель )

ДанныеВыбора = Новый СписокЗначений ;
Построитель = Новый ПостроительЗапроса ;
Построитель . Текст = "ВЫБРАТЬ
| Города.Ссылка,
| Города.Наименование
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.Наименование ПОДОБНО &Наименование + ""%""
| И НЕ Города.ПометкаУдаления
| | Города.Родитель.*,
| Города.Область.*,
| Города.ВидНаселенногоПункта.*>" ;
Построитель . Параметры . Вставить ( "Наименование" , Текст );
Если ЗначениеЗаполнено ( Родитель ) И НЕ ТипЗнч ( Родитель ) = Тип ( "Строка" ) Тогда
Отбор = Построитель . Отбор . Добавить ( "Родитель" );
Отбор . Использование = Истина;
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Родитель ;
КонецЕсли;

Если ЗначениеЗаполнено ( Область ) И НЕ ТипЗнч ( Область ) = Тип ( "Строка" )Тогда
Отбор = Построитель . Отбор . Добавить ( "Область" );
Отбор . Использование = Истина;
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Область ;
КонецЕсли;

Отбор = Построитель . Отбор . Добавить ( "ВидНаселенногоПункта" );
Отбор . Использование = Истина;

Если ЭтоРайон Тогда
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Справочники . ВидыНаселенныхПунктов . Район ;
Иначе
Отбор . ВидСравнения = ВидСравнения . НеРавно ;
Отбор . Значение = Справочники . ВидыНаселенныхПунктов . Район ;
КонецЕсли;

Построитель . Выполнить ();
Таблица = Построитель . Результат . Выгрузить ();

Для Каждого Строка Из Таблица Цикл
ДанныеВыбора . Добавить ( Строка . Ссылка , Строка . Наименование );
КонецЦикла;

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

В 1С 8.3 по умолчанию настройки справочника номенклатуры такие:


При такой настройке, механизм поиска в справочнике номенклатуры работает так:


- в документе вводим первые символы Пета и видим такой результат подсказки:


Но, такой поиск не удобен и менеджеры захотели подбирать номенклатуру по артикулу, например 1320

Для этого изменим настройки указав поиск по Любой части и включив полнотекстовый поиск:


Сохраняем конфигурацию и в режиме предприятие обновляем Полнотекстовый поиск: Меню - Все функции - Стандартные - Управление полнотекстовый поиском


После этого пробуем в документе выполнить поиск по 1320 и видим:


Все Менеджеры пищат как дети на новогодней елке!

Пока писал эту статью нашел в интернете другое решение для платформы 8.2:

СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)

ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)

В модуле менеджера справочника "Номенклатура" пишем:

В обработчике - ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбраблтка) для нас важны все три параметра. В первый "ДанныеВыбора" мы загружаем наш список номенклатуры, полученный по нашему алгоритму. Из параметра "Параметры" мы получим значение введенное пользователем, а третьему параметру "СтандартнаяОбработка" мы должны поставить значение "Ложь"(отключаем стандартный алгоритм системы).

В результате одной небольшой процедурой мы полностью решили поставленную задачу.


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

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

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

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

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

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

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

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

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

Читайте также: