Своя кнопка в управляемой форме 1С 8.3: команда, обработчик, место на панели
Содержание
Чтобы назначить кнопку в 1С 8.3, откройте форму в Конфигураторе, на вкладке Команды создайте команду, задайте ей обработчик в свойстве Действие, а затем перетащите команду в дерево элементов формы — на командную панель или в любую группу. Кнопка — это лишь видимое представление команды: вся логика живёт в процедуре-обработчике.
Типичная ситуация: бухгалтер просит «кнопку, которая сама заполняет табличную часть счёта из заказа». Программист открывает форму документа и видит, что конфигурация на поддержке. Тут два пути — снять с поддержки (плохая идея) или добавить кнопку через расширение . Ниже оба сценария, плюс общие команды, видимость и разбор ошибок. Речь об управляемых формах и интерфейсе «Такси»; обычные формы толстого клиента здесь не рассматриваются.
Как устроены команды и кнопки в управляемой форме
В управляемом приложении кнопку нельзя «нарисовать» отдельно от действия. Сначала существует команда, а кнопка, пункт меню или гиперссылка — способ её показать. Одна команда может стоять сразу в нескольких местах: на командной панели, в подменю «Ещё» и в контекстном меню таблицы.
Из этого следуют три практических вывода:
- 🔗 Отключили команду — погасли все кнопки, которые на неё ссылаются.
- 🔒 Права проверяются на уровне команды, а не кнопки.
- 🧩 Текст, картинку и сочетание клавиш удобнее задавать у команды: кнопка подхватит их сама.
Где лежат команды, которые можно вывести кнопкой:
| Вид команды | Где создаётся | Где появляется | Типичная задача |
|---|---|---|---|
| Команда формы | Редактор формы, вкладка Команды → Команды формы | Только в этой форме | Заполнить табличную часть, пересчитать суммы |
| Стандартная команда | Платформа, вкладка Команды → Стандартные команды | В форме объекта или списка | Записать, Провести, Создать, Скопировать |
| Глобальная команда | Платформа и метаданные, Глобальные команды | Любая форма | Открыть список справочника, общая форма |
| Команда объекта метаданных | Ветка Команды у справочника или документа | Формы этого объекта, разделы | Печать, открыть связанный отчёт |
| Общая команда | Ветка Общие → Общие команды | Разделы, формы объектов типа параметра | Одна кнопка на десятке документов |
Если кнопка нужна в одной форме — берите команду формы. Если одна и та же кнопка нужна в нескольких документах — общую команду с параметром, а не копию кода в каждой форме.
Добавляем кнопку на командную панель формы
Порядок для собственной (не типовой) конфигурации или формы, которую вы уже правите.
Шаг 1. Создайте команду
- В дереве метаданных найдите объект, например документ, и откройте нужную форму двойным щелчком.
- В правой верхней части редактора перейдите на вкладку
Команды. - На закладке
Команды формынажмитеДобавить. Появится командаКоманда1. - Переименуйте её осмысленно:
ЗаполнитьИзЗаказа. Имя попадёт в код, синоним — в текст кнопки.
Шаг 2. Назначьте обработчик
- Откройте палитру свойств команды (
Alt+Enterили двойной щелчок). - В свойстве
Действиенажмите кнопку с лупой. - Платформа спросит, где создать обработчик. Для команды почти всегда выбирайте вариант «на клиенте и процедуру на сервере», если нужен доступ к базе.
- В модуле формы появится заготовка процедуры.
Шаг 3. Поставьте кнопку на форму
- Перетащите команду мышью из списка команд в дерево
Элементыслева — на узелКомандная панельформы или в нужную группу. - Платформа создаст элемент типа «Кнопка» с заполненным свойством
ИмяКоманды. - Запустите отладку (
F5) и откройте форму: кнопка на месте.
Кнопку можно поставить не только на верхнюю панель. Перетащите команду в обычную группу формы — получится кнопка рядом с полями. Перетащите на командную панель табличной части — кнопка встанет над таблицей товаров.
Полезные свойства кнопки и команды
| Свойство | У кого | Что даёт |
|---|---|---|
Заголовок, Подсказка | Команда | Текст на кнопке и всплывающая подсказка |
Картинка, Отображение | Команда, кнопка | Картинка, текст или оба варианта |
СочетаниеКлавиш | Команда | Горячая клавиша, например Ctrl+Shift+F |
ПоложениеВКоманднойПанели | Кнопка | На панели, только в «Ещё» или в обоих местах |
КнопкаПоУмолчанию | Кнопка | Срабатывает по Ctrl+Enter и выделена цветом |
ИзменяетСохраняемыеДанные | Команда | Кнопка недоступна, если форма открыта только для просмотра |
Пишем обработчик: что выполняется на клиенте, а что на сервере
Обработчик команды формы всегда начинается на клиенте. Обратиться к базе данных, выполнить запрос или прочитать объект из клиентской процедуры нельзя. Поэтому код делят на две части.
&НаКлиенте
Процедура ЗаполнитьИзЗаказа(Команда)
Если Не ЗначениеЗаполнено(Объект.Заказ) Тогда
ПоказатьПредупреждение(, "Сначала выберите заказ.");
Возврат;
КонецЕсли;
ЗаполнитьИзЗаказаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьИзЗаказаНаСервере()
Объект.Товары.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказТовары.Номенклатура КАК Номенклатура,
| ЗаказТовары.Количество КАК Количество,
| ЗаказТовары.Цена КАК Цена
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК ЗаказТовары
|ГДЕ
| ЗаказТовары.Ссылка = &Заказ";
Запрос.УстановитьПараметр("Заказ", Объект.Заказ);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
КонецЦикла;
КонецПроцедуры
Имена документа и реквизитов в примере условные — подставьте свои.
Что здесь стоит запомнить:
- ✅ Проверку «заполнен ли заказ» делаем на клиенте: не нужен лишний вызов сервера.
- ✅ Серверная процедура с контекстом (
&НаСервере) видитОбъекти меняет его. После возврата на клиент форма покажет новые строки. - ⚡ Если серверу не нужны данные формы, используйте
&НаСервереБезКонтекстаи передавайте параметры явно. Такой вызов не гоняет всю форму по сети и заметно быстрее на тонком клиенте и в веб-клиенте. - 🚫 Модальные
Вопрос()иПредупреждение()в новых конфигурациях не используйте: режим модальности обычно отключён. БеритеПоказатьВопрос()иПоказатьПредупреждение()с оповещением.
Кнопка с вопросом перед действием
Если кнопка очищает табличную часть, спросите пользователя:
&НаКлиенте
Процедура ОчиститьТовары(Команда)
Оповещение = Новый ОписаниеОповещения("ОчиститьТоварыЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Удалить все строки товаров?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТоварыЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецПроцедуры
Процедура-обработчик оповещения обязана быть экспортной, иначе платформа её не вызовет.
Когда кнопку видно, а когда нет
Видимость кнопки управляется на трёх уровнях. Если кнопка «пропала», проверяйте их по порядку.
Уровень 1. Права на команду
В редакторе ролей общие команды и команды объектов получают право «Просмотр», а у команды формы можно ограничить использование по ролям в её свойствах. Нет права — кнопка не выводится вовсе. Это правильный способ скрыть, например, кнопку «Перепровести» от рядовых пользователей.
Уровень 2. Свойства элемента
У кнопки есть Видимость и Доступность. Первое прячет кнопку, второе делает её серой. Значения задают в палитре свойств или кодом.
Уровень 3. Условие в коде формы
Когда видимость зависит от данных — статуса документа, флажка, вида операции — меняйте её программно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВидимостьКнопок(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
УстановитьВидимостьКнопок(ЭтотОбъект);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьКнопок(Форма)
Форма.Элементы.ФормаЗаполнитьИзЗаказа.Видимость =
ЗначениеЗаполнено(Форма.Объект.Заказ);
КонецПроцедуры
Процедура с директивой &НаКлиентеНаСервереБезКонтекста получает форму параметром — поэтому в обоих местах вызова передаётся ЭтотОбъект. Одна процедура работает и при открытии формы, и при смене вида операции. Имя элемента кнопки (ФормаЗаполнитьИзЗаказа) смотрите в дереве Элементы: платформа обычно склеивает его из слова «Форма» и имени команды.
Условное оформление на кнопки не действует: оно меняет цвет и видимость полей и колонок, а не команд. Видимость кнопок задают только свойствами и кодом.
Общая команда: одна кнопка на нескольких формах
Когда кнопка «Отправить письмо контрагенту» нужна и в счёте, и в реализации, и в акте, заведите общую команду.
- В ветке
Общие → Общие командыдобавьте команду. - В свойстве
ТипПараметраКомандыотметьте типы ссылок нужных документов. Кнопка появится автоматически в формах этих объектов. - В свойстве
Группавыберите место:Командная панель формы, Важное— сразу на панели,Обычное— в меню «Ещё». - Свойство
РежимИспользованияПараметра:Одиночный— команда работает с одной ссылкой,Множественный— с массивом выделенных строк списка. - В модуле команды напишите обработчик:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды — ссылка на документ (или массив при множественном режиме)
ОткрытьФорму("ОбщаяФорма.ОтправкаПисьма",
Новый Структура("Документ", ПараметрКоманды),
ПараметрыВыполненияКоманды.Источник);
КонецПроцедуры
Общая команда без параметра выводится в командном интерфейсе разделов. Для этого включите её в подсистему (свойство Состав подсистемы) и выберите группу Панель действий, Сервис, Панель действий, Отчеты или Панель навигации, Обычное.
Группы, подменю и командный интерфейс
Пять кнопок подряд на панели — уже тесно. Для порядка используйте группы.
- 📂 Подменю — выпадающая кнопка со списком команд. Добавьте в дереве элементов группу вида «Подменю» и перетащите в неё команды. Так устроены «Печать» и «Создать на основании».
- 🧱 Группа кнопок — визуально сплачивает несколько кнопок на панели, разделяя их от соседей.
- 📋 Командная панель как отдельная группа — её можно поставить в любое место формы, например над второй табличной частью.
Порядок кнопок на панели меняется стрелками в дереве Элементы. Сочетание «важные — на панели, редкие — в меню «Ещё»» задаётся свойством кнопки ПоложениеВКоманднойПанели.
Для разделов программы (то, что видно в левой панели «Такси») порядок команд настраивают в редакторе Командный интерфейс подсистемы или всей конфигурации: там отмечают видимость по ролям и перетаскивают команды между группами «Важное», «Обычное», «См. также».
Пользователь без Конфигуратора тоже может настроить форму: Ещё → Изменить форму. Но там можно только скрыть, показать и переставить уже существующие кнопки. Новую команду этим способом не создать.
Кнопка в типовой конфигурации без снятия с поддержки
В БП 3.0, ЗУП 3.1 и УТ 11 правка формы прямо в основной конфигурации снимает объект с поддержки и усложняет каждое обновление. Опытный 1С-ник делает иначе.
Вариант 1. Расширение конфигурации
Конфигурация → Расширения конфигурации, добавьте новое расширение.- В основной конфигурации найдите форму документа, в контекстном меню выберите
Добавить в расширение. - Откройте заимствованную форму в расширении и добавьте команду так же, как описано выше. Обработчик пишется в модуле формы расширения.
- Сохраните расширение и обновите конфигурацию базы данных расширения (
F7).
После обновления типовой кнопка останется, если разработчики не переименовали саму форму или реквизиты, к которым обращается ваш код.
Расширение подключается ко всем пользователям базы, поэтому сначала проверьте его на копии.
Вариант 2. Дополнительная обработка
Типовые конфигурации на БСП умеют подключать внешние обработки без Конфигуратора. В обработке задаётся вид «Заполнение объекта» или «Дополнительная обработка» и список объектов назначения. После регистрации в разделе Администрирование → Печатные формы, отчеты и обработки (в БП 3.0; в ЗУП и УТ раздел называется похоже) в форме документа появится команда в подменю заполнения или дополнительных обработок.
Минус — кнопка встаёт не в произвольное место, а в отведённое подменю. Плюс — её можно выпустить без обновления конфигурации и без монопольного доступа к базе.
Вариант 3. Кнопка, созданная кодом
Иногда кнопку добавляют программно в ПриСозданииНаСервере — например, в расширении, чтобы не трогать дерево элементов типовой формы:
&НаСервере
Процедура ДобавитьКнопку()
Команда = Команды.Добавить("МояКоманда");
Команда.Заголовок = "Заполнить по шаблону";
Команда.Действие = "МояКомандаОбработка";
Кнопка = Элементы.Добавить("КнопкаМояКоманда", Тип("КнопкаФормы"), КоманднаяПанель);
Кнопка.ИмяКоманды = "МояКоманда";
КонецПроцедуры
&НаКлиенте
Процедура МояКомандаОбработка(Команда)
// действие кнопки
КонецПроцедуры
Процедура из свойства Действие должна существовать в модуле формы с директивой &НаКлиенте, иначе нажатие ничего не сделает или вызовет ошибку.
Почему кнопка не работает: разбор частых проблем
Ещё → Изменить форму и выберите сброс к стандартным настройкам. Проверьте также, не стоит ли у кнопки «только в меню Ещё».Частые вопросы
Можно ли добавить кнопку пользователю без программиста?
Ещё → Изменить форму. Новую функцию без Конфигуратора добавляет только зарегистрированная внешняя обработка.Чем кнопка отличается от гиперссылки на форме?
Как назначить кнопке горячую клавишу?
Ctrl+S и F9: платформа или типовая конфигурация уже используют их.