Как заставить СКД выводить поля, скрытые функциональными опциями?

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

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

Анализ механизма работы функциональных опций в СКД

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

Способ 1. Хитрость в языке запросов (Обход анализатора)

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


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Характеристика
ИЗ
    РегистрНакопления.Продажи КАК Продажи

Платформа увидит прямую ссылку на поле и отключит его. Но мы можем применить конструкцию ВЫБОР. Идея заключается в том, чтобы смешать в одном поле данные, на которые ФО наложена, и данные, на которые она не влияет. Рассмотрим пример кода в схеме компоновки:


ВЫБРАТЬ
    ВЫБОР 
        КОГДА ЛОЖЬ ТОГДА Продажи.Номенклатура
        ИНАЧЕ Продажи.Характеристика 
    КОНЕЦ КАК ХарактеристикаВсегдаДоступна,
    Продажи.Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи

Разберем, почему это работает. Анализатор 1С проверяет поле на наличие ФО. Обнаружив, что в выражении участвует поле Номенклатура (на которое ФО не распространяется), система зачастую разрешает отображение всего вычисляемого выражения. Таким образом, мы получаем значение характеристики, даже если функциональная опция отключена.

Способ 2. Использование внешних наборов данных

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

Посмотрим на алгоритм действий:

  1. Сформируем запрос программно в модуле отчета или обработки. В обычном запросе (Запрос = Новый Запрос) функциональные опции не ограничивают выборку полей (они влияют только на видимость в интерфейсе и поведение СКД).
  2. Выгрузим результат запроса в ТаблицаЗначений.
  3. В схеме компоновки данных создадим «Набор данных - объект».
  4. Передадим нашу таблицу в СКД при формировании отчета.

Рассмотрим пример программного кода для формирования такого отчета:


// Получаем данные обычным запросом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Характеристика ИЗ Справочник.Номенклатура";
ТаблицаДанных = Запрос.Выполнить().Выгрузить();

// Передаем данные в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("МояТаблица", ТаблицаДанных);

КомпоновщикМакета = Новый ГенераторМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

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

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

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

Чтобы обойти это, проанализируем возможность программной модификации настроек компоновки. Если мы программно добавляем поле в ВыбранныеПоля после того, как отчет был инициализирован, но до момента генерации макета, в некоторых версиях платформы удается «протолкнуть» поле в итоговый результат. Однако стоит учитывать, что платформа 8.3.15 и выше стала строже проверять эти зависимости.

Важный момент: если вы используете типовые конфигурации (УТ 11, ERP, КА), обратите внимание на параметры метода Выполнить(). Хотя прямого флага «Игнорировать ФО» нет, само создание макета можно настроить так, чтобы оно не опиралось на текущие настройки функциональных опций сеанса, если предварительно подготовить структуру НастройкиКомпоновки программно, обходя стандартные диалоги выбора.

Способ 4. Вычисляемые поля и функции общих модулей

Если поле скрыто в наборе данных - запросе, мы можем попытаться извлечь его через Вычисляемые поля СКД. Рассмотрим подробнее этот путь:

  1. В конструкторе СКД на закладке «Вычисляемые поля» добавим новое поле.
  2. В выражении поля напишем вызов функции общего модуля: ОбщийМодульКлиентСервер.ПолучитьЗначениеРеквизита(Ссылка, "Характеристика").

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

Особенности работы с Характеристиками

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

Заключение и рекомендации

Мы проанализировали ситуацию и выяснили, что наиболее стабильным решением для программиста является использование внешних наборов данных или хитростей в тексте запроса с использованием конструкции ВЫБОР. При использовании этих методов помните о безопасности: функциональные опции часто скрывают данные, которые пользователю не положено видеть по бизнес-логике. Принудительный вывод таких полей должен быть обоснован технической необходимостью.

Использование расширений также является жизнеспособным вариантом: вы можете создать свою ФО, которая будет дублировать состав типовой, но всегда иметь значение Истина, тем самым перекрывая ограничение для конкретных объектов. Выбирайте метод в зависимости от того, насколько глубоко вы готовы менять логику работы отчета.

← На главную