Как программно и интерактивно управлять командным интерфейсом подсистемы в 1С 8.3

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

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

Особенности и ограничения командного интерфейса

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

Однако, несмотря на это ограничение, у нас есть богатый инструментарий для управления видимостью и составом уже существующих команд. Рассмотрим основные методы реализации этой задачи.

Способ 1. Управление видимостью через механизм Ролей

Это базовый и самый правильный с точки зрения архитектуры 1С способ. Если доступ к команде (например, открытию справочника или выполнению обработки) определяется правами доступа, платформа сама скроет лишние элементы.

Разберем по шагам, как это работает:

  1. Создаем специализированную роль, например, ПросмотрОтчетовПродаж.
  2. В настройках роли устанавливаем право Просмотр на соответствующие объекты.
  3. В командном интерфейсе подсистемы для нужных команд будет автоматически применяться фильтр: если у пользователя нет прав на объект, команда не отобразится.

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

Способ 2. Применение функциональных опций (ФО)

Функциональные опции — это мощный инструмент, который позволяет включать и выключать целые блоки интерфейса в зависимости от значений констант или реквизитов справочников. Рассмотрим ситуацию, когда нам нужно скрыть кнопку в зависимости от настройки в программе.

Проанализируем алгоритм настройки:

  1. Создаем объект метаданных Константа (например, ИспользоватьСервисДоставки) с типом Булево.
  2. Создаем объект ФункциональнаяОпция, где в качестве источника указываем нашу константу.
  3. На закладке «Состав» функциональной опции отмечаем те команды или объекты подсистем, которые должны исчезать, если константа установлена в значение Ложь.

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

  1. Создаем ПараметрФункциональныхОпций.
  2. Связываем ФО с этим параметром.
  3. В коде при начале работы системы устанавливаем значение параметра:

ПараметрыСеанса.ТекущаяОрганизация = ВыбраннаяОрганизация;
УстановитьПараметрыФункциональныхОпцийИнтерфейса();

После этого интерфейс мгновенно перестроится, скрыв команды, не соответствующие условию.

Способ 3. Создание кнопок с произвольным кодом (Общие команды)

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

  1. Создаем новую ОбщуюКоманду в дереве метаданных.
  2. В модуле команды прописываем нужную логику в процедуре ОбработкаКоманды.
  3. В свойствах команды обязательно указываем Группа (например, Панель действий.Сервис или Панель навигации.Обычное).
  4. Включаем команду в состав нужной Подсистемы.

Теперь эта команда появится в интерфейсе подсистемы. Вы можете управлять её видимостью точно так же — через роли или функциональные опции.

Способ 4. Программное управление через Хранилище системных настроек

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

Посмотрим на пример логики записи настроек:


КлючОбъекта = "Common/CommandInterface/ИмяВашейПодсистемы";
НастройкиИнтерфейса = Новый Структура; // Здесь описывается структура видимости команд
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, "", НастройкиИнтерфейса, , "ИмяПользователя");

Обратите внимание: Для применения таких настроек пользователю обычно требуется перезайти в систему или обновить интерфейс.

Способ 5. Решение проблемы динамических заголовков

Один из самых частых вопросов: «Как изменить заголовок команды в интерфейсе программно?». Прямого метода Команда.Заголовок = "..." не существует. Выясним, как обойти это ограничение.

Профессиональный workaround заключается в создании дублирующих команд. Разберем этот метод:

  1. Создаем две идентичные общие команды с разными заголовками, например: «Показать мои задачи» и «Показать задачи отдела».
  2. Привязываем обе команды к разным функциональным опциям или ролям.
  3. В зависимости от логики системы включаем только одну из них.

Для конечного пользователя это выглядит как динамическое изменение текста на кнопке, хотя технически это подмена одного объекта метаданных другим.

Способ 6. Использование Расширений конфигурации

Если вам нужно изменить интерфейс типовой конфигурации, не снимая её с поддержки, расширения — идеальный вариант. С их помощью можно:

Однако помните, что подключение расширения — это административное действие, которое не подходит для ежеминутного изменения интерфейса под конкретного пользователя в активной сессии.

Резюме

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

← На главную