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

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

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

Настройка свойств колонки табличного поля

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

Выполнить настройку можно в палитре свойств или программно при открытии формы:

  1. Включим свойство КнопкаСпискаВыбора — установим значение Истина, чтобы в правой части ячейки появилась кнопка со стрелкой вниз.
  2. Отключим свойство КнопкаВыбора — установим значение Ложь, чтобы скрыть кнопку вызова стандартной формы справочника.
  3. Если требуется запретить ручной ввод произвольного текста и вызов формы выбора горячими клавишами (например, F4), включим свойство РежимВыбораИзСписка со значением Истина.

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

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

Вариант 1. Группа фиксирована для всей таблицы (статический список)

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


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

Вариант 2. Группа зависит от данных текущей строки (динамический список)

Если выборка должна подстраиваться под текущие реквизиты строки, используем событие ПриНачалеРедактированияСтроки табличного поля либо событие НачалоВыбораИзСписка элемента управления ячейки:


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

Особенности составления запроса к справочнику

Рассмотрим важные детали при выборке элементов:

  1. Иерархия групп: используем конструкцию В ИЕРАРХИИ (&Группа), а не прямое равенство Родитель = &Группа. Прямое равенство отберет только элементы первого уровня вложенности, пропуская подпапки.
  2. Исключение папок и удаленных: обязательно проверяем условия НЕ Номенклатура.ЭтоГруппа и НЕ Номенклатура.ПометкаУдаления, чтобы список не содержал промежуточные папки и неактуальные позиции.
  3. Тип данных: в метод СписокВыбора.Добавить() или ЗагрузитьЗначения() необходимо передавать именно объектную ссылку (СправочникСсылка.Номенклатура), а не строковое представление, иначе значение в строке документа не будет сохранено в базу данных.

Подводные камни и ограничения выпадающего списка

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

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