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

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

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

Контекст выполнения: где именно писать код?

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

Для программного создания элементов идеально подходит стандартный обработчик события формы ПриСозданииНаСервере. Именно в этой процедуре у нас есть полный доступ к коллекции Команды и коллекции Элементы формы.

Пошаговый разбор: создание команды и кнопки

Процесс добавления кнопки на форму всегда состоит из двух обязательных шагов:

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

Давайте рассмотрим подробный практический пример реализации этой схемы:


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

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    
    // Проверяем имя вызванной команды
    Если Команда.Имя = "ДинамическаяКоманда" Тогда
        ВыполнитьДействиеНаКлиенте();
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьДействиеНаКлиенте()
    ПоказатьПредупреждение(, "Кнопка нажата! Действие успешно выполнено.");
КонецПроцедуры

Давайте проанализируем этот код подробнее. При создании элемента интерфейса мы использовали метод Элементы.Добавить. В качестве параметров мы передали уникальное имя кнопки, её тип (используем строго Тип("КнопкаФормы")) и родительский контейнер, в котором кнопка будет отображаться.

Если вам требуется вставить кнопку в определенное место командной панели или группы элементов (например, перед конкретной существующей кнопкой), следует использовать метод Элементы.Вставить вместо Добавить. Этот метод принимает дополнительный четвертый параметр — элемент, перед которым нужно расположить новую кнопку.

Решение главной проблемы: Обработчик действия

Обратите внимание на свойство команды Действие. Ему присваивается строковое имя процедуры, которая обязательно должна быть описана в модуле этой же формы с директивой выполнения &НаКлиенте.

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

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

Использование расширений для доработки типовых форм

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

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

  1. Добавьте необходимую форму из основной конфигурации в ваше расширение.
  2. В модуле формы расширения создайте обработчик события ПриСозданииНаСервере с аннотацией &После (&After).
  3. В этом обработчике напишите код создания команды и кнопки.
  4. В этом же модуле расширения создайте клиентскую процедуру-обработчик (&НаКлиенте), которая будет выполнять полезное действие при нажатии кнопки.

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

Нюансы оформления и настройки внешнего вида кнопки

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

Современный стандарт разработки: БСП

В заключение отметим, что если вы работаете в любой современной типовой конфигурации (таких как ERP, Управление торговлей, Бухгалтерия предприятия, ЗУП), ручное написание кода для добавления кнопок требуется крайне редко. В составе Библиотеки Стандартных Подсистем (БСП) присутствует мощный механизм Подключаемых команд.

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

← На главную