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