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

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

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

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

Причина ограничения платформы

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

Для решения этой задачи проанализируем основные технические подходы.

Решение 1. Использование специальной формы выбора

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

Схема взаимодействия состоит из следующих шагов:

  1. В элементе формы (покрывающем список значений) перехватываем событие НачалоВыбора и отменяем стандартную обработку с помощью СтандартнаяОбработка = Ложь.
  2. Передаем таблицу значений на сервер, сохраняем её во временное хранилище через метод ПоместитьВоВременноеХранилище и получаем адрес хранилища.
  3. Создаем описание оповещения для асинхронного получения результата выбора.
  4. Открываем форму подбора методом ОткрытьФорму, передавая адрес временного хранилища в параметрах формы.
  5. В форме подбора считываем данные из временного хранилища, выводим их пользователю и при выборе возвращаем выбранную строку или массив строк.
  6. В процедуре обработки оповещения добавляем полученные элементы в наш исходный СписокЗначений.

Рассмотрим пример кода для клиентской части исходной формы:


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

КонецПроцедуры

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

КонецПроцедуры

Решение 2. Быстрый подбор через метод ПоказатьВыборИзСписка

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

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

  1. В обработчике события НачалоВыбора отключаем стандартное поведение: СтандартнаяОбработка = Ложь.
  2. Формируем временный список значений на основе данных таблицы. В качестве свойства Значение записываем идентификатор или значение ключевой колонки, а в свойство Представление — наименование для пользователя.
  3. Вызываем асинхронный метод ПоказатьВыборИзСписка().
  4. В обработчике оповещения записываем выбранный элемент в целевой СписокЗначений.

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

КонецПроцедуры

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

КонецПроцедуры

Альтернативные варианты проектирования интерфейса

Иногда вместо использования объекта СписокЗначений удобнее пересмотреть организацию формы:

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

← На главную