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