Как в СКД убрать лишние поля виртуальных таблиц из отборов?

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

При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с поведением, когда платформа автоматически добавляет в список доступных настроек отчета абсолютно все измерения и реквизиты виртуальной таблицы регистра (например, виртуальной таблицы Обороты или ОстаткиИОбороты). Даже если в секции ВЫБРАТЬ вашего запроса указаны всего два-три поля, конечный пользователь все равно видит в списке доступных отборов такие поля, как "Контрагент", "Склад", "Организация" и многие другие.

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

Выясняем причину: почему СКД добавляет лишние поля?

Когда в схеме компоновки данных для набора данных типа "Запрос" установлен флаг Автозаполнение, СКД начинает самостоятельно анализировать текст запроса. Обнаружив обращение к виртуальной таблице регистра (например, РегистрНакопления.Продажи.Обороты), СКД пытается оптимизировать будущую работу отчета на уровне СУБД. Платформа автоматически делает доступными для отбора все измерения этого регистра.

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


Способ №1. Отключение автозаполнения и ручная настройка на вкладке "Компоновка данных"

Этот способ является наиболее очевидным и был успешно применен автором темы. Разберем его по шагам:

  1. Откройте схему компоновки данных и перейдите на вкладку Наборы данных.
  2. Снимите флаг Автозаполнение рядом с текстом вашего запроса.
  3. Откройте конструктор запроса и перейдите на вкладку Компоновка данных. На этой вкладке находятся настройки, которые заменяют стандартное автозаполнение.
  4. Нам необходимо вручную указать, какие именно поля будут доступны СКД для выбора, отборов, группировок и порядка. Перетащите нужные поля из списка доступных полей в соответствующие таблицы (например, в "Доступные поля").
  5. Сохраните изменения. Теперь в настройках отчета будут фигурировать только те поля, которые вы явно разрешили использовать.

Важное замечание: При полном отключении автозаполнения вам придется вручную настраивать не только поля выбора, но и параметры (например, НачалоПериода и КонецПериода), а также параметры самих виртуальных таблиц. Если параметров много, это может потребовать дополнительного времени.


Способ №2. Установка ограничений на вкладке "Наборы данных"

Часто разработчики пытаются решить проблему, устанавливая галочки ограничений непосредственно в таблице полей набора данных СКД. Однако они замечают, что для неявно добавленных полей (таких как "Контрагент", которого нет в тексте запроса ВЫБРАТЬ) эти строки просто отсутствуют в списке, либо флаги недоступны для редактирования.

Чтобы обойти это ограничение, выполним следующую последовательность действий:

  1. Оставьте флаг Автозаполнение включенным.
  2. На вкладке Наборы данных добавьте новую строку в список полей вручную, нажав кнопку "Добавить новое поле".
  3. В колонке Путь к данным и в колонке Поле укажите точное имя скрываемого измерения (например, Контрагент).
  4. После ручного добавления поля в список для него станут доступны флаги ограничений.
  5. Установите флаг в колонке У (Ограничение условия). Это полностью исключит поле из доступных отборов. Дополнительно можно установить флаги П (Ограничение поля выбора), Г (Ограничение группировки) и С (Ограничение порядка), чтобы поле полностью исчезло из интерфейса настроек.

Способ №3. Использование расширения языка запросов СКД (Фигурные скобки)

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

Рассмотрим пример такого запроса:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК КоличествоПродаж,
    ПродажиОбороты.СтоимостьОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(, , , {Номенклатура.*}) КАК ПродажиОбороты

Синтаксис {Номенклатура.*} внутри параметров виртуальной таблицы указывает компоновщику данных, что для оптимизации запроса разрешено использовать исключительно поле Номенклатура. Все остальные измерения (включая "Контрагент") будут проигнорированы автозаполнением и не попадут в доступные отборы пользователей.


Способ №4. Обход через временные таблицы

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

Проанализируем пример запроса:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК КоличествоПродаж,
    ПродажиОбороты.СтоимостьОборот КАК Стоимость
ПОМЕСТИТЬ ВТ_ДанныеПродаж
ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ДанныеПродаж.Номенклатура,
    ВТ_ДанныеПродаж.КоличествоПродаж,
    ВТ_ДанныеПродаж.Стоимость
ИЗ
    ВТ_ДанныеПродаж КАК ВТ_ДанныеПродаж

Поскольку источником данных для СКД теперь выступает "плоская" временная таблица ВТ_ДанныеПродаж, автозаполнение предложит пользователю для отбора только те поля, которые мы явно выбрали в первом пакете запроса. Поле "Контрагент" гарантированно не появится в настройках.


Способ №5. Программное ограничение доступности полей

В некоторых случаях состав доступных отборов должен зависеть от прав доступа или роли текущего пользователя. Тогда нам на помощь приходит программная настройка схемы компоновки данных. Мы можем сделать это непосредственно перед выводом отчета в модуле объекта в предопределенном обработчике ПриКомпоновкеРезультата.

Посмотрим на пример программного кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем набор данных, в котором находится поле
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Найти("НаборДанных1");
    
    Если НаборДанных <> Неопределено Тогда
        // Находим поле "Контрагент"
        ПолеКонтрагент = НаборДанных.Поля.Найти("Контрагент");
        
        Если ПолеКонтрагент <> Неопределено Тогда
            // Устанавливаем ограничения
            ПолеКонтрагент.ОграничениеУсловия = Истина;     // Запрет отборов
            ПолеКонтрагент.ОграничениеГруппировки = Истина; // Запрет группировок
            ПолеКонтрагент.ОграничениеПорядка = Истина;     // Запрет сортировки
        КонецЕсли;
    КонецЕсли;

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

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

← На главную