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