Как выгрузить данные из динамического списка 1С с учетом видимости колонок?

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

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

Понимание проблемы: Клиент и Сервер

Первое, что необходимо уяснить — архитектурное разделение системы. Динамический список формируется на сервере с помощью системы компоновки данных (СКД). В момент исполнения запроса сервер ничего не «знает» о визуальных настройках, которые пользователь применил на клиентской форме (скрыл колонку через «Настроить список» или через контекстное меню). Свойство Видимость элемента формы — это чисто клиентское свойство, тогда как результат работы ПроцессорКомпоновкиДанных — это набор данных, полученный на основе исполняемой схемы.

Метод 1: Пост-обработка полученной таблицы значений

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

  1. Выполняем получение данных из динамического списка стандартным способом.
  2. Анализируем коллекцию колонок формы, чтобы понять, какие из них сейчас скрыты для пользователя.
  3. Удаляем из полученной ТаблицаЗначений те колонки, свойство Видимость которых на форме равно Ложь.

Пример программного подхода для анализа структуры:


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

Важное замечание: Этот метод удобен тем, что он не требует изменения запроса и универсален для большинства списков.

Метод 2: Динамическое формирование текста запроса

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

Рассмотрим структуру реализации:


ТекстЗапроса = "ВЫБРАТЬ ";
СписокПолей = Новый Массив;
Если Элементы.Колонка1.Видимость Тогда
    СписокПолей.Добавить("Т.Поле1");
КонецЕсли;
// Добавляем остальные поля...
ТекстЗапроса = ТекстЗапроса + СтрСоединить(СписокПолей, ", ") + " ИЗ Справочник.Номенклатура КАК Т";

Этот подход гарантирует высокую производительность, так как сервер СУБД выберет только необходимые данные.

Почему не помогает свойство «Использовать всегда»?

Часто разработчики пытаются использовать флаг Использовать всегда в свойствах поля динамического списка, полагая, что он влияет на видимость. На самом деле, этот флаг работает ровно наоборот: он заставляет СКД включать поле в выборку даже в том случае, если оно нигде не используется на форме. Это полезно, если поле нужно вам для программной обработки строки, но оно не должно отображаться пользователю. Использование этого флага никак не поможет вам скрыть ненужные колонки, а наоборот — увеличит объем передаваемых данных.

Итоговые рекомендации

Чтобы эффективно управлять выгрузкой колонок:

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

← На главную