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