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

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

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

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

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

  1. Выполнение запросов в контексте клиента: Попытка создать и выполнить объект Запрос в клиентских процедурах (например, в &НаКлиенте Процедура ПриОткрытии) приводит к синтаксической ошибке. В платформе 1С:Предприятие 8 на управляемых формах все обращения к базе данных через язык запросов строго ограничены серверным контекстом (&НаСервере или &НаСервереБезКонтекста).
  2. Обращение к списку выбора через объект данных: Коллекция СписокВыбора принадлежит визуальному элементу управления формы (полю ввода), а не реквизиту объекта или строке табличной части. Конструкция вида Объект.Номенклатура["ИмяРеквизита"].СписокВыбора ошибочна. Корректное обращение выполняется через коллекцию Элементы формы.
  3. Использование синхронных методов выбора: Вызов метода ВыбратьИзСписка в конфигурациях, работающих в режиме без использования модальных окон, вызывает исключение платформы. Для вызова диалогов интерактивного выбора на клиенте применяются асинхронные методы (например, ПоказатьВыборИзСписка).

Вариант 1. Настройка штатных свойств элементов формы (без программирования)

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

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

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

Вариант 2. Программное заполнение СпискаВыбора колонки формы

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

Рассмотрим пример кода в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЗаполнитьСписокВыбораГрупп();
    
КонецПроцедуры

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

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

Вариант 3. Динамический асинхронный выбор из списка по событию

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

Посмотрим на пример реализации с асинхронным оповещением:


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

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

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

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

← На главную