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