Как в отчете СКД привязать параметр или отбор к функциональной опции?

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

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

Проблема прямой привязки параметров к функциональным опциям

Для начала проанализируем техническую базу платформы 1С:Предприятие 8. Функциональные опции (ФО) отлично работают с объектами метаданных: они могут скрывать справочники, документы, реквизиты форм и даже измерения регистров. Однако, если мы откроем конструктор схемы компоновки данных и перейдем на вкладку Параметры, то увидим, что у параметров (тех, что в запросе пишутся через префикс &) отсутствует свойство Функциональная опция.

Это означает, что платформа не предоставляет штатного способа «в один клик» связать параметр запроса с функциональной опцией в визуальном редакторе. Параметры СКД — это переменные самого запроса или процессора компоновки, они не являются объектами метаданных в чистом виде, поэтому механизм ФО на них не распространяется автоматически. Разберем два основных способа решения этой задачи.

Способ 1: Использование стандартных отборов вместо параметров

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

Рассмотрим алгоритм настройки:

  1. В схеме СКД на вкладке Набор данных убедимся, что в запросе выбрано поле Организация (или другое поле, связанное с ФО).
  2. Если используется запрос к виртуальной таблице (например, Продажи.Обороты), не нужно жестко прописывать условие ГДЕ Организация = &Организация в параметрах таблицы.
  3. На вкладке Настройки, в разделе Отбор, добавим поле Организация и вынесем его в Пользовательские настройки.
  4. В дереве метаданных конфигурации найдем нашу функциональную опцию (например, ИспользоватьНесколькоОрганизаций) и убедимся, что в ее состав включено измерение Организация соответствующего регистра или сам справочник Организации.

Почему это работает? Когда поле набора данных СКД напрямую связано с объектом метаданных, включенным в ФО, система компоновки данных автоматически скрывает это поле из списка доступных полей, доступных отборов и группировок, если опция выключена. Это происходит благодаря механизму Автозаполнение. Если опция Учет по нескольким организациям ложна, СКД просто «вырежет» это поле из интерфейса отчета, и пользователю не придется ничего настраивать вручную.

Способ 2: Программное управление видимостью в модуле отчета

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

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

Пример кода для управления параметром:


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

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

В данном примере мы используем функцию ПолучитьФункциональнуюОпцию, чтобы определить состояние настройки. Если опция выключена, мы перебираем ПользовательскиеНастройки и устанавливаем свойство Редактирование в значение Недоступно. Это приведет к тому, что параметр исчезнет с формы отчета.

Нюансы работы с регистрами бухгалтерии

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

Чтобы автоматическое скрытие по ФО работало, СКД должна четко понимать связь поля набора данных с метаданными регистра. Если вы вручную задали путь к данным или используете объединение нескольких таблиц, связь может быть потеряна. Проверьте следующие настройки:

  1. Убедитесь, что в поле Роль для данного измерения на вкладке Наборы данных правильно указано соответствие полю метаданных.
  2. Проверьте, включен ли флаг Автозаполнение в конструкторе запроса СКД. Без него автоматическая связь с функциональными опциями полей может не работать.
  3. Если поле является частью Регистра Бухгалтерии, проверьте, включено ли в функциональную опцию именно то измерение, которое используется в качестве источника для поля СКД.

Использование "Параметров функциональных опций"

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

Пример получения значения параметрической ФО:


ПараметрыФО = Новый Структура("Склад", ТекущийСклад);
ЗначениеОпции = ПолучитьФункциональнуюОпцию("ИспользоватьСерии", ПараметрыФО);

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

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

Подведем итоги нашего анализа. Для реализации связи параметров и ФО в СКД рекомендуется придерживаться следующей стратегии:

  1. Предпочтительный вариант: Используйте стандартные Отборы. Это избавит вас от написания лишнего кода и обеспечит корректную работу платформенных механизмов. Просто убедитесь, что соответствующие поля метаданных добавлены в состав нужной ФункциональнойОпции.
  2. Запасной вариант (Программный): Если без параметров & не обойтись, используйте событие ПриКомпоновкеРезультата в модуле отчета. Это даст вам полный контроль над видимостью элементов, но потребует поддержки кода при обновлении конфигурации.
  3. Контроль метаданных: Всегда проверяйте, что именно включено в состав ФО. Если вы включили справочник, но не включили измерение регистра, использующее этот справочник, отбор по регистру может продолжать отображаться.

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

← На главную