Добавляем кнопку в форму 1С: от конструктора до кода

· 9 мин

Содержание

Кнопку на управляемой форме 1С нельзя просто «нарисовать» — она всегда привязана к команде. Поэтому попытка перетащить в форму голый элемент Кнопка и ждать реакции ни к чему не приводит: кнопка появляется, но при нажатии ничего не делает. Сначала создаётся команда, у команды задаётся действие, и только потом команда превращается в кнопку.

Разберём, как добавить кнопку в 1С четырьмя способами: через конструктор формы без единой строки лишнего кода, программно при открытии формы, в расширении конфигурации и с управлением видимостью по правам доступа. Все пути — для платформы 8.3 с интерфейсом «Такси».

Кнопка и команда: что с чем связано

В управляемой форме кнопка (КнопкаФормы) — это визуальное представление команды. Команда хранит, что произойдёт при нажатии; кнопка хранит, как это выглядит: заголовок, картинку, расположение.

Команды бывают трёх видов:

  • 🔹 Команды формы — живут в модуле конкретной формы, обработчик пишется прямо в ней.
  • 🔹 Команды объекта — общие для всех форм справочника или документа (например, «Печать»).
  • 🔹 Общие команды — доступны сразу многим объектам конфигурации.

Для разовой кнопки на одной форме почти всегда берут команду формы — это самый короткий путь. Общие команды и команды объекта нужны, когда одно и то же действие повторяется на нескольких формах.

Запомните связку: команда = что делать, кнопка = как показать. Одна команда может выводиться несколькими кнопками в разных местах формы.

Добавляем кнопку через конструктор формы

Способ без программирования интерфейса — всё делается мышью в редакторе формы Конфигуратора. Код понадобится только внутри обработчика, то есть для самого действия.

  1. Откройте нужную форму в Конфигураторе: найдите объект (справочник, документ, обработку) в дереве конфигурации, раскройте ветку Формы и двойным щелчком откройте форму.
  2. В редакторе формы перейдите на закладку Команды → Команды формы.
  3. Нажмите кнопку добавления (зелёный плюс) и задайте имя команды, например ОбновитьДанные. Имя — латиницей или кириллицей без пробелов.
  4. В свойствах команды найдите поле Действие и нажмите значок лупы справа. Конфигуратор сам создаст в модуле формы процедуру-обработчик с директивой &НаКлиенте и откроет её.
  5. Вернитесь на закладку Элементы. Перетащите созданную команду мышью из списка команд в дерево элементов формы — туда, где должна стоять кнопка.

После перетаскивания в дереве элементов появляется кнопка, уже связанная с командой. Заголовок подставляется из синонима команды, но его можно переопределить в свойстве Заголовок самой кнопки.

Если кнопке нужна иконка, задайте свойство Картинка — выберите готовую из библиотеки картинок платформы или добавьте свою в общие картинки конфигурации. Свойство Подсказка покажет всплывающий текст при наведении курсора — это помогает, когда на панели стоят кнопки без подписей.

Отдельный приём: на закладке Команды есть не только команды формы, но и Стандартные команды (записать, провести, печать и другие) и Глобальные команды. Их добавляют на форму тем же перетаскиванием, и писать обработчик не нужно — действие уже реализовано платформой или объектом.

Чтобы изменения заработали в рабочей базе, сохраните конфигурацию и обновите конфигурацию базы данных: меню Конфигурация → Обновить конфигурацию базы данных (F7).

Обновление конфигурации базы данных в рабочей базе требует монопольного доступа. Делайте это, когда в базе нет активных пользователей, иначе получите отказ.

Что делает кнопка: действие команды и код обработчика

Сама по себе кнопка только вызывает процедуру. Логика — внутри обработчика команды. Здесь и решается, будет это простое действие в одну строку или полноценный алгоритм.

Минимальный обработчик, который Конфигуратор создал на предыдущем шаге, выглядит так:

&НаКлиенте
Процедура ОбновитьДанные(Команда)
    Сообщить("Данные обновлены");
КонецПроцедуры

Директива &НаКлиенте обязательна: нажатие кнопки происходит на клиенте. Если действию нужны данные из базы, вызывайте из клиентской процедуры серверную с директивой &НаСервере:

&НаКлиенте
Процедура ОбновитьДанные(Команда)
    ПересчитатьНаСервере();
    Оповестить("ДанныеИзменены");
КонецПроцедуры

&НаСервере
Процедура ПересчитатьНаСервере()
    // работа с реквизитами объекта и запросами к базе
КонецПроцедуры

Простое действие умещается в клиентскую процедуру. Типичные примеры в одну-две строки:

  • 🔹 показать сообщение пользователю через Сообщить(...);
  • 🔹 открыть другую форму методом ОткрытьФорму(...);
  • 🔹 заполнить реквизит формы значением по умолчанию;
  • 🔹 запустить отчёт или обработку.

Сложное действие (запрос к базе, запись объекта, расчёты) выносится на сервер — на клиенте данных объекта в управляемой форме может просто не быть.

Не пишите тяжёлые запросы и обращения к базе в клиентской процедуре — это либо не скомпилируется, либо будет работать медленно через лишние серверные вызовы.

Добавляем кнопку программно при открытии формы

Иногда кнопка нужна по условию: своя для разных вариантов формы, для отдельной обработки или при открытии формы из кода. Тогда элемент создают программно в обработчике ПриСозданииНаСервере.

Нужны три шага: добавить команду, задать ей действие, добавить кнопку и связать её с командой.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    НоваяКоманда = Команды.Добавить("ОбновитьДанные");
    НоваяКоманда.Действие  = "ОбновитьДанные";
    НоваяКоманда.Заголовок = "Обновить";

    НоваяКнопка = Элементы.Добавить("КнопкаОбновить",
        Тип("КнопкаФормы"), Родитель);
    НоваяКнопка.ИмяКоманды = "ОбновитьДанные";

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанные(Команда)
    Сообщить("Данные обновлены");
КонецПроцедуры

Разберём тонкости:

  • 🔹 Действие — это имя клиентской процедуры-обработчика. Процедура должна существовать в модуле формы с директивой &НаКлиенте и принимать параметр Команда.
  • 🔹 Третий аргумент Элементы.Добавить — родитель. Кнопке нужен контейнер: группа или командная панель, которая уже есть на форме. Подставьте туда конкретный элемент-группу.
  • 🔹 Имена команды и кнопки должны различаться, если на форме уже есть одноимённый элемент, — иначе получите ошибку дублирования имени.

Если родителя под рукой нет, сначала добавьте группу (Тип("ГруппаФормы")) с нужным видом, а затем кладите кнопку в неё. Но в большинстве случаев командная панель на форме уже есть — её и берут как родителя.

Кнопка в расширении — без снятия типовой с поддержки

Для типовых конфигураций (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) менять саму конфигурацию нежелательно: это усложняет обновления. Добавить кнопку, не снимая конфигурацию с поддержки, позволяет расширение конфигурации . Механизм расширений появился в платформе 8.3.6.

Порядок такой:

  1. В Конфигураторе откройте Конфигурация → Расширения конфигурации. Добавьте новое расширение, задайте имя и префикс.
  2. Откройте расширение как отдельную конфигурацию. Найдите нужную форму в основной конфигурации, вызовите по ней правую кнопку → Добавить в расширение. Форма «заимствуется» — в расширении появляется её копия для доработки.
  3. В заимствованной форме добавьте свою команду и кнопку обычным способом из конструктора.
  4. Обработчик команды добавьте как новую процедуру модуля формы расширения. Если нужно вклиниться в типовой код, используйте аннотации &Перед, &После или &Вместо.

Сохраните расширение и обновите конфигурацию базы данных (F7) — это отдельный шаг от сохранения. Готовое расширение выгружается в файл .cfe (Конфигурация → Сохранить расширение в файл) и так переносится в другую базу. Загрузка .cfe в целевой базе и последующее обновление конфигурации БД — тоже два отдельных действия.

Кнопка из расширения переживает обновление типовой конфигурации: при корректном заимствовании она не слетает, пока форма в основе существенно не изменилась. Это главный плюс способа.

Видимость и доступность кнопки по правам и условиям

Одну и ту же форму видят разные пользователи, а кнопка нужна не всем. Управлять этим можно декларативно и из кода.

Два свойства элемента управляют состоянием кнопки:

СвойствоЧто делаетКак задать в коде
Видимостьскрывает или показывает кнопкуЭлементы.КнопкаОбновить.Видимость = Ложь;
Доступностьделает кнопку серой (нажать нельзя)Элементы.КнопкаОбновить.Доступность = Ложь;

Скрывать кнопку целиком стоит, когда действие недоступно пользователю в принципе. Блокировать (делать серой) — когда кнопка уместна, но сейчас неактивна: например, документ ещё не проведён.

Для привязки к правам доступа есть два подхода:

  • 🔹 По роли в коде. В ПриСозданииНаСервере проверьте роль и настройте видимость:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если НЕ РольДоступна("ПолныеПрава") Тогда
        Элементы.КнопкаОбновить.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры
  • 🔹 Через функциональную опцию. Создайте функциональную опцию, привяжите к ней команду в свойствах, и видимостью кнопки будет управлять настройка программы без правки форм. Удобно, когда функцию включают и выключают администраторы.

Динамически (в ответ на действия пользователя) видимость меняют из обработчиков формы — например, после выбора значения в поле включают нужную кнопку. Главное — все обращения к Элементы делать на клиенте или на сервере формы, а не в общих серверных модулях, у которых доступа к форме нет.

Группы, подменю и порядок кнопок

Когда кнопок становится много, командная панель превращается в кашу. Платформа даёт инструменты навести порядок.

  • 🔹 Группы. Элемент Группа объединяет кнопки. Горизонтальная или вертикальная группа задаёт раскладку; группа с видом командной панели собирает кнопки в одну полоску.
  • 🔹 Подменю. Чтобы спрятать редкие команды в выпадающий список, поместите кнопки в группу, оформленную как подменю. На панели останется одна кнопка, а остальные раскроются по нажатию.
  • 🔹 Порядок. Кнопки идут в том порядке, в каком стоят в дереве элементов. Перетаскиванием в дереве меняется и порядок на форме.
  • 🔹 Отображение. Свойство Отображение кнопки (Текст, Картинка, КартинкаТекст, Авто) решает, показывать ли подпись, иконку или и то и другое. Для панели с десятком кнопок иконки экономят место.

Ещё один способ разгрузить панель — свойство кнопки ТолькоВоВсехДействиях. Если включить его, кнопка не занимает место на основной панели, а уезжает в меню Ещё. Так удобно прятать редкие служебные команды, не создавая отдельную группу-подменю.

Частые действия держите на виду в командной панели, редкие прячьте в меню Ещё. Так форма остаётся читаемой, а нужная кнопка всегда под рукой.

Кнопка не появилась или заблокирована: что проверить

Если после добавления кнопка не видна или не реагирует, причина почти всегда в одной из типовых промахов. Сверьтесь с диагностикой.

Диагностика: выберите симптом

Частые вопросы

Можно ли добавить кнопку без Конфигуратора, прямо в режиме Предприятия?
Штатно — нет. Пользователь может настроить форму (Ещё → Изменить форму) и показать или скрыть уже существующие кнопки, но создать новую кнопку с собственным действием можно только в Конфигураторе или через расширение.
Чем кнопка формы отличается от общей команды?
Команда формы работает только на одной форме, её обработчик — в модуле этой формы. Общая команда доступна многим объектам конфигурации, а её код живёт в модуле команды. Для единичной кнопки берут команду формы.
Нужна ли директива &НаКлиенте у обработчика кнопки?
Да. Нажатие происходит на клиенте, поэтому процедура-обработчик команды формы должна быть клиентской. Если действию нужны данные базы, из неё вызывают серверную процедуру с директивой &НаСервере.
Как скрыть кнопку от части пользователей?
Двумя способами: проверить роль в коде через РольДоступна(...) и выставить Видимость, либо привязать команду к функциональной опции и управлять ею из настроек программы без правки формы.
Почему программно добавленная кнопка не видна?
Чаще всего не указан корректный родитель в Элементы.Добавить(...) — кнопке нужен контейнер (группа или командная панель), который уже есть на форме. Проверьте также, что имя команды в свойстве ИмяКоманды кнопки совпадает с именем добавленной команды.