Как сделать доступным отбор по полю «Организация» в СКД, если оно скрыто функциональной опцией?

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда определенные поля (например, Организация, Подразделение или Характеристика) внезапно исчезают из списка доступных полей компоновщика настроек. Чаще всего это происходит в типовых конфигурациях, таких как 1С:Бухгалтерия Предприятия 3.0 или 1С:ERP, когда в базе ведется учет только по одному объекту.

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

Выясним причину: механизм функциональных опций

В платформе 1С:Предприятие 8.3 реализован механизм Функциональных опций (ФО). Он предназначен для динамического изменения интерфейса приложения в зависимости от настроек системы. Если в константе ИспользоватьНесколькоОрганизаций установлено значение Ложь, платформа автоматически скрывает все связанные с этой опцией реквизиты из форм, списков и, что самое важное, из настроек СКД.

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

Способ 1. Использование соединения в запросе (самый простой метод)

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

Проанализируем пример запроса. Вместо простого выбора реквизита:


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК Ссылка,
    РеализацияТоваровУслуг.Организация КАК Организация
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

Мы выполним Левое соединение со справочником Организации:


ВЫБРАТЬ
    Реализация.Ссылка КАК Ссылка,
    СпрОрганизации.Ссылка КАК Организация
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации
        ПО Реализация.Организация = СпрОрганизации.Ссылка

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

Способ 2. Создание вычисляемого поля

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

Разберем по шагам, как это сделать:

  1. Откроем схему компоновки данных и перейдем на закладку Вычисляемые поля.
  2. Добавим новое поле с путем к данным, например, ОрганизацияДляОтбора.
  3. В колонке Выражение просто укажем имя нашего исходного поля: Организация.
  4. В колонке Заголовок напишем понятное пользователю название — «Организация».

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

Способ 3. Программное отключение проверки доступности

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

При использовании объекта КомпоновщикМакетаКомпоновкиДанных в методе Выполнить() существует четвертый параметр — ПроверятьДоступностьПолей. Если установить его в значение Ложь, СКД проигнорирует функциональные опции.

Пример кода формирования отчета:


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Устанавливаем Ложь в параметр проверки доступности
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    СхемаКомпоновкиДанных, 
    КомпоновщикНастроек.ПолучитьНастройки(), 
    ДанныеРасшифровки, 
    , // Возможности проверки
    , // Тип генератора
    Ложь // ПроверятьДоступностьПолей
);

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

Способ 4. Использование набора данных «Объект»

Если данные для отчета подготавливаются в коде и передаются в СКД через Таблицу значений (набор данных - объект), механизм функциональных опций на них практически не влияет. Поля внешней таблицы не связаны напрямую с метаданными и их свойствами.

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

  1. Сформируем таблицу значений в модуле объекта отчета.
  2. Добавим в нее колонку Организация типа СправочникСсылка.Организации.
  3. Заполним данные и передадим в ПроцессорКомпоновкиДанных.

Поскольку СКД «не знает», что эта колонка должна быть скрыта функциональной опцией, она оставит её доступной для пользователя во всех диалогах настройки.

Рекомендации по выбору решения

Проанализируем ситуацию и выберем оптимальный путь:

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

← На главную