Создание кнопок на управляемых формах 1С 8.3
Содержание
Кнопка в 1С 8.3 живёт не сама по себе: сначала создают команду, потом кладут на форму элемент-кнопку и связывают его с этой командой. Нажатие запускает процедуру-обработчик — именно в ней пишут то, что должно произойти. Разберёмся, где всё это создаётся в Конфигураторе, как написать обработчик с правильными директивами компиляции, как спрятать кнопку от части пользователей и почему свежая кнопка иногда не появляется на форме.
Работать будем в режиме Конфигуратора на платформе 8.3 с интерфейсом «Такси», на примере формы документа. Для справочников и обработок всё устроено так же.
Команда и кнопка: из чего состоит связь
В управляемой форме кнопка — это не код, а два разных объекта, которые нужно соединить.
- 🔘 Элемент формы вида «Кнопка» — то, что пользователь видит и нажимает. Отвечает за внешний вид: текст, картинку, расположение в командной панели.
- ⚙️ Команда — описывает действие. У неё есть свойство
Действиесо ссылкой на процедуру-обработчик.
Кнопка ссылается на команду через свойство ИмяКоманды. Одну команду можно повесить сразу на несколько кнопок, а можно вызвать из меню «Ещё» без отдельной кнопки.
Команды бывают трёх уровней:
| Где создаётся | Доступна | Когда применять |
|---|---|---|
| Команды формы | Только на этой форме | Действие для конкретной формы |
| Команды объекта | На всех формах документа/справочника | Одинаковое действие для всех форм объекта |
| Общие команды | На формах, заданных типом параметра | Действие для нескольких разных объектов |
Начинающему хватит команд формы — с них и начнём.
Как добавить кнопку на форму документа
Откройте форму в редакторе: в дереве конфигурации найдите документ, раскройте ветку Формы и дважды щёлкните нужную форму (например, форму документа). В редакторе формы слева — панель с вкладками Элементы, Командный интерфейс, Реквизиты, Команды, Параметры.
- Перейдите на вкладку Команды и раскройте группу
Команды формы. - Нажмите кнопку добавления (зелёный плюс) — появится новая команда, например
РассчитатьСкидку. Задайте ей осмысленное имя латиницей или кириллицей и заполните свойствоЗаголовок— это текст, который увидит пользователь. - В палитре свойств команды найдите поле Действие и нажмите значок лупы справа. 1С создаст пустую процедуру-обработчик в модуле формы и сразу откроет её.
- Вернитесь на вкладку Элементы. Перетащите команду мышью из списка
Команды формыпрямо в дерево элементов — туда, где должна стоять кнопка (например, вКомандная панель формы). Платформа создаст элемент-кнопку и сама пропишет емуИмяКоманды. - Сохраните конфигурацию (
F7) и обновите её в базе (F11илиКонфигурация → Обновить конфигурацию базы данных).
Шаг 4 — ключевой. Если команду создать, а в Элементы не перетащить, кнопки на форме не будет: действие есть, а нажать не на что.
После обновления откройте документ в режиме 1С:Предприятие — кнопка появится в командной панели над формой.
Куда поставить кнопку
Положение зависит от того, в какую ветку дерева Элементы вы перетащили команду:
- в
Командная панель формы— кнопка в верхней панели документа; - внутрь группы на форме — кнопка рядом с реквизитами;
- в командную панель таблицы (например, табличной части) — кнопка управляет строками таблицы.
Чтобы кнопка пряталась в подменю, перетащите её в группу с видом Подменю или поставьте элементу свойство ТолькоВоВсехДействиях — тогда она уйдёт в меню «Ещё».
Внешний вид кнопки
Пока кнопка выделена на вкладке Элементы, её вид настраивают в палитре свойств:
Заголовок— надпись на кнопке (если не задан, берётся из заголовка команды);ОтображениеКнопки— показывать только текст, только картинку или и то и другое;Картинка— иконка из стандартной библиотеки картинок или своя;Подсказка— текст всплывающей подсказки при наведении;КнопкаФормыПоУмолчанию— кнопка срабатывает по нажатию Enter.
Для редко используемых действий ставьте только картинку и уводите кнопку в меню «Ещё» — так командная панель не разрастается. Основное действие формы, наоборот, выносят текстом в начало панели.
Пишем обработчик: клиент, сервер и директивы
Процедура, которую создала лупа из свойства Действие, выглядит так:
&НаКлиенте
Процедура РассчитатьСкидку(Команда)
// сюда пишем, что делает кнопка
КонецПроцедуры
Строка &НаКлиенте — это директива компиляции. Обработчик команды всегда выполняется на клиенте: платформа реагирует на нажатие там, где сидит пользователь. На клиенте доступны реквизиты формы и диалоги, но нет прямого доступа к базе данных и к методам объекта.
Поэтому всё, что лезет в базу — чтение регистров, запись документа, запрос — выносят в отдельную серверную процедуру и вызывают её из клиентской:
&НаКлиенте
Процедура РассчитатьСкидку(Команда)
Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
ПоказатьПредупреждение(, "Сначала выберите контрагента");
Возврат;
КонецЕсли;
РассчитатьСкидкуНаСервере();
КонецПроцедуры
&НаСервере
Процедура РассчитатьСкидкуНаСервере()
// здесь уже можно обращаться к данным и к базе
Объект.ПроцентСкидки = 10;
КонецПроцедуры
Коротко про директивы, которые встретятся:
&НаКлиенте— проверки, диалоги, обращение к элементам формы.&НаСервере— работа с данными формы и базой; серверная процедура видит реквизиты формы.&НаСервереБезКонтекста— то же, но без доступа к данным формы; работает быстрее, подходит для вспомогательных расчётов.
Каждый вызов серверной процедуры из клиентской — это обращение к серверу по сети. Не вызывайте сервер в цикле: соберите данные и сделайте один вызов, иначе форма будет заметно тормозить.
Если после нажатия платформа пишет, что метод не найден, или ругается на обращение к Объект — почти всегда причина в том, что код данных остался в клиентской процедуре вместо серверной.
Управляем видимостью и доступностью кнопки
Иногда кнопка нужна не всем и не всегда: только при проведённом документе, только для определённой роли, только в одной из конфигураций. Есть три уровня управления.
1. Статически, в свойствах элемента. Выделите кнопку на вкладке Элементы и в палитре свойств снимите флажок Видимость (совсем скрыть) или Доступность (показать серой, недоступной для нажатия).
2. Программно, при открытии формы. Видимость и доступность можно переключать кодом. Логичнее всего делать это в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.РассчитатьСкидку.Видимость = Объект.Проведен;
Элементы.РассчитатьСкидку.Доступность = Не ТолькоПросмотр;
КонецПроцедуры
Обращение идёт через коллекцию Элементы по имени элемента-кнопки, а не команды. Переключать видимость можно и в обработчиках изменения реквизитов — тогда кнопка будет появляться по ходу заполнения.
3. По ролям и функциональным опциям. Чтобы кнопка пропадала у пользователей без нужных прав, свяжите команду с правом через роль: если у роли нет права на объект, к которому ведёт команда, платформа скроет кнопку сама. Массово включать и выключать функциональность удобнее функциональными опциями (ветка Общие → Функциональные опции): элементы, связанные с выключенной опцией, скрываются автоматически, без единой строки кода.
Выбирайте уровень по задаче: разовое условие внутри формы — код в ПриСозданииНаСервере; разграничение по пользователям — роли; включение целого блока функциональности — функциональная опция.
Общие команды: одна кнопка для разных объектов
Когда одно и то же действие нужно на формах нескольких документов или справочников, команду формы в каждый объект копировать не стоит. Для этого есть общие команды.
- В дереве конфигурации раскройте ветку
Общиеи наОбщие командынажмите добавление. - Задайте заголовок — это надпись на будущей кнопке.
- Заполните свойство Тип параметра команды: укажите тип объекта (например,
ДокументСсылка.РеализацияТоваровУслуг). Команда появится на формах именно этого типа. Можно указать составной тип — тогда кнопка будет сразу у нескольких объектов. - Свойство Группа задаёт, где именно встанет кнопка: командная панель формы, панель навигации формы, панель действий раздела.
- Откройте модуль команды (
Открыть модуль команды) и напишите обработчик:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды — ссылка на текущий объект
КонецПроцедуры
В ПараметрКоманды платформа передаёт ссылку на объект, из формы которого нажали кнопку. Это и отличает общую команду от команды формы: она универсальна и получает контекст через параметр. Клиентский обработчик при необходимости вызывает серверный метод общего модуля — так же, как на обычной форме.
Если нужно, чтобы одна команда работала с разными конкретными значениями (например, по каждому складу своя кнопка), включите флажок Параметризуемая команда. Платформа сама построит список вариантов, и у объекта появится не одна кнопка, а несколько — по значению параметра.
Общую команду удобно использовать и для открытия отчёта или обработки из формы документа: обработчик открывает нужную форму и передаёт в неё ссылку на текущий объект через параметр.
Командный интерфейс и расположение кнопок в разделах
Команды верхнего уровня — те, что ведут к отчётам, обработкам и спискам — отображаются не на формах, а в командном интерфейсе разделов.
- Настраивается он в свойствах подсистемы: откройте подсистему и нажмите
Командный интерфейс. В окне видно, какие команды попадают в панель навигации и панель действий раздела, и можно включить или выключить их видимость, в том числе по ролям. - Для формы есть свой
Командный интерфейс формы— он управляет панелью навигации формы и командной панелью. Туда же попадают стандартные команды (провести, записать, печать).
Порядок кнопок пользователь может менять и сам — через Главное меню → Вид → Настройка панели разделов и настройку форм, но базовый состав и видимость задаёт разработчик в конфигураторе.
Кнопка не появилась: быстрый разбор причин
Самая частая жалоба — «сделал кнопку, а её нет». Ниже типовые симптомы и что проверить в первую очередь.
Если ничего из перечисленного не подошло, проверьте очевидное: сохранена ли конфигурация (F7) и обновлена ли она в базе (F11). Пока конфигурацию базы не обновили, в режиме 1С:Предприятие работает старая версия формы — изменений не видно.
Как добавить кнопку, не снимая конфигурацию с поддержки
Если конфигурация типовая и стоит на поддержке, править её напрямую нежелательно — это осложнит обновления. Начиная с платформы 8.3.6 для этого есть расширения конфигурации.
- Создайте расширение (
Конфигурация → Расширения конфигурации), добавьте в него нужную форму, а в форму — свою команду и кнопку. - Типовая конфигурация остаётся нетронутой: при обновлении ваша кнопка не потеряется, а расширение подключится поверх.
Это стандартный приём доработки типовых решений: 95% задач «добавить свою кнопку» решаются расширением, без снятия с поддержки и без правки оригинала.
Частые вопросы
Чем команда отличается от кнопки?
Можно ли сделать кнопку картинкой или в виде гиперссылки?
Вид (кнопка, гиперссылка, картинка) и ОтображениеКнопки (текст, картинка, картинка и текст). Картинку задают в свойстве Картинка — из библиотеки картинок или своей.Почему обработчик не получается вызвать прямо на сервере?
&НаСервере и вызывают её из клиентской.Как сделать кнопку «по умолчанию», которая срабатывает по Enter?
КнопкаФормыПоУмолчанию. Такая кнопка сработает при нажатии Enter, если фокус не в многострочном поле.Нужно ли перезапускать 1С, чтобы увидеть новую кнопку?
F11) и переоткройте форму. Пока база не обновлена, отображается прежний вариант формы.