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