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