К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно добавить кнопку на форму 1С

Программное добавление кнопки на форму 1С: процедура ПриСозданииНаСервере, команды, обработчики нажатия. Примеры кода для управляемых форм 8.3.

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

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

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

Где выполняется код добавления кнопки

Изменять состав элементов управляемой формы можно только на сервере. Стандартное место — обработчик ПриСозданииНаСервере модуля формы. Если кнопка должна появляться по условию (например, только для определённого статуса документа), проверка условия делается там же, перед созданием элементов.

Допустимо добавлять кнопки и позже — из серверных процедур, вызываемых, например, при изменении реквизита. Но учитывайте: повторный вызов кода попытается создать элемент с уже существующим именем, что приведёт к ошибке. Поэтому перед добавлением проверяйте наличие элемента через Элементы.Найти("ИмяКнопки").

Создание команды для кнопки

Каждая кнопка формы связана с командой. Команда определяет заголовок, картинку, подсказку и — главное — имя процедуры-обработчика, которая выполнится при нажатии. Команда добавляется в коллекцию Команды формы:

НоваяКоманда = Команды.Добавить("КомандаПечатьСчета");

НоваяКоманда.Заголовок = "Печать счёта";

НоваяКоманда.Действие = "Подключаемый_ПечатьСчета";

НоваяКоманда.Подсказка = "Сформировать печатную форму счёта";

Свойство Действие принимает строку — имя процедуры, которая должна существовать в модуле формы. Если процедуры с таким именем нет, при нажатии кнопки пользователь получит ошибку «Процедура или функция не обнаружена». Имя обработчика удобно начинать с префикса «Подключаемый_», чтобы отличать динамические обработчики от обычных.

Обработчик команды объявляется с директивой &НаКлиенте, если выполняет клиентские действия (открытие формы, вопрос пользователю), либо вызывает серверную процедуру для работы с данными:

&НаКлиенте

Процедура Подключаемый_ПечатьСчета(Команда)

ПечатьСчетаНаСервере();

КонецПроцедуры

Добавление элемента-кнопки на форму

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

НоваяКнопка = Элементы.Добавить("КнопкаПечатьСчета", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);

НоваяКнопка.ИмяКоманды = "КомандаПечатьСчета";

НоваяКнопка.Заголовок = "Печать счёта";

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

Порядок действий
  1. 1
    Откройте модуль формы и перейдите в обработчик ПриСозданииНаСервере
  2. 2
    Добавьте команду: Команды.Добавить() с заголовком и именем обработчика в свойстве Действие
  3. 3
    Добавьте элемент: Элементы.Добавить() с типом КнопкаФормы и указанием родителя
  4. 4
    Свяжите кнопку с командой через свойство ИмяКоманды
  5. 5
    Создайте процедуру-обработчик с именем, указанным в свойстве Действие команды
  6. 6
    Запустите форму в режиме предприятия и проверьте появление кнопки и её работу

Полный рабочий пример кода

Ниже — законченный фрагмент модуля формы документа, который добавляет кнопку в командную панель только если документ проведён:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Не Объект.Проведен Тогда

Возврат;

КонецЕсли;

Если Элементы.Найти("КнопкаПечатьСчета") <> Неопределено Тогда

Возврат;

КонецЕсли;

НоваяКоманда = Команды.Добавить("КомандаПечатьСчета");

НоваяКоманда.Заголовок = "Печать счёта";

НоваяКоманда.Действие = "Подключаемый_ПечатьСчета";

НоваяКнопка = Элементы.Добавить("КнопкаПечатьСчета", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);

НоваяКнопка.ИмяКоманды = "КомандаПечатьСчета";

КонецПроцедуры

&НаКлиенте

Процедура Подключаемый_ПечатьСчета(Команда)

ПоказатьПредупреждение(, "Здесь вызов формирования печатной формы");

КонецПроцедуры

Обратите внимание на двойную защиту: проверка условия по данным объекта и проверка существования элемента. Такой шаблон безопасно переносится между формами — достаточно заменить условие и текст обработчика.

bsl
НоваяКнопка = Элементы.Добавить("КнопкаПечатьСчета", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);
НоваяКнопка.ИмяКоманды = "КомандаПечатьСчета";

Настройка внешнего вида и положения кнопки

После создания кнопке можно назначить дополнительные свойства: картинку через свойство Картинка (из библиотеки картинок, например БиблиотекаКартинок.Печать), важность через Важное, видимость и доступность через одноимённые свойства. Свойство Отображение управляет показом картинки и текста.

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

Для кнопок в табличной части механизм аналогичен, но родителем указывается командная панель таблицы — Элементы.Товары.КоманднаяПанель. В обработчике такой кнопки доступ к текущей строке получают через Элементы.Товары.ТекущиеДанные.

Программная кнопка против кнопки в конфигураторе

Не каждую кнопку стоит создавать программно. Если элемент нужен всегда и всем пользователям, правильнее добавить его в конфигураторе — так форму проще сопровождать, а структура видна визуально. Программный подход оправдан в типовых конфигурациях на поддержке, где изменение формы усложняет обновление, и в сценариях с условным отображением.

Сравнение вариантов

Кнопка в конфигураторе

Подходит для постоянных элементов; видна в редакторе формы, но требует изменения конфигурации и усложняет обновление типовых решений

Программная кнопка

Подходит для условного отображения и доработки типовых форм без снятия с поддержки; требует аккуратного кода и проверки повторного создания

Расширение конфигурации

Компромисс: кнопка описывается визуально в расширении, типовая конфигурация не меняется; требует режима совместимости с расширениями

Типичные ошибки и их диагностика

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

Вторая распространённая проблема — ошибка «Элемент с таким именем уже существует» при повторном выполнении кода. Она возникает, если процедура добавления вызывается не только при создании формы, но и, например, при перечитывании объекта. Решение — проверка Элементы.Найти() перед добавлением.

Типичные ошибки
01
Имя обработчика в свойстве Действие не совпадает с именем процедуры — при нажатии возникает ошибка вызова
02
Повторное добавление элемента без проверки Элементы.Найти() — ошибка дублирования имени
03
Код добавления размещён в клиентской процедуре — изменение состава формы доступно только на сервере
04
Не указан родительский элемент — кнопка попадает в корень формы и отображается непредсказуемо
05
Кнопка создана, но не заполнено свойство ИмяКоманды — нажатие не вызывает никаких действий

Третья группа проблем — кнопка создана, но не видна. Причины: родительская группа скрыта, у группы включена свёртка, либо кнопка попала в подменю «Ещё» командной панели из-за нехватки места. Проверяйте видимость всей цепочки родителей и при необходимости перемещайте кнопку методом Элементы.Переместить().

Контрольные точки

Как проверить результат

Кнопка отображается на форме
Норма

Кнопка видна в ожидаемой группе с заданным заголовком

Тревожный признак

Кнопки нет — проверьте условие создания и видимость родителя

Нажатие кнопки
Норма

Выполняется процедура-обработчик без ошибок

Тревожный признак

Ошибка «процедура не обнаружена» — сверьте Действие команды и имя процедуры

Повторное открытие формы
Норма

Кнопка появляется один раз, ошибок нет

Тревожный признак

Ошибка дублирования имени — добавьте проверку Элементы.Найти()

FAQ: частые вопросы о программных кнопках в 1С

Можно ли добавить кнопку на форму, не изменяя конфигурацию?

Да, если у вас есть возможность доработать модуль формы через расширение конфигурации. В расширении создаётся обработчик ПриСозданииНаСервере с аннотацией «После», и весь код добавления кнопки размещается там. Типовая конфигурация при этом не меняется и обновляется штатно.

Как добавить кнопку в командную панель табличной части?

Механизм тот же, но родителем указывается командная панель таблицы: Элементы.ИмяТаблицы.КоманднаяПанель. В обработчике нажатия доступ к выделенной строке получают через Элементы.ИмяТаблицы.ТекущиеДанные на клиенте.

Почему кнопка появляется в меню «Ещё», а не на панели?

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

Как назначить кнопке картинку из стандартной библиотеки?

Картинка задаётся у команды, а не у кнопки: НоваяКоманда.Картинка = БиблиотекаКартинок.Печать. Дополнительно у кнопки можно настроить свойство Отображение, чтобы показывать картинку, текст или оба варианта.

Работает ли этот способ в обычных формах?

Нет, описанный механизм относится к управляемым формам. В обычных формах используется другая объектная модель: элементы добавляются через коллекцию ЭлементыФормы с типом «Кнопка», а обработчики назначаются через УстановитьДействие.

Как удалить программно добавленную кнопку?

Используйте Элементы.Удалить(Элементы.ИмяКнопки) на сервере. Команду при необходимости удаляют отдельно: Команды.Удалить(Команды.ИмяКоманды). Чаще вместо удаления достаточно управлять свойством Видимость — это проще и безопаснее.

Итог

Что важно запомнить

Программная кнопка создаётся в два шага на сервере: команда с обработчиком через Команды.Добавить() и элемент через Элементы.Добавить() со связью по ИмяКоманды. Всегда проверяйте существование элемента перед добавлением и указывайте родителя явно.