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