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