Как вывести данные в отчете СКД, если они ограничены функциональной опцией?

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

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

Понимание проблемы

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

Решение через программное формирование макета

Самый эффективный и «чистый» способ решить эту задачу — отказаться от стандартного метода формирования отчета через КомпоновщикНастроек и взять управление процессом в свои руки. Для этого нам необходимо программно сформировать макет компоновки с использованием специального параметра.

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

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

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

Пример программной реализации

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


// Предположим, СхемаКомпоновкиДанных и НастройкиКомпоновкиДанных уже получены
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// Формируем макет, принудительно отключая проверку доступности полей
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    СхемаКомпоновкиДанных, 
    НастройкиКомпоновкиДанных, 
    , 
    , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), 
    Ложь // Параметр ПроверятьДоступностьПолей = Ложь
);

// Далее стандартный процесс формирования отчета
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Важные нюансы

При использовании этого метода стоит учитывать несколько важных моментов:

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

← На главную