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

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

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

Постановка задачи и базовое решение

Представим ситуацию: у нас есть обработка с табличной частью, и в одной из колонок (тип «Строка») необходимо выводить выпадающий список. Состав этого списка зависит от внешних условий или данных других колонок. Первое, с чем сталкиваются разработчики — это метод заполнения списка. Рассмотрим самый простой и эффективный способ загрузки значений в элемент формы.

Проанализируем программный код, который позволяет быстро обновить содержимое выпадающего списка. Основной метод, который нам понадобится — это ЗагрузитьЗначения(). Важно помнить, что этот метод принимает именно Массив, а не СписокЗначений напрямую. Если у вас уже есть СписокЗначений, из него нужно сначала выгрузить данные в массив.

Разберем пример реализации:


// Пример заполнения списка выбора в колонке табличной части
МассивДляВыбора = Новый Массив;
МассивДляВыбора.Добавить("Значение 1");
МассивДляВыбора.Добавить("Значение 2");
МассивДляВыбора.Добавить("Специфический товар");

// Обращаемся к элементу формы (колонке табличной части)
Элементы.ТоварыНаименование.СписокВыбора.ЗагрузитьЗначения(МассивДляВыбора);

В этом примере ТоварыНаименование — это имя элемента формы, представляющего колонку. Метод полностью перезаписывает текущий список новыми значениями из массива.

Режим выбора: из списка или произвольный ввод

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

За поведение поля ввода отвечают два ключевых свойства, которые мы можем настраивать как в конфигураторе, так и программно:

  1. РежимВыбораИзСписка (ChoiceModeFromList). Если установить это свойство в значение Истина, поле превращается в строгий выпадающий список. Пользователь сможет выбрать только то, что вы программно добавили в СписокВыбора. Ввод текста «руками» будет невозможен.
  2. КнопкаСпискаВыбора (DropListButton). Это свойство отвечает за отображение маленькой стрелочки в правой части поля, которая при нажатии раскрывает ваш подготовленный список.

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

Где и когда обновлять список выбора?

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

Подход 1: Событие «ПриАктивизацииСтроки»

Этот метод часто используется, когда состав списка зависит от данных в текущей строке. Как только пользователь перемещает курсор на новую строку, система перестраивает список выбора для конкретной ячейки.


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

Подход 2: Событие «НачалоВыбора» (Оптимальный)

С точки зрения производительности, лучше обновлять список непосредственно в момент нажатия пользователем на кнопку выбора. Это избавляет систему от лишних вычислений при простом перемещении по таблице. Выясним, как это реализовать:


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

Продвинутая работа: Автоподбор и Представления

Посмотрим на ситуацию шире. Если список очень большой, пользователю неудобно искать в нем значение. В этом случае на помощь приходит событие АвтоПодбор. Оно позволяет фильтровать значения списка по мере того, как пользователь набирает первые буквы слова.

Также важно помнить о свойстве Представление. Элемент списка выбора может содержать не просто строку, а пару «Значение — Представление». Это крайне полезно, если в поле мы храним, например, СправочникСсылка, а показывать пользователю хотим краткое наименование или артикул.

Рассмотрим пример добавления элементов с представлением вручную:


Элементы.ТоварыРабота.СписокВыбора.Очистить();
Для Каждого СтрокаМассива Из МоиДанные Цикл
    Элементы.ТоварыРабота.СписокВыбора.Добавить(СтрокаМассива.Ссылка, СтрокаМассива.НаименованиеДляПользователя);
КонецЦикла;

Резюме и рекомендации

Подведем итоги нашего анализа. Для реализации качественного выбора в табличной части необходимо:

Применяя эти методы, мы создаем интуитивно понятный и быстрый интерфейс, который помогает пользователю минимизировать количество ошибок при заполнении документов и обработок в системе 1С:Предприятие.

← На главную