Своя кнопка в управляемой форме 1С 8.3: команда, обработчик, место на панели

· 10 мин

Содержание

Чтобы назначить кнопку в 1С 8.3, откройте форму в Конфигураторе, на вкладке Команды создайте команду, задайте ей обработчик в свойстве Действие, а затем перетащите команду в дерево элементов формы — на командную панель или в любую группу. Кнопка — это лишь видимое представление команды: вся логика живёт в процедуре-обработчике.

Типичная ситуация: бухгалтер просит «кнопку, которая сама заполняет табличную часть счёта из заказа». Программист открывает форму документа и видит, что конфигурация на поддержке. Тут два пути — снять с поддержки (плохая идея) или добавить кнопку через расширение . Ниже оба сценария, плюс общие команды, видимость и разбор ошибок. Речь об управляемых формах и интерфейсе «Такси»; обычные формы толстого клиента здесь не рассматриваются.

Как устроены команды и кнопки в управляемой форме

В управляемом приложении кнопку нельзя «нарисовать» отдельно от действия. Сначала существует команда, а кнопка, пункт меню или гиперссылка — способ её показать. Одна команда может стоять сразу в нескольких местах: на командной панели, в подменю «Ещё» и в контекстном меню таблицы.

Из этого следуют три практических вывода:

  • 🔗 Отключили команду — погасли все кнопки, которые на неё ссылаются.
  • 🔒 Права проверяются на уровне команды, а не кнопки.
  • 🧩 Текст, картинку и сочетание клавиш удобнее задавать у команды: кнопка подхватит их сама.

Где лежат команды, которые можно вывести кнопкой:

Вид командыГде создаётсяГде появляетсяТипичная задача
Команда формыРедактор формы, вкладка Команды → Команды формыТолько в этой формеЗаполнить табличную часть, пересчитать суммы
Стандартная командаПлатформа, вкладка Команды → Стандартные командыВ форме объекта или спискаЗаписать, Провести, Создать, Скопировать
Глобальная командаПлатформа и метаданные, Глобальные командыЛюбая формаОткрыть список справочника, общая форма
Команда объекта метаданныхВетка Команды у справочника или документаФормы этого объекта, разделыПечать, открыть связанный отчёт
Общая командаВетка Общие → Общие командыРазделы, формы объектов типа параметраОдна кнопка на десятке документов

Если кнопка нужна в одной форме — берите команду формы. Если одна и та же кнопка нужна в нескольких документах — общую команду с параметром, а не копию кода в каждой форме.

Добавляем кнопку на командную панель формы

Порядок для собственной (не типовой) конфигурации или формы, которую вы уже правите.

Шаг 1. Создайте команду

  1. В дереве метаданных найдите объект, например документ, и откройте нужную форму двойным щелчком.
  2. В правой верхней части редактора перейдите на вкладку Команды.
  3. На закладке Команды формы нажмите Добавить. Появится команда Команда1.
  4. Переименуйте её осмысленно: ЗаполнитьИзЗаказа. Имя попадёт в код, синоним — в текст кнопки.

Шаг 2. Назначьте обработчик

  1. Откройте палитру свойств команды (Alt+Enter или двойной щелчок).
  2. В свойстве Действие нажмите кнопку с лупой.
  3. Платформа спросит, где создать обработчик. Для команды почти всегда выбирайте вариант «на клиенте и процедуру на сервере», если нужен доступ к базе.
  4. В модуле формы появится заготовка процедуры.

Шаг 3. Поставьте кнопку на форму

  1. Перетащите команду мышью из списка команд в дерево Элементы слева — на узел Командная панель формы или в нужную группу.
  2. Платформа создаст элемент типа «Кнопка» с заполненным свойством ИмяКоманды.
  3. Запустите отладку (F5) и откройте форму: кнопка на месте.

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

Полезные свойства кнопки и команды

СвойствоУ когоЧто даёт
Заголовок, ПодсказкаКомандаТекст на кнопке и всплывающая подсказка
Картинка, ОтображениеКоманда, кнопкаКартинка, текст или оба варианта
СочетаниеКлавишКомандаГорячая клавиша, например Ctrl+Shift+F
ПоложениеВКоманднойПанелиКнопкаНа панели, только в «Ещё» или в обоих местах
КнопкаПоУмолчаниюКнопкаСрабатывает по Ctrl+Enter и выделена цветом
ИзменяетСохраняемыеДанныеКомандаКнопка недоступна, если форма открыта только для просмотра

Пишем обработчик: что выполняется на клиенте, а что на сервере

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

&НаКлиенте
Процедура ЗаполнитьИзЗаказа(Команда)

	Если Не ЗначениеЗаполнено(Объект.Заказ) Тогда
		ПоказатьПредупреждение(, "Сначала выберите заказ.");
		Возврат;
	КонецЕсли;

	ЗаполнитьИзЗаказаНаСервере();

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

&НаСервере
Процедура ЗаполнитьИзЗаказаНаСервере()

	Объект.Товары.Очистить();

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ЗаказТовары.Номенклатура КАК Номенклатура,
	|	ЗаказТовары.Количество КАК Количество,
	|	ЗаказТовары.Цена КАК Цена
	|ИЗ
	|	Документ.ЗаказПокупателя.Товары КАК ЗаказТовары
	|ГДЕ
	|	ЗаказТовары.Ссылка = &Заказ";
	Запрос.УстановитьПараметр("Заказ", Объект.Заказ);

	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = Объект.Товары.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
		НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
	КонецЦикла;

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

Имена документа и реквизитов в примере условные — подставьте свои.

Что здесь стоит запомнить:

  • ✅ Проверку «заполнен ли заказ» делаем на клиенте: не нужен лишний вызов сервера.
  • ✅ Серверная процедура с контекстом (&НаСервере) видит Объект и меняет его. После возврата на клиент форма покажет новые строки.
  • ⚡ Если серверу не нужны данные формы, используйте &НаСервереБезКонтекста и передавайте параметры явно. Такой вызов не гоняет всю форму по сети и заметно быстрее на тонком клиенте и в веб-клиенте.
  • 🚫 Модальные Вопрос() и Предупреждение() в новых конфигурациях не используйте: режим модальности обычно отключён. Берите ПоказатьВопрос() и ПоказатьПредупреждение() с оповещением.

Кнопка с вопросом перед действием

Если кнопка очищает табличную часть, спросите пользователя:

&НаКлиенте
Процедура ОчиститьТовары(Команда)
	Оповещение = Новый ОписаниеОповещения("ОчиститьТоварыЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить все строки товаров?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьТоварыЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Объект.Товары.Очистить();
	КонецЕсли;
КонецПроцедуры

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

Когда кнопку видно, а когда нет

Видимость кнопки управляется на трёх уровнях. Если кнопка «пропала», проверяйте их по порядку.

Уровень 1. Права на команду

В редакторе ролей общие команды и команды объектов получают право «Просмотр», а у команды формы можно ограничить использование по ролям в её свойствах. Нет права — кнопка не выводится вовсе. Это правильный способ скрыть, например, кнопку «Перепровести» от рядовых пользователей.

Уровень 2. Свойства элемента

У кнопки есть Видимость и Доступность. Первое прячет кнопку, второе делает её серой. Значения задают в палитре свойств или кодом.

Уровень 3. Условие в коде формы

Когда видимость зависит от данных — статуса документа, флажка, вида операции — меняйте её программно:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УстановитьВидимостьКнопок(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
	УстановитьВидимостьКнопок(ЭтотОбъект);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьКнопок(Форма)
	Форма.Элементы.ФормаЗаполнитьИзЗаказа.Видимость =
		ЗначениеЗаполнено(Форма.Объект.Заказ);
КонецПроцедуры

Процедура с директивой &НаКлиентеНаСервереБезКонтекста получает форму параметром — поэтому в обоих местах вызова передаётся ЭтотОбъект. Одна процедура работает и при открытии формы, и при смене вида операции. Имя элемента кнопки (ФормаЗаполнитьИзЗаказа) смотрите в дереве Элементы: платформа обычно склеивает его из слова «Форма» и имени команды.

Условное оформление на кнопки не действует: оно меняет цвет и видимость полей и колонок, а не команд. Видимость кнопок задают только свойствами и кодом.

Общая команда: одна кнопка на нескольких формах

Когда кнопка «Отправить письмо контрагенту» нужна и в счёте, и в реализации, и в акте, заведите общую команду.

  1. В ветке Общие → Общие команды добавьте команду.
  2. В свойстве ТипПараметраКоманды отметьте типы ссылок нужных документов. Кнопка появится автоматически в формах этих объектов.
  3. В свойстве Группа выберите место: Командная панель формы, Важное — сразу на панели, Обычное — в меню «Ещё».
  4. Свойство РежимИспользованияПараметра: Одиночный — команда работает с одной ссылкой, Множественный — с массивом выделенных строк списка.
  5. В модуле команды напишите обработчик:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	// ПараметрКоманды — ссылка на документ (или массив при множественном режиме)
	ОткрытьФорму("ОбщаяФорма.ОтправкаПисьма",
		Новый Структура("Документ", ПараметрКоманды),
		ПараметрыВыполненияКоманды.Источник);
КонецПроцедуры

Общая команда без параметра выводится в командном интерфейсе разделов. Для этого включите её в подсистему (свойство Состав подсистемы) и выберите группу Панель действий, Сервис, Панель действий, Отчеты или Панель навигации, Обычное.

Какой вид команды выбрать для кнопки?

Группы, подменю и командный интерфейс

Пять кнопок подряд на панели — уже тесно. Для порядка используйте группы.

  • 📂 Подменю — выпадающая кнопка со списком команд. Добавьте в дереве элементов группу вида «Подменю» и перетащите в неё команды. Так устроены «Печать» и «Создать на основании».
  • 🧱 Группа кнопок — визуально сплачивает несколько кнопок на панели, разделяя их от соседей.
  • 📋 Командная панель как отдельная группа — её можно поставить в любое место формы, например над второй табличной частью.

Порядок кнопок на панели меняется стрелками в дереве Элементы. Сочетание «важные — на панели, редкие — в меню «Ещё»» задаётся свойством кнопки ПоложениеВКоманднойПанели.

Для разделов программы (то, что видно в левой панели «Такси») порядок команд настраивают в редакторе Командный интерфейс подсистемы или всей конфигурации: там отмечают видимость по ролям и перетаскивают команды между группами «Важное», «Обычное», «См. также».

Пользователь без Конфигуратора тоже может настроить форму: Ещё → Изменить форму. Но там можно только скрыть, показать и переставить уже существующие кнопки. Новую команду этим способом не создать.

Кнопка в типовой конфигурации без снятия с поддержки

В БП 3.0, ЗУП 3.1 и УТ 11 правка формы прямо в основной конфигурации снимает объект с поддержки и усложняет каждое обновление. Опытный 1С-ник делает иначе.

Вариант 1. Расширение конфигурации

  1. Конфигурация → Расширения конфигурации, добавьте новое расширение.
  2. В основной конфигурации найдите форму документа, в контекстном меню выберите Добавить в расширение.
  3. Откройте заимствованную форму в расширении и добавьте команду так же, как описано выше. Обработчик пишется в модуле формы расширения.
  4. Сохраните расширение и обновите конфигурацию базы данных расширения (F7).

После обновления типовой кнопка останется, если разработчики не переименовали саму форму или реквизиты, к которым обращается ваш код.

Расширение подключается ко всем пользователям базы, поэтому сначала проверьте его на копии.

Вариант 2. Дополнительная обработка

Типовые конфигурации на БСП умеют подключать внешние обработки без Конфигуратора. В обработке задаётся вид «Заполнение объекта» или «Дополнительная обработка» и список объектов назначения. После регистрации в разделе Администрирование → Печатные формы, отчеты и обработки (в БП 3.0; в ЗУП и УТ раздел называется похоже) в форме документа появится команда в подменю заполнения или дополнительных обработок.

Минус — кнопка встаёт не в произвольное место, а в отведённое подменю. Плюс — её можно выпустить без обновления конфигурации и без монопольного доступа к базе.

Вариант 3. Кнопка, созданная кодом

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

&НаСервере
Процедура ДобавитьКнопку()
	Команда = Команды.Добавить("МояКоманда");
	Команда.Заголовок = "Заполнить по шаблону";
	Команда.Действие = "МояКомандаОбработка";

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

&НаКлиенте
Процедура МояКомандаОбработка(Команда)
	// действие кнопки
КонецПроцедуры

Процедура из свойства Действие должна существовать в модуле формы с директивой &НаКлиенте, иначе нажатие ничего не сделает или вызовет ошибку.

Почему кнопка не работает: разбор частых проблем

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

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

Можно ли добавить кнопку пользователю без программиста?
Создать новую команду — нет. Показать скрытую или переставить существующую можно через Ещё → Изменить форму. Новую функцию без Конфигуратора добавляет только зарегистрированная внешняя обработка.
Чем кнопка отличается от гиперссылки на форме?
Ничем по сути: оба — представление одной команды. Вид меняется свойством «Вид» элемента кнопки: обычная кнопка, гиперссылка или кнопка командной панели.
Как назначить кнопке горячую клавишу?
В свойствах команды заполните «СочетаниеКлавиш». Не занимайте системные сочетания вроде Ctrl+S и F9: платформа или типовая конфигурация уже используют их.
Нужна ли кнопке картинка?
Не обязательно. На командной панели кнопку с картинкой узнают быстрее, но текст лучше оставить: «Отображение» → «Картинка и текст». В «Такси» доступна библиотека стандартных картинок платформы.
Сохранится ли кнопка в расширении после обновления типовой?
Да, если в новом релизе не изменилась заимствованная форма настолько, что расширение не применится. После каждого обновления откройте форму и убедитесь, что расширение подключилось без предупреждений.