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

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

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

Зачем изменять состав команд программно?

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

Основные правила работы с коллекциями формы

Для управления командами нам необходимо взаимодействовать с двумя коллекциями объекта УправляемаяФорма:

  1. Команды: здесь хранятся сами логические команды (действия).
  2. Элементы: здесь хранятся визуальные представления команд — кнопки.

Важно помнить, что изменять эти коллекции (методы Добавить, Удалить, Вставить) можно только на сервере. Однако искать элементы или проверять их количество можно и на клиенте.

Как скрыть или отключить стандартные команды

Стандартные команды (такие как «Провести и закрыть», «Записать», «Скопировать») создаются платформой автоматически. Чтобы достучаться до них программно, нужно знать их внутренние имена. Рассмотрим наиболее распространенные из них:

Разберем ситуацию: нам нужно скрыть кнопку «Провести и закрыть» при определенном условии. Мы можем сделать это в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Если условие выполняется, скрываем кнопку
    Если Объект.Статус = Перечисления.СтатусыЗаказов.Закрыт Тогда
        ЭлементКнопка = Элементы.Найти("ФормаПровестиИЗакрыть");
        Если ЭлементКнопка <> Неопределено Тогда
            ЭлементКнопка.Видимость = Ложь;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание, что мы используем свойство Видимость. Если же мы хотим оставить кнопку, но сделать ее недоступной для нажатия, следует использовать свойство Доступность.

Программное добавление новых команд и кнопок

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

Шаг 1. Создание команды. Нам нужно добавить объект в коллекцию Команды и назначить ему обработчик (действие).

Шаг 2. Создание кнопки. Нам нужно добавить элемент в коллекцию Элементы и связать его с созданной командой.


&НаСервере
Процедура ДобавитьКомандуИсторииНаСервере()
    
    // 1. Создаем саму команду
    НоваяКоманда = Команды.Добавить("ИсторияИзменений");
    НоваяКоманда.Заголовок = "История изменений...";
    НоваяКоманда.Действие  = "Подключаемый_ОтобразитьИсторию"; // Имя процедуры на клиенте
    
    // 2. Создаем кнопку в командной панели формы
    // Ищем основную командную панель
    КоманднаяПанель = Элементы.КоманднаяПанельФормы; 
    
    НоваяКнопка = Элементы.Добавить("КнопкаИсторияИзменений", Тип("КнопкаФормы"), КоманднаяПанель);
    НоваяКнопка.ИмяКоманды = "ИсторияИзменений";
    НоваяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
    
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда)
    // Здесь описываем логику, которая сработает при нажатии
    ПоказатьОповещениеПользователя("Запрос истории изменений...");
КонецПроцедуры

Важный нюанс: обработчик команды должен находиться в модуле формы и иметь директиву &НаКлиенте. Рекомендуется использовать префикс Подключаемый_, чтобы визуально отличать такие процедуры в коде.

Использование события «ОбработкаФормированияКоманд» (для версии 8.3.23 и выше)

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

Выясним, как это работает на практике. В параметрах этого события нам доступен массив Команды, который содержит описание всех команд, которые платформа собирается отобразить. Мы можем модифицировать этот массив:


&НаСервере
Процедура ОбработкаФормированияКоманд(Команды, Параметры)
    
    // Пройдемся по массиву команд и удалим ненужные
    Индекс = Команды.Количество() - 1;
    Пока Индекс >= 0 Цикл
        ТекущаяКоманда = Команды[Индекс];
        
        // Например, удаляем команду "Установить пометку удаления"
        Если ТекущаяКоманда.Имя = "УстановитьПометкуУдаления" Тогда
            Команды.Удалить(Индекс);
        КонецЕсли;
        
        Индекс = Индекс - 1;
    КонецЦикла;
    
КонецПроцедуры

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

Управление составом команд табличных частей

Если ваша задача — ограничить действия пользователя в табличной части (например, запретить только копирование, но разрешить добавление), можно воспользоваться свойствами самого элемента формы ТаблицаФормы — для этого подойдёт инструмент для запрета редактирования и ограничения действий на формах 1С. Это проще, чем искать кнопки в командной панели.


&НаСервере
Процедура НастроитьТаблицуТовары()
    
    ТаблицаТовары = Элементы.Товары;
    
    // Запрещаем только копирование строк
    ТаблицаТовары.РазрешитьКопирование = Ложь;
    
    // Разрешаем добавление и удаление
    ТаблицаТовары.РазрешитьДобавление = Истина;
    ТаблицаТовары.РазрешитьУдаление = Истина;
    
    // Если нужно полностью запретить изменение состава строк:
    // ТаблицаТовары.ИзменятьСоставСтрок = Ложь;
    
КонецПроцедуры

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

Работа с Автозаполнением

Иногда проще полностью отключить автоматическое формирование кнопок и создать панель с нуля. Для этого у командной панели (или у всей формы) нужно установить свойство Автозаполнение в значение Ложь. После этого панель станет пустой.

Чтобы добавить на такую панель стандартную команду вручную, используйте следующий синтаксис при установке имени команды для кнопки:

ЭлементКнопка.ИмяКоманды = "СтандартнаяКоманда.Записать";

Это позволит вам жестко контролировать порядок и состав кнопок, не полагаясь на стандартные механизмы платформы.

Резюме и рекомендации

Мы рассмотрели различные способы программного управления командами. Подведем итоги:

  1. Для простого скрытия кнопок используйте Элементы.ИмяКнопки.Видимость = Ложь в процедуре ПриСозданииНаСервере.
  2. Для добавления новых функций создавайте объект в коллекции Команды и кнопку в коллекции Элементы.
  3. Если вы работаете на платформе 8.3.23+, используйте событие ОбработкаФормированияКоманд для гибкой фильтрации состава команд.
  4. Для таблиц используйте специализированные свойства (РазрешитьДобавление, РазрешитьУдаление), чтобы управлять интерфейсом через бизнес-логику данных.
  5. Помните о контекстном меню: если вы скрыли кнопку в панели, проверьте, не осталась ли она доступна при нажатии правой кнопкой мыши. Отключить контекстное меню можно через свойство Автозаполнение элемента КонтекстноеМеню.

Используя эти методы, вы сможете создавать профессиональные и динамичные интерфейсы, которые будут удобны пользователям и просты в поддержке.

← На главную