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

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

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

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

Типичные ошибки при настройке выбора из списка

Проанализируем распространенные заблуждения, приводящие к неработоспособности механизма:

  1. Использование типа «Список значений» для реквизита колонки. Если реквизиту табличной части или таблицы формы назначен тип СписокЗначений, платформа пытается отобразить в ячейке всю коллекцию целиком (через запятую). Пользователь не может просто кликнуть и выбрать один элемент. Реквизит колонки всегда должен иметь тот скалярный тип, значение которого мы планируем сохранять (например, Строка, Число или ссылка на справочник).
  2. Попытка использовать событие «НачалоВыбораИзСписка». В платформе 1С:Предприятие 8.3 на управляемых формах свойство КнопкаСпискаВыбора устарело и оставлено только для совместимости, а обработчик события НачалоВыбораИзСписка для поля ввода больше не вызывается платформой.
  3. Динамическая перезагрузка свойства «СписокВыбора» элемента формы. В управляемых формах элемент управления колонки является единым для всех строк таблицы. Если включить свойство РежимВыбораИзСписка = Истина и при активизации строки перезаполнять Элемент.СписокВыбора, то в соседних строках таблицы ранее выбранные значения могут перестать отображаться корректно, если их нет в текущем списке.

Правильная архитектура: использование события «НачалоВыбора» и выпадающего меню

Для реализации стабильного и корректного выбора вариантов в строках таблицы управляемой формы выполним настройку по шагам.

Шаг 1. Настройка реквизитов и свойств поля ввода

  1. Убедимся, что реквизит колонки имеет тип выбираемого значения (например, Строка).
  2. В свойствах элемента формы (поля ввода) снимем флаг Режим выбора из списка (установим Ложь).
  3. Установим флаг Кнопка выбора в значение Да (Истина).
  4. Создадим на клиенте обработчик события НачалоВыбора.

Шаг 2. Получение текущих данных строки

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


ТекущаяСтрока = Элементы.ТаблицаПодразделения.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
    Возврат;
КонецЕсли;

Шаг 3. Формирование списка и показ меню выбора

Отключим стандартную обработку выбора (СтандартнаяОбработка = Ложь;), сформируем локальный список значений под условия текущей строки и вызовем асинхронный метод платформы ПоказатьВыборИзСписка().

Посмотрим на полный пример реализации на клиенте:


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

&НаКлиенте
Процедура ПослеВыбораКодаПодразделения(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        ДанныеСтроки = Элементы.ТаблицаПодразделения.ТекущиеДанные;
        Если ДанныеСтроки <> Неопределено Тогда
            ДанныеСтроки.КодПодразделения = ВыбранныйЭлемент.Значение;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Оптимизация производительности: кэширование на клиенте

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

  1. При первичном заполнении таблицы на сервере сформируем структуру или соответствие (Соответствие / ФиксированноеСоответствие), где ключом выступает идентификатор строки или связующий реквизит, а значением — массив или список допустимых кодов.
  2. Поместим эту коллекцию во временный реквизит формы.
  3. В процедуре НачалоВыбора на клиенте мгновенно извлечем нужный список из кэша формы без лишних клиент-серверных вызовов.

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

← На главную