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

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

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

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

Причина 1: Фильтрация в палитре свойств конфигуратора

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

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

Эволюция свойств: от платформы 8.2 к современным версиям 8.3

Проанализируем изменения в платформе 1С:Предприятие. В версиях 8.2 использовалось свойство КнопкаСпискаВыбора и событие НачалоВыбораИзСписка. Однако в современных версиях платформы 8.3 (при отключенном режиме совместимости) этот механизм признан устаревшим:

  1. Свойство КнопкаСпискаВыбора скрыто из палитры и оставлено исключительно для обратной совместимости при обновлении старых конфигураций.
  2. Событие НачалоВыбораИзСписка больше не вызывается в управляемом интерфейсе.
  3. Для включения выпадающего меню теперь используется свойство поля ввода КнопкаВыпадающегоСписка (устанавливается в значение Да).
  4. Если необходимо запретить переход в стандартную форму выбора справочника (кнопку с тремя точками), свойство КнопкаВыбора принудительно переводится из положения Авто в значение Нет.
  5. Чтобы пользователь мог выбирать только значения из подготовленного списка без ручного набора произвольного текста, свойство РежимВыбораИзСписка устанавливается в Истина, а свойство РедактированиеТекста — в Ложь.

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

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

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

Способ 1: Использование метода ПоказатьВыборИзСписка (рекомендуемый)

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

Разберем по шагам реализацию данного механизма:

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

Посмотрим на пример программного кода:


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

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

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


&НаСервереБезКонтекста
Функция ПолучитьСписокЕдиницДляНоменклатуры(НоменклатураСсылка)
    
    Список = Новый СписокЗначений;
    
    Если ЗначениеЗаполнено(НоменклатураСсылка) Тогда
        // Заполняем список элементами нужного ссылочного типа
        // Пример добавления ссылки:
        // Список.Добавить(СсылкаНаЕдиницу, ПредставлениеЕдиницы);
    КонецЕсли;
    
    Возврат Список;
    
КонецФункции

Способ 2: Динамическое обновление списка в ПриАктивизацииСтроки

Второй способ заключается в обновлении свойства СписокВыбора элемента формы при каждой смене активной строки таблицы. Для этого задействуется обработчик события таблицы ПриАктивизацииСтроки.

Рассмотрим особенности этого метода:

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

Способ 3: Настройка связей параметров выбора (без программного кода)

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

Проанализируем встроенный декларативный механизм:

  1. Открываем свойства реквизита табличной части в дереве метаданных или реквизитах формы.
  2. Находим параметр Связи параметров выбора.
  3. Указываем отбор: поле Отбор.Владелец связываем с реквизитом строки СоставСчета.Номенклатура.

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

← На главную