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