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