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