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