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

· 9 мин

Содержание

Кнопка на управляемой форме 1С 8.3 создаётся в два хода. Сначала на вкладке Команды редактора формы добавляют команду и назначают ей обработчик в свойстве Действие. Затем команду перетаскивают мышью в дерево Элементы — платформа сама превращает её в кнопку.

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

Порядок одинаков для любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ или собственной разработки. Отличается только подготовка: в типовой базе на поддержке форму лучше менять через расширение, а не снимать конфигурацию с замка.

Подготовка: какую форму открыть и где её менять

Откройте базу в режиме Конфигуратор и выполните Конфигурация → Открыть конфигурацию. В дереве метаданных найдите объект: справочник, документ, обработку. Раскройте ветку Формы и откройте нужную форму двойным щелчком.

Если формы ещё нет, нажмите Добавить на ветке Формы. Откроется конструктор: выберите тип (форма элемента, списка, документа), отметьте реквизиты и нажмите Готово.

Редактор формы делится на зоны:

  • 🗂 слева вверху — дерево Элементы: поля, группы, кнопки;
  • 📌 справа вверху — вкладки Реквизиты, Команды, Параметры;
  • 🖼 внизу — предпросмотр формы, рядом вкладка Модуль с кодом;
  • ⚙ палитра свойств выбранного объекта открывается по Alt+Enter или из контекстного меню.

Типовая конфигурация на поддержке

У типовой базы объекты закрыты замком поддержки, редактор формы откроется только на чтение. Снятие с поддержки усложняет каждое следующее обновление. Правильный путь — расширение конфигурации (оно есть начиная с платформы 8.3.6):

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

Префикс расширения добавляйте к именам новых команд и процедур: Мои_ПечатьЭтикетки. Так при обновлении типовой ваши имена не столкнутся с новыми именами от разработчика.

Создание кнопки в Конфигураторе: команда и элемент формы

Шаг 1. Добавьте команду формы

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

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

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

Без заполненного свойства «Действие» кнопка будет на форме, но нажатие ничего не сделает.

Шаг 3. Выведите команду на форму

Перетащите команду мышью из вкладки Команды в дерево Элементы:

Куда перетащитьЧто получится
В ветку Командная панельКнопка в верхней панели рядом с «Записать» и «Провести»
В корень формы или в группуОбычная кнопка в теле формы
В командную панель табличной частиКнопка над таблицей, рядом с «Добавить»

У созданной кнопки откройте свойства и проверьте Имя — оно понадобится в коде. В командной панели платформа обычно добавляет префикс: ФормаЗаполнитьКомментарий.

Шаг 4. Выберите вид кнопки

Свойство Вид определяет внешний вид: обычная кнопка или гиперссылка. Для действий второго плана («Показать историю», «Подробнее») гиперссылка смотрится аккуратнее. Для основного действия формы включите Кнопка по умолчанию — тогда она сработает по Ctrl+Enter.

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

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

Типовая связка для кнопки на форме документа:

&НаКлиенте
Процедура ЗаполнитьКомментарий(Команда)
	ЗаполнитьКомментарийНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКомментарийНаСервере()
	Объект.Комментарий = "Проверено: " + Формат(ТекущаяДатаСеанса(), "ДЛФ=D");
КонецПроцедуры

Какие директивы выбирать:

ДирективаКогда нужнаЧто доступно
&НаКлиентеДиалоги, вопросы пользователю, открытие формРеквизиты формы, без базы
&НаСервереЗапросы, работа с данными формы и базойВсё: и форма, и база
&НаСервереБезКонтекстаБыстрый расчёт по базе без данных формыТолько база и переданные параметры

Вызов &НаСервереБезКонтекста легче: на сервер не уходят данные формы. Если процедуре нужно только найти цену по номенклатуре, передайте ссылку параметром и верните результат:

&НаКлиенте
Процедура ПоказатьЦену(Команда)
	Цена = ПолучитьЦену(Объект.Номенклатура);
	ПоказатьПредупреждение(, "Цена: " + Формат(Цена, "ЧДЦ=2"));
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьЦену(Номенклатура)
	// здесь запрос к регистру цен вашей конфигурации
	Возврат 0;
КонецФункции

Запрос к регистру цен зависит от конфигурации, поэтому в примере оставлена заглушка — подставьте свой регистр.

Вопрос пользователю перед действием

На управляемых формах модальные окна по умолчанию запрещены, поэтому вопрос задают асинхронно:

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

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

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

Другие способы: общая команда и кнопка из кода

Одна кнопка на многих формах

Если кнопка нужна в нескольких документах (например, «Отправить на согласование»), заведите общую команду: Общие → Общие команды → Добавить.

  1. В свойстве Тип параметра команды укажите типы документов.
  2. В Группе выберите место, например командную панель формы.
  3. Код пишется в модуле команды, в процедуре ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды).

Кнопка появится на всех формах выбранных типов без правки каждой формы. На отдельной форме её можно скрыть через вкладку Команды → Глобальные команды.

Кнопка, созданная программно

Когда кнопку нельзя добавить в редакторе (форма генерируется автоматически или кнопка нужна по условию), её создают в ПриСозданииНаСервере:

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

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

&НаКлиенте
Процедура ПечатьЭтикетки(Команда)
	Сообщить("Нажата команда " + Команда.Имя);
КонецПроцедуры

Строка в Действие — имя процедуры, которая уже написана в модуле формы с директивой &НаКлиенте. Третий параметр Элементы.Добавить — родитель: КоманднаяПанель ставит кнопку в верхнюю панель, а Элементы.ИмяГруппы — в группу на форме.

Имена программных команд и элементов не должны совпадать с существующими. При повторном Добавить с тем же именем платформа выдаст ошибку.

Видимость и доступность кнопки по условию

Кнопкой управляют через свойства элемента формы:

  • 👁 Видимость — кнопка исчезает полностью;
  • 🔒 Доступность — кнопка видна, но серая и не нажимается.

Начальное состояние задают на сервере при создании формы. Например, показать кнопку только пользователям с полными правами:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Элементы.ФормаЗаполнитьКомментарий.Видимость = РольДоступна("ПолныеПрава");
КонецПроцедуры

Чтобы кнопка реагировала на ввод данных, меняйте свойство в обработчике изменения поля. Пока не выбрана организация, кнопка заблокирована:

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

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

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

Процедуру УстановитьДоступностьКнопокФормы(ЭтотОбъект) вызовите и в ПриСозданииНаСервере, иначе при открытии сохранённого документа кнопка будет в неверном состоянии. Директива &НаКлиентеНаСервереБезКонтекста позволяет держать одну процедуру для обоих случаев.

💡 Ещё два способа без кода. У команды есть свойство Функциональные опции — кнопка пропадёт, если опция выключена. А на вкладке Командный интерфейс редактора формы видимость можно отметить флажками по ролям.

Картинка, размер и внешний вид кнопки

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

Как кнопка показывает подпись и значок, решает свойство Отображение:

ЗначениеРезультат
АвтоПлатформа решает сама по месту кнопки
КартинкаТолько значок, текст уходит в подсказку
ТекстТолько заголовок
Картинка и текстЗначок и подпись рядом

Для узких командных панелей хорошо подходит «Картинка» с внятной подсказкой. В теле формы надёжнее «Картинка и текст»: пользователь не гадает, что значит значок.

Остальное оформление — в свойствах кнопки:

  • 📏 Ширина и Высота — в условных единицах формы; кнопки одного ряда удобно выровнять одной шириной;
  • 🎨 Цвет фона, Цвет текста, Шрифт — для акцента на главном действии; больше одной цветной кнопки на форме обычно мешает;
  • ⌨ Сочетание клавиш у команды — например, Ctrl+Shift+P; проверьте, что сочетание не занято стандартными командами;
  • 🧭 положение — порядком в дереве Элементы: перетаскивайте кнопку стрелками вверх-вниз или между группами.

Картинку можно поменять и из кода, например показать другую иконку после выполнения:

Элементы.ФормаЗаполнитьКомментарий.Картинка = БиблиотекаКартинок.Печать;

Проверка и отладка кнопки

Перед запуском сохраните изменения и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Для расширения то же самое делается в окне расширения. Изменения формы, команды и модуля не меняют структуру таблиц, поэтому обновление обычно проходит быстро и без монопольного режима.

Порядок отладки:

  1. Поставьте курсор на первую строку обработчика и нажмите F9 — появится точка останова.
  2. Запустите Отладка → Начать отладку → 1С:Предприятие (F5).
  3. Откройте форму и нажмите кнопку. Конфигуратор остановится на строке с точкой.
  4. Идите по коду: F10 — следующая строка, F11 — зайти внутрь вызываемой процедуры.
  5. Значения переменных смотрите, наведя мышь, или через Shift+F9 (вычислить выражение).

Синтаксис модуля проверяйте до запуска: Конфигурация → Проверка конфигурации найдёт процедуры, которые не компилируются, и ссылки на несуществующие методы.

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

Последний пункт часто сбивает с толку. Если у команды включено Изменяет сохраняемые данные, а форма открыта только на просмотр, платформа сама делает кнопку недоступной. Для кнопок, которые ничего не меняют в объекте (печать, просмотр), снимите этот флажок.

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

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