Кнопка на управляемой форме 1С 8.3: команда, обработчик, оформление
Содержание
Кнопка на управляемой форме 1С 8.3 создаётся в два хода. Сначала на вкладке Команды редактора формы добавляют команду и назначают ей обработчик в свойстве Действие. Затем команду перетаскивают мышью в дерево Элементы — платформа сама превращает её в кнопку.
На форме кнопка — только «оболочка». Вся логика живёт в команде и процедуре модуля формы. Поэтому одну команду можно вывести двумя кнопками: в командной панели и в теле формы, а код останется один.
Порядок одинаков для любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ или собственной разработки. Отличается только подготовка: в типовой базе на поддержке форму лучше менять через расширение, а не снимать конфигурацию с замка.
Подготовка: какую форму открыть и где её менять
Откройте базу в режиме Конфигуратор и выполните Конфигурация → Открыть конфигурацию. В дереве метаданных найдите объект: справочник, документ, обработку. Раскройте ветку Формы и откройте нужную форму двойным щелчком.
Если формы ещё нет, нажмите Добавить на ветке Формы. Откроется конструктор: выберите тип (форма элемента, списка, документа), отметьте реквизиты и нажмите Готово.
Редактор формы делится на зоны:
- 🗂 слева вверху — дерево Элементы: поля, группы, кнопки;
- 📌 справа вверху — вкладки Реквизиты, Команды, Параметры;
- 🖼 внизу — предпросмотр формы, рядом вкладка Модуль с кодом;
- ⚙ палитра свойств выбранного объекта открывается по
Alt+Enterили из контекстного меню.
Типовая конфигурация на поддержке
У типовой базы объекты закрыты замком поддержки, редактор формы откроется только на чтение. Снятие с поддержки усложняет каждое следующее обновление. Правильный путь — расширение конфигурации (оно есть начиная с платформы 8.3.6):
Конфигурация → Расширения конфигурации→ Добавить, задайте имя и префикс, напримерМои_.- Откройте дерево расширения, найдите в основной конфигурации нужную форму.
- В контекстном меню формы выберите Добавить в расширение.
- Дальше работайте с формой в расширении так же, как описано ниже.
Префикс расширения добавляйте к именам новых команд и процедур: Мои_ПечатьЭтикетки. Так при обновлении типовой ваши имена не столкнутся с новыми именами от разработчика.
Создание кнопки в Конфигураторе: команда и элемент формы
Шаг 1. Добавьте команду формы
- В правой части редактора откройте вкладку Команды, раздел Команды формы.
- Нажмите Добавить (зелёный плюс). Появится строка
Команда1. - В свойствах задайте Имя без пробелов:
ЗаполнитьКомментарий. - Поле Заголовок заполнится по имени — исправьте на понятный текст: «Заполнить комментарий».
- В Подсказке напишите, что делает кнопка. Текст всплывёт при наведении мыши.
Шаг 2. Назначьте обработчик
В свойстве Действие нажмите кнопку с лупой. Конфигуратор спросит, где создать процедуру: только на клиенте или на клиенте вместе с серверной процедурой. Выберите вариант по задаче (подробнее в следующем разделе) — заготовка появится в модуле формы.
Без заполненного свойства «Действие» кнопка будет на форме, но нажатие ничего не сделает.
Шаг 3. Выведите команду на форму
Перетащите команду мышью из вкладки Команды в дерево Элементы:
| Куда перетащить | Что получится |
|---|---|
| В ветку Командная панель | Кнопка в верхней панели рядом с «Записать» и «Провести» |
| В корень формы или в группу | Обычная кнопка в теле формы |
| В командную панель табличной части | Кнопка над таблицей, рядом с «Добавить» |
У созданной кнопки откройте свойства и проверьте Имя — оно понадобится в коде. В командной панели платформа обычно добавляет префикс: ФормаЗаполнитьКомментарий.
Шаг 4. Выберите вид кнопки
Свойство Вид определяет внешний вид: обычная кнопка или гиперссылка. Для действий второго плана («Показать историю», «Подробнее») гиперссылка смотрится аккуратнее. Для основного действия формы включите Кнопка по умолчанию — тогда она сработает по Ctrl+Enter.
Код обработчика: что выполнять на клиенте, а что на сервере
Обработчик команды всегда стоит на клиенте и принимает параметр Команда. Клиент не видит базу данных: запросы, чтение реквизитов ссылок и запись объектов делают в серверной процедуре, которую вызывают из клиентской.
Типовая связка для кнопки на форме документа:
&НаКлиенте
Процедура ЗаполнитьКомментарий(Команда)
ЗаполнитьКомментарийНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьКомментарийНаСервере()
Объект.Комментарий = "Проверено: " + Формат(ТекущаяДатаСеанса(), "ДЛФ=D");
КонецПроцедуры
Какие директивы выбирать:
| Директива | Когда нужна | Что доступно |
|---|---|---|
&НаКлиенте | Диалоги, вопросы пользователю, открытие форм | Реквизиты формы, без базы |
&НаСервере | Запросы, работа с данными формы и базой | Всё: и форма, и база |
&НаСервереБезКонтекста | Быстрый расчёт по базе без данных формы | Только база и переданные параметры |
Вызов &НаСервереБезКонтекста легче: на сервер не уходят данные формы. Если процедуре нужно только найти цену по номенклатуре, передайте ссылку параметром и верните результат:
&НаКлиенте
Процедура ПоказатьЦену(Команда)
Цена = ПолучитьЦену(Объект.Номенклатура);
ПоказатьПредупреждение(, "Цена: " + Формат(Цена, "ЧДЦ=2"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦену(Номенклатура)
// здесь запрос к регистру цен вашей конфигурации
Возврат 0;
КонецФункции
Запрос к регистру цен зависит от конфигурации, поэтому в примере оставлена заглушка — подставьте свой регистр.
Вопрос пользователю перед действием
На управляемых формах модальные окна по умолчанию запрещены, поэтому вопрос задают асинхронно:
&НаКлиенте
Процедура ОчиститьТаблицу(Команда)
Оповещение = Новый ОписаниеОповещения("ОчиститьТаблицуЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Очистить табличную часть?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТаблицуЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецПроцедуры
Процедура-продолжение обязательно с Экспорт, иначе платформа её не вызовет.
Другие способы: общая команда и кнопка из кода
Одна кнопка на многих формах
Если кнопка нужна в нескольких документах (например, «Отправить на согласование»), заведите общую команду: Общие → Общие команды → Добавить.
- В свойстве Тип параметра команды укажите типы документов.
- В Группе выберите место, например командную панель формы.
- Код пишется в модуле команды, в процедуре
ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды).
Кнопка появится на всех формах выбранных типов без правки каждой формы. На отдельной форме её можно скрыть через вкладку Команды → Глобальные команды.
Кнопка, созданная программно
Когда кнопку нельзя добавить в редакторе (форма генерируется автоматически или кнопка нужна по условию), её создают в ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НоваяКоманда = Команды.Добавить("ПечатьЭтикетки");
НоваяКоманда.Заголовок = "Печать этикетки";
НоваяКоманда.Действие = "ПечатьЭтикетки";
НоваяКнопка = Элементы.Добавить("КнопкаПечатьЭтикетки", Тип("КнопкаФормы"), КоманднаяПанель);
НоваяКнопка.ИмяКоманды = "ПечатьЭтикетки";
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЭтикетки(Команда)
Сообщить("Нажата команда " + Команда.Имя);
КонецПроцедуры
Строка в Действие — имя процедуры, которая уже написана в модуле формы с директивой &НаКлиенте. Третий параметр Элементы.Добавить — родитель: КоманднаяПанель ставит кнопку в верхнюю панель, а Элементы.ИмяГруппы — в группу на форме.
Имена программных команд и элементов не должны совпадать с существующими. При повторном Добавить с тем же именем платформа выдаст ошибку.
Видимость и доступность кнопки по условию
Кнопкой управляют через свойства элемента формы:
- 👁
Видимость— кнопка исчезает полностью; - 🔒
Доступность— кнопка видна, но серая и не нажимается.
Начальное состояние задают на сервере при создании формы. Например, показать кнопку только пользователям с полными правами:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ФормаЗаполнитьКомментарий.Видимость = РольДоступна("ПолныеПрава");
КонецПроцедуры
Чтобы кнопка реагировала на ввод данных, меняйте свойство в обработчике изменения поля. Пока не выбрана организация, кнопка заблокирована:
&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
УстановитьДоступностьКнопок();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьКнопокФормы(Форма)
Форма.Элементы.ФормаЗаполнитьКомментарий.Доступность =
ЗначениеЗаполнено(Форма.Объект.Организация);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКнопок()
УстановитьДоступностьКнопокФормы(ЭтотОбъект);
КонецПроцедуры
Процедуру УстановитьДоступностьКнопокФормы(ЭтотОбъект) вызовите и в ПриСозданииНаСервере, иначе при открытии сохранённого документа кнопка будет в неверном состоянии. Директива &НаКлиентеНаСервереБезКонтекста позволяет держать одну процедуру для обоих случаев.
💡 Ещё два способа без кода. У команды есть свойство Функциональные опции — кнопка пропадёт, если опция выключена. А на вкладке Командный интерфейс редактора формы видимость можно отметить флажками по ролям.
Картинка, размер и внешний вид кнопки
Картинку задают у команды или у самой кнопки, в свойстве Картинка. По кнопке выбора откроется окно: в нём есть стандартные картинки платформы и общие картинки конфигурации (Общие → Общие картинки). Свою картинку PNG сначала добавьте в общие картинки, потом выбирайте.
Как кнопка показывает подпись и значок, решает свойство Отображение:
| Значение | Результат |
|---|---|
| Авто | Платформа решает сама по месту кнопки |
| Картинка | Только значок, текст уходит в подсказку |
| Текст | Только заголовок |
| Картинка и текст | Значок и подпись рядом |
Для узких командных панелей хорошо подходит «Картинка» с внятной подсказкой. В теле формы надёжнее «Картинка и текст»: пользователь не гадает, что значит значок.
Остальное оформление — в свойствах кнопки:
- 📏 Ширина и Высота — в условных единицах формы; кнопки одного ряда удобно выровнять одной шириной;
- 🎨 Цвет фона, Цвет текста, Шрифт — для акцента на главном действии; больше одной цветной кнопки на форме обычно мешает;
- ⌨ Сочетание клавиш у команды — например,
Ctrl+Shift+P; проверьте, что сочетание не занято стандартными командами; - 🧭 положение — порядком в дереве Элементы: перетаскивайте кнопку стрелками вверх-вниз или между группами.
Картинку можно поменять и из кода, например показать другую иконку после выполнения:
Элементы.ФормаЗаполнитьКомментарий.Картинка = БиблиотекаКартинок.Печать;
Проверка и отладка кнопки
Перед запуском сохраните изменения и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Для расширения то же самое делается в окне расширения. Изменения формы, команды и модуля не меняют структуру таблиц, поэтому обновление обычно проходит быстро и без монопольного режима.
Порядок отладки:
- Поставьте курсор на первую строку обработчика и нажмите
F9— появится точка останова. - Запустите
Отладка → Начать отладку → 1С:Предприятие(F5). - Откройте форму и нажмите кнопку. Конфигуратор остановится на строке с точкой.
- Идите по коду:
F10— следующая строка,F11— зайти внутрь вызываемой процедуры. - Значения переменных смотрите, наведя мышь, или через
Shift+F9(вычислить выражение).
Синтаксис модуля проверяйте до запуска: Конфигурация → Проверка конфигурации найдёт процедуры, которые не компилируются, и ссылки на несуществующие методы.
Последний пункт часто сбивает с толку. Если у команды включено Изменяет сохраняемые данные, а форма открыта только на просмотр, платформа сама делает кнопку недоступной. Для кнопок, которые ничего не меняют в объекте (печать, просмотр), снимите этот флажок.