Создание кнопок на управляемых формах 1С 8.3

· 9 мин

Содержание

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

Работать будем в режиме Конфигуратора на платформе 8.3 с интерфейсом «Такси», на примере формы документа. Для справочников и обработок всё устроено так же.

Команда и кнопка: из чего состоит связь

В управляемой форме кнопка — это не код, а два разных объекта, которые нужно соединить.

  • 🔘 Элемент формы вида «Кнопка» — то, что пользователь видит и нажимает. Отвечает за внешний вид: текст, картинку, расположение в командной панели.
  • ⚙️ Команда — описывает действие. У неё есть свойство Действие со ссылкой на процедуру-обработчик.

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

Команды бывают трёх уровней:

Где создаётсяДоступнаКогда применять
Команды формыТолько на этой формеДействие для конкретной формы
Команды объектаНа всех формах документа/справочникаОдинаковое действие для всех форм объекта
Общие командыНа формах, заданных типом параметраДействие для нескольких разных объектов

Начинающему хватит команд формы — с них и начнём.

Как добавить кнопку на форму документа

Откройте форму в редакторе: в дереве конфигурации найдите документ, раскройте ветку Формы и дважды щёлкните нужную форму (например, форму документа). В редакторе формы слева — панель с вкладками Элементы, Командный интерфейс, Реквизиты, Команды, Параметры.

  1. Перейдите на вкладку Команды и раскройте группу Команды формы.
  2. Нажмите кнопку добавления (зелёный плюс) — появится новая команда, например РассчитатьСкидку. Задайте ей осмысленное имя латиницей или кириллицей и заполните свойство Заголовок — это текст, который увидит пользователь.
  3. В палитре свойств команды найдите поле Действие и нажмите значок лупы справа. 1С создаст пустую процедуру-обработчик в модуле формы и сразу откроет её.
  4. Вернитесь на вкладку Элементы. Перетащите команду мышью из списка Команды формы прямо в дерево элементов — туда, где должна стоять кнопка (например, в Командная панель формы). Платформа создаст элемент-кнопку и сама пропишет ему ИмяКоманды.
  5. Сохраните конфигурацию (F7) и обновите её в базе (F11 или Конфигурация → Обновить конфигурацию базы данных).

Шаг 4 — ключевой. Если команду создать, а в Элементы не перетащить, кнопки на форме не будет: действие есть, а нажать не на что.

После обновления откройте документ в режиме 1С:Предприятие — кнопка появится в командной панели над формой.

Куда поставить кнопку

Положение зависит от того, в какую ветку дерева Элементы вы перетащили команду:

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

Чтобы кнопка пряталась в подменю, перетащите её в группу с видом Подменю или поставьте элементу свойство ТолькоВоВсехДействиях — тогда она уйдёт в меню «Ещё».

Внешний вид кнопки

Пока кнопка выделена на вкладке Элементы, её вид настраивают в палитре свойств:

  • Заголовок — надпись на кнопке (если не задан, берётся из заголовка команды);
  • ОтображениеКнопки — показывать только текст, только картинку или и то и другое;
  • Картинка — иконка из стандартной библиотеки картинок или своя;
  • Подсказка — текст всплывающей подсказки при наведении;
  • КнопкаФормыПоУмолчанию — кнопка срабатывает по нажатию Enter.

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

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

Процедура, которую создала лупа из свойства Действие, выглядит так:

&НаКлиенте
Процедура РассчитатьСкидку(Команда)
	// сюда пишем, что делает кнопка
КонецПроцедуры

Строка &НаКлиенте — это директива компиляции. Обработчик команды всегда выполняется на клиенте: платформа реагирует на нажатие там, где сидит пользователь. На клиенте доступны реквизиты формы и диалоги, но нет прямого доступа к базе данных и к методам объекта.

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

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

&НаСервере
Процедура РассчитатьСкидкуНаСервере()
	// здесь уже можно обращаться к данным и к базе
	Объект.ПроцентСкидки = 10;
КонецПроцедуры

Коротко про директивы, которые встретятся:

  • &НаКлиенте — проверки, диалоги, обращение к элементам формы.
  • &НаСервере — работа с данными формы и базой; серверная процедура видит реквизиты формы.
  • &НаСервереБезКонтекста — то же, но без доступа к данным формы; работает быстрее, подходит для вспомогательных расчётов.

Каждый вызов серверной процедуры из клиентской — это обращение к серверу по сети. Не вызывайте сервер в цикле: соберите данные и сделайте один вызов, иначе форма будет заметно тормозить.

Если после нажатия платформа пишет, что метод не найден, или ругается на обращение к Объект — почти всегда причина в том, что код данных остался в клиентской процедуре вместо серверной.

Управляем видимостью и доступностью кнопки

Иногда кнопка нужна не всем и не всегда: только при проведённом документе, только для определённой роли, только в одной из конфигураций. Есть три уровня управления.

1. Статически, в свойствах элемента. Выделите кнопку на вкладке Элементы и в палитре свойств снимите флажок Видимость (совсем скрыть) или Доступность (показать серой, недоступной для нажатия).

2. Программно, при открытии формы. Видимость и доступность можно переключать кодом. Логичнее всего делать это в обработчике ПриСозданииНаСервере:

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

Обращение идёт через коллекцию Элементы по имени элемента-кнопки, а не команды. Переключать видимость можно и в обработчиках изменения реквизитов — тогда кнопка будет появляться по ходу заполнения.

3. По ролям и функциональным опциям. Чтобы кнопка пропадала у пользователей без нужных прав, свяжите команду с правом через роль: если у роли нет права на объект, к которому ведёт команда, платформа скроет кнопку сама. Массово включать и выключать функциональность удобнее функциональными опциями (ветка Общие → Функциональные опции): элементы, связанные с выключенной опцией, скрываются автоматически, без единой строки кода.

Выбирайте уровень по задаче: разовое условие внутри формы — код в ПриСозданииНаСервере; разграничение по пользователям — роли; включение целого блока функциональности — функциональная опция.

Общие команды: одна кнопка для разных объектов

Когда одно и то же действие нужно на формах нескольких документов или справочников, команду формы в каждый объект копировать не стоит. Для этого есть общие команды.

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

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

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

Общую команду удобно использовать и для открытия отчёта или обработки из формы документа: обработчик открывает нужную форму и передаёт в неё ссылку на текущий объект через параметр.

Командный интерфейс и расположение кнопок в разделах

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

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

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

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

Самая частая жалоба — «сделал кнопку, а её нет». Ниже типовые симптомы и что проверить в первую очередь.

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

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

Как добавить кнопку, не снимая конфигурацию с поддержки

Если конфигурация типовая и стоит на поддержке, править её напрямую нежелательно — это осложнит обновления. Начиная с платформы 8.3.6 для этого есть расширения конфигурации.

  • Создайте расширение (Конфигурация → Расширения конфигурации), добавьте в него нужную форму, а в форму — свою команду и кнопку.
  • Типовая конфигурация остаётся нетронутой: при обновлении ваша кнопка не потеряется, а расширение подключится поверх.

Это стандартный приём доработки типовых решений: 95% задач «добавить свою кнопку» решаются расширением, без снятия с поддержки и без правки оригинала.

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

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