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