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