Как программно настроить список выбора в управляемых формах 1С и отключить стандартные окна поиска

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Постановка задачи и анализ проблемы

Рассмотрим типичную ситуацию: в табличной части есть две колонки. Первая — строковый комментарий, вторая — ссылка на справочник (например, статьи затрат). Нам необходимо, чтобы при вводе текста в первую колонку, во второй колонке предлагался только узкий список статей, соответствующих этому комментарию согласно данным из регистра сведений. Основная трудность заключается в том, что в интерфейсе «Такси» платформа автоматически выводит список последних выбранных значений или окно «Введите строку для поиска», перекрывая программно сформированные списки.

Метод 1: Использование события АвтоПодбор

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

Пример реализации логики:


&НаКлиенте
Процедура ТЧСтатьяАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем подходящие статьи из регистра сведений на сервере
    СписокСтатей = ПолучитьСписокСтатейПоКомментарию(Текст);
    
    // Заполняем параметр ДанныеВыбора, который платформа покажет пользователю
    ДанныеВыбора = СписокСтатей;
    
КонецПроцедуры

Важный нюанс: Чтобы пользователь видел информативный список, в ДанныеВыбора можно передавать не просто ссылки, а структуру, где в качестве представления указана комбинация данных из обеих колонок. Это сделает выбор более прозрачным, если одному комментарию соответствуют несколько похожих статей.

Метод 2: Настройка поведения через событие НачалоВыбора

Если нам нужно ограничить выбор не при наборе текста, а при нажатии на кнопку выбора (три точки) или при активизации поля, мы используем событие НачалоВыбора. Здесь критически важно установить СтандартнаяОбработка = Ложь, чтобы не открылась стандартная форма выбора справочника.

Проанализируем пример кода:


&НаКлиенте
Процедура ТЧСтатьяНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Формируем список программно
    СписокДляВыбора = Новый СписокЗначений;
    ПолучитьДанныеИзРегистра(СписокДляВыбора, Элементы.ТЧ.ТекущиеДанные.Комментарий);
    
    // Показываем список выбора непосредственно под полем ввода
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораСтатьи", ЭтотОбъект);
    ПоказатьВыборИзСписка(Оповещение, СписокДляВыбора, Элемент);
    
КонецПроцедуры

Метод 3: Глобальное переопределение через модуль менеджера

Наиболее «чистым» с точки зрения архитектуры является использование обработчика ОбработкаПолученияДанныхВыбора в модуле менеджера справочника. Этот метод позволяет централизованно управлять тем, что видит пользователь во всех полях ввода, ссылающихся на данный справочник.

В этом обработчике мы можем проанализировать параметры, переданные с формы, выполнить запрос к регистру сведений и вернуть готовый массив ссылок в параметре ДанныеВыбора. Если внутри этого метода установить СтандартнаяОбработка = Ложь, система полностью откажется от попыток стандартного поиска, и раздражающее окно «Введите строку для поиска» не появится.

Как избавиться от истории выбора и системных подсказок

Многие разработчики жалуются, что даже при программном заполнении списка платформа подмешивает туда «Историю выбора». Чтобы поле ввода вело себя максимально предсказуемо, проанализируем следующие свойства элемента формы в конфигураторе:

Комплексный подход к реализации

Для достижения наилучшего результата рекомендуется комбинировать подходы. Рассмотрим оптимальный алгоритм работы:

  1. В свойствах поля ввода в табличной части отключаем «История выбора при вводе».
  2. Реализуем событие АвтоПодбор, где устанавливаем СтандартнаяОбработка = Ложь и заполняем ДанныеВыбора результатом запроса к вашему регистру сведений.
  3. Для обработки случаев, когда пользователь вставил текст целиком, используем событие ОкончаниеВводаТекста. В нем можно программно проверить, существует ли однозначное соответствие в регистре, и если да — сразу подставить нужную ссылку, не заставляя пользователя выбирать что-либо из списков.

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

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

← На главную