В разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача, когда стандартного функционала связанных параметров выбора недостаточно. Например, когда логика связи между двумя полями (строкой-комментарием и ссылкой на справочник) заложена не в структуре метаданных, а в данных регистра сведений. В таких случаях программист сталкивается с проблемой: система настойчиво предлагает пользователю историю выбора или стандартное окно поиска, которое мешает работе. Проанализируем, как полностью взять управление полем ввода под свой контроль.
Рассмотрим типичную ситуацию: в табличной части есть две колонки. Первая — строковый комментарий, вторая — ссылка на справочник (например, статьи затрат). Нам необходимо, чтобы при вводе текста в первую колонку, во второй колонке предлагался только узкий список статей, соответствующих этому комментарию согласно данным из регистра сведений. Основная трудность заключается в том, что в интерфейсе «Такси» платформа автоматически выводит список последних выбранных значений или окно «Введите строку для поиска», перекрывая программно сформированные списки.
Этот метод позволяет динамически предлагать пользователю варианты прямо в процессе набора текста. Разберем по шагам, как это реализовать. В обработчике события АвтоПодбор нам необходимо подавить стандартную обработку и заполнить список выбора своими данными.
Пример реализации логики:
&НаКлиенте
Процедура ТЧСтатьяАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем подходящие статьи из регистра сведений на сервере
СписокСтатей = ПолучитьСписокСтатейПоКомментарию(Текст);
// Заполняем параметр ДанныеВыбора, который платформа покажет пользователю
ДанныеВыбора = СписокСтатей;
КонецПроцедуры
Важный нюанс: Чтобы пользователь видел информативный список, в ДанныеВыбора можно передавать не просто ссылки, а структуру, где в качестве представления указана комбинация данных из обеих колонок. Это сделает выбор более прозрачным, если одному комментарию соответствуют несколько похожих статей.
Если нам нужно ограничить выбор не при наборе текста, а при нажатии на кнопку выбора (три точки) или при активизации поля, мы используем событие НачалоВыбора. Здесь критически важно установить СтандартнаяОбработка = Ложь, чтобы не открылась стандартная форма выбора справочника.
Проанализируем пример кода:
&НаКлиенте
Процедура ТЧСтатьяНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем список программно
СписокДляВыбора = Новый СписокЗначений;
ПолучитьДанныеИзРегистра(СписокДляВыбора, Элементы.ТЧ.ТекущиеДанные.Комментарий);
// Показываем список выбора непосредственно под полем ввода
Оповещение = Новый ОписаниеОповещения("ПослеВыбораСтатьи", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, СписокДляВыбора, Элемент);
КонецПроцедуры
Наиболее «чистым» с точки зрения архитектуры является использование обработчика ОбработкаПолученияДанныхВыбора в модуле менеджера справочника. Этот метод позволяет централизованно управлять тем, что видит пользователь во всех полях ввода, ссылающихся на данный справочник.
В этом обработчике мы можем проанализировать параметры, переданные с формы, выполнить запрос к регистру сведений и вернуть готовый массив ссылок в параметре ДанныеВыбора. Если внутри этого метода установить СтандартнаяОбработка = Ложь, система полностью откажется от попыток стандартного поиска, и раздражающее окно «Введите строку для поиска» не появится.
Многие разработчики жалуются, что даже при программном заполнении списка платформа подмешивает туда «Историю выбора». Чтобы поле ввода вело себя максимально предсказуемо, проанализируем следующие свойства элемента формы в конфигураторе:
Не использовать. Это очистит выпадающее меню от старых, нерелевантных данных.СписокВыбора.Для достижения наилучшего результата рекомендуется комбинировать подходы. Рассмотрим оптимальный алгоритм работы:
АвтоПодбор, где устанавливаем СтандартнаяОбработка = Ложь и заполняем ДанныеВыбора результатом запроса к вашему регистру сведений.ОкончаниеВводаТекста. В нем можно программно проверить, существует ли однозначное соответствие в регистре, и если да — сразу подставить нужную ссылку, не заставляя пользователя выбирать что-либо из списков.Проанализируем ситуацию с производительностью. Поскольку обращения к регистру сведений требуют серверного вызова, старайтесь кэшировать данные или использовать ПараметрыПолученияДанных, чтобы не выполнять тяжелые запросы на каждый введенный символ, если это не требуется бизнес-логикой.
Используя данные методы, мы создаем интерфейс, который не «спорит» с пользователем и не предлагает лишних действий, обеспечивая быструю и точную работу с данными справочников, связанными через сложные механизмы регистров.