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