Как правильно реализовать динамический список выбора в табличной части управляемой формы?

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

При разработке на управляемых формах 1С часто возникает необходимость ограничить или изменить состав списка выбора для ячейки табличной части в зависимости от значений, выбранных в других реквизитах строки. В современных версиях платформы 1С 8.3 подход к этой задаче изменился по сравнению с «обычными» формами, и многие разработчики сталкиваются с тем, что привычный обработчик НачалоВыбораИзСписка перестает работать так, как ожидается. Давайте разберемся, как реализовать этот функционал правильно.

Почему не работает НачалоВыбораИзСписка?

В управляемых формах разработчики 1С отказались от использования события НачалоВыбораИзСписка как основного инструмента. В современных конфигурациях управление выпадающим списком происходит через свойство элемента формы КнопкаВыпадающегоСписка. Когда это свойство установлено в значение Истина, система ожидает иного взаимодействия. Вместо того чтобы перехватывать событие «начала» выбора, нам необходимо программно наполнять список значений и вызывать его отображение в нужный момент времени.

Решение 1: Формирование списка в событии ПриИзменении

Если содержимое списка должно меняться в зависимости от другого реквизита (например, мы выбираем «Вид товара», и от него зависит доступный список «Товаров»), логично производить обновление состава выбора в момент изменения этого «ведущего» реквизита.

Рассмотрим пошаговый алгоритм:

  1. Перейдите в модуль управляемой формы.
  2. Найдите или создайте процедуру ПриИзменении для реквизита, влияющего на выбор.
  3. Внутри этой процедуры обращайтесь к элементу табличной части через коллекцию Элементы.

Пример программного формирования списка:


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

Решение 2: Использование события НачалоВыбора

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

Важно помнить, что в этом случае нужно установить СтандартнаяОбработка = Ложь, чтобы отключить стандартное открытие формы выбора (если оно не требуется) и управлять процессом самостоятельно:


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

Важные рекомендации для эффективной работы

При реализации динамических списков учитывайте следующие особенности платформы:

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

← На главную