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