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

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

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

Где физически хранятся настройки командного интерфейса

Для начала проанализируем, почему мы не можем найти командный интерфейс через точку после ЭтаФорма. В отличие от обычных форм (в версии 7.7 или 8.2), где элементы управления были жестко привязаны к координатам и коллекции объектов, управляемое приложение 1С строится на декларативном подходе. Это означает, что мы не рисуем интерфейс, а описываем его структуру.

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

Важно понимать: во время выполнения (Runtime) платформа не предоставляет объектной модели для управления именно этой «декларативной» частью. Мы не можем написать ЭтаФорма.КомандныйИнтерфейс.Добавить(), так как КИ формируется платформой динамически при отрисовке формы клиентом (тонким, веб или мобильным).

Из чего состоит командный интерфейс формы

Чтобы понять, как воздействовать на интерфейс, разберем его составные части. Рассмотрим три основных источника команд:

  1. Стандартные команды: Платформа генерирует их автоматически на основании типа основного реквизита формы (например, команды «Записать», «Перечитать», «Пометка на удаление» для документа).
  2. Глобальные команды: Это общие команды или команды конкретных объектов метаданных. Они попадают в интерфейс формы, если тип параметра команды совпадает с типом данных формы.
  3. Локальные команды: Команды, которые мы создаем вручную на вкладке «Команды» в редакторе формы.

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

Программное управление через создание команд и элементов

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

Для этого в модуле формы (обычно в процедуре ПриСозданииНаСервере) мы выполняем следующие действия:


// 1. Создаем программную команду
НоваяКоманда = Команды.Добавить("ПрограммнаяКоманда");
НоваяКоманда.Действие = "ОбработчикПрограммнойКоманды";
НоваяКоманда.Заголовок = "Нажми меня!";

// 2. Создаем кнопку и привязываем её к команде
НовыйЭлемент = Элементы.Добавить("КнопкаПрограммнойКоманды", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);
НовыйЭлемент.ИмяКоманды = "ПрограммнаяКоманда";

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

Использование Функциональных Опций для управления КИ

Многие разработчики ошибочно полагают, что КИ статичен. Однако существует мощный механизм — Функциональные опции (ФО). Это штатный способ «программного» управления декларативным интерфейсом.

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

Различие между Командной панелью формы и Командным интерфейсом

Выясним важный нюанс, который часто вызывает путаницу. В элементах формы часто присутствует группа с типом Командная панель. По умолчанию у неё включено свойство Автозаполнение.

Как это работает: Если флаг Автозаполнение установлен, платформа «втягивает» в эту группу все команды из настроек Командного Интерфейса метаданных. Если же нам нужно полное программное управление, мы должны выполнить следующие шаги:

  1. Снять флаг Автозаполнение у группы (или у самой формы).
  2. Программно добавить только те кнопки, которые нам нужны в данный момент, используя коллекцию ЭтаФорма.Элементы.Добавить().

Проанализируем ситуацию с Панелью навигации (переходы к связанным данным слева). К сожалению, программно добавить туда элементы (аналогично кнопкам в командную панель) в Runtime невозможно. Состав панели навигации жестко определяется метаданными и правами доступа пользователя.

Глобальный командный интерфейс и управление разделами

Помимо уровня формы, существует командный интерфейс всего приложения (Панель разделов). Здесь платформа дает нам чуть больше свободы. Мы можем использовать метод УстановитьИнтерфейсКлиентскогоПриложения().

Этот метод позволяет на лету скрывать или показывать целые подразделы (подсистемы) для текущего сеанса пользователя. Это полезно, когда интерфейс должен радикально меняться в зависимости от роли или выбранного режима работы в рамках одной сессии.

Почему 1С ограничивает прямой доступ к КИ?

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

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

← На главную