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

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

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

В этой статье мы подробно разберем, как обойти это ограничение платформы. Мы изучим лучшие практики реализации этой задачи отдельно для обычных форм (толстый клиент) и для управляемых форм (тонкий и веб-клиент), проанализируем производительность каждого метода и рассмотрим оптимизацию визуального интерфейса.

Особенности архитектуры элементов управления табличной части

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

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

---

Решение для обычных форм (Толстый клиент)

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

Шаг 1. Настройка свойств колонки в Конфигураторе

Для того чтобы у пользователя появилась возможность выбирать значения из предопределенного списка, необходимо настроить свойства элемента управления (поля ввода) в нужной колонке табличного поля:

  1. Откройте свойства колонки табличного поля.
  2. Установите свойство КнопкаСпискаВыбора в значение Истина. Это добавит в ячейку кнопку со стрелкой «вниз».
  3. Если необходимо полностью запретить ручной ввод произвольного текста и принудить пользователя выбирать только из предложенных вариантов, установите свойство РежимВыбораИзСписка в значение Истина.

Шаг 2. Написание обработчика события

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


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

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

---

Решение для управляемых форм (Тонкий / Веб-клиент)

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

Для управляемых форм платформа предлагает элегантное и быстрое решение — использование параметра ДанныеВыбора в событии НачалоВыбора поля формы.

Реализация через событие НачалоВыбора

Разберем по шагам, как перехватить построение списка выбора на клиенте и передать туда отфильтрованный массив данных:


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

&НаСервереБезКонтекста
Функция ПолучитьСписокВыбораНаСервере(Организация)
    Список = Новый СписокЗначений;
    
    // Выполняем легкий запрос к базе данных для получения доступных документов
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Ссылка КАК ДокументСсылка,
        |	Представление КАК Представление
        |ИЗ
        |	Документ.ДоговорОбОказанииУслуг
        |ГДЕ
        |	Организация = &Организация";
    
    Запрос.УстановитьПараметр("Организация", Организация);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Список.Добавить(Выборка.ДокументСсылка, Выборка.Представление);
    КонецЦикла;
    
    Возврат Список;
КонецФункции

При таком подходе платформа сама формирует компактное выпадающее меню непосредственно под редактируемой ячейкой, исключая полную перерисовку формы.

Альтернативный вариант: Связи параметров выбора (без кода)

Если задача состоит в том, чтобы отфильтровать список выбора в одной колонке по значению в другой колонке той же строки (например, выбирать только договоры конкретного контрагента), можно обойтись совсем без написания программного кода. Для этого используется механизм Связи параметров выбора (ChoiceParameterLinks):

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

Платформа автоматически применит данный отбор при интерактивном нажатии на кнопку выбора в ячейке.

---

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

Если формирование уникального списка выбора требует сложных расчетных алгоритмов или тяжелых запросов к базе данных, вызов этих процедур при каждом нажатии пользователя на кнопку выбора приведет к падению производительности («зависанию» интерфейса на доли секунды). Чтобы избежать этого, применим кэширование.

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

---

Улучшение юзабилити (UX) — Визуальные индикаторы выбора

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

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

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

← На главную