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