Своя кнопка на управляемой форме 1С 8.3: команда, обработчик, права
Содержание
Чтобы добавить кнопку в конфигураторе 1С 8.3, сначала создают команду, а уже потом кнопку, которая на неё ссылается. Откройте форму в редакторе, на вкладке Команды добавьте команду формы, создайте для неё обработчик в модуле и перетащите команду в дерево Элементы — в командную панель или в любую группу. Кнопка без команды на управляемой форме ничего не делает.
Если команда нужна сразу в нескольких местах — в панели навигации раздела, в списке документов и в самом документе, — вместо команды формы создают общую команду в ветке Общие → Общие команды. Для типовых конфигураций (Бухгалтерия, ЗУП, УТ) всё это лучше делать в расширении, а не в основной конфигурации: так кнопка переживёт обновление релиза.
Что подготовить и где найти нужную форму
Перед началом ответьте себе на два вопроса: где должна появиться кнопка и что она будет делать. От этого зависит тип команды.
| Задача | Что создавать | Где живёт код |
|---|---|---|
| Кнопка только на одной форме | Команда формы | Модуль формы |
| Одна кнопка в списке и в форме объекта | Общая команда с параметром | Модуль команды |
| Пункт в разделе или панели навигации | Общая команда без параметра | Модуль команды |
| Кнопка в типовой конфигурации на поддержке | Команда в расширении | Модуль формы расширения |
Как найти форму:
- 🔍 Откройте дерево конфигурации (
Конфигурация → Открыть конфигурацию). - 🔍 Встаньте в дерево и наберите имя объекта на клавиатуре — сработает быстрый поиск по дереву. Например,
ПоступлениеТоваровУслуг. - 📂 Раскройте объект, ветку
Формыи откройте нужную форму двойным щелчком. Форма документа обычно называетсяФормаДокумента, списка —ФормаСписка, но в типовых бывают свои имена. - 🧭 Не уверены, та ли форма? В пользовательском режиме откройте форму и посмотрите её имя через
Ещё → Изменить формуили режим отладки. Проще всего — поставить точку останова вПриСозданииНаСерверекандидата и открыть форму.
Если объект серый и не редактируется, конфигурация стоит на поддержке. Снимать её с поддержки ради одной кнопки не стоит: каждое обновление превратится в ручное сравнение и объединение. Используйте расширение — о нём ниже.
Перед правкой рабочей базы сделайте выгрузку Администрирование → Выгрузить информационную базу (файл .dt) или работайте в копии.
Как создать команду для кнопки и задать её свойства
В редакторе формы справа вверху есть вкладки Реквизиты, Команды, Параметры. Нужна вкладка Команды, раздел Команды формы.
- Нажмите кнопку добавления (зелёный плюс). Появится команда с именем вида
Команда1. - Откройте палитру свойств (
Alt+Enter) и задайте Имя латиницей или кириллицей без пробелов, напримерЗаполнитьПоОстаткам. - Заполните Заголовок — его увидит пользователь на кнопке.
- В поле Действие нажмите лупу. Конфигуратор спросит, где создать обработчик: на клиенте, на клиенте с вызовом сервера и т. д. Выберите вариант и подтвердите — заготовка процедуры появится в модуле формы.
Свойства, которые стоит знать:
- 🖼 Картинка — иконка из общих картинок или библиотеки платформы.
- 🔤 Отображение — только картинка, только текст или картинка и текст.
- 💬 Подсказка — всплывающий текст при наведении.
- ⌨️ Сочетание клавиш — например,
Ctrl+Shift+F. Следите, чтобы не перекрыть стандартное. - ✏️ Изменяет сохраняемые данные — если флажок стоит, команда становится недоступной, когда форма открыта только для просмотра. Для кнопки «Распечатать» его ставить не нужно, для «Заполнить» — нужно.
- 🧩 Функциональные опции — кнопка спрячется, если опция выключена в настройках программы.
Общая команда: что отличается
Общую команду создают в Общие → Общие команды. У неё другие ключевые свойства:
- Группа — куда команда встанет автоматически. Например,
Панель навигации.Обычное,Панель действий.Создать,Командная панель формы.Важное. - Тип параметра команды — тип объекта, к которому она относится (например,
ДокументСсылка.РеализацияТоваровУслуг). Только при совпадении типа команда сама появится на формах этого документа. - Режим использования параметра —
ОдиночныйилиМножественный. Во втором случае в обработчик придёт массив ссылок на все выделенные строки списка.
Если команда без параметра должна появиться в разделе, включите её в нужную подсистему: свойство Состав у подсистемы или вкладка подсистем у самой команды. Затем откройте Командный интерфейс подсистемы и проверьте видимость.
Размещение кнопки на форме
Команда создана, но на форме её ещё нет. Есть три способа вывести кнопку.
Перетаскиванием
Возьмите команду мышью на вкладке Команды и перетащите в дерево Элементы слева. Отпускайте на нужный узел:
Командная панельформы — кнопка встанет в верхнюю панель;- обычная группа — кнопка появится среди полей;
- командная панель таблицы — кнопка будет над табличной частью.
Через добавление элемента
Выделите группу в дереве Элементы, нажмите добавление и выберите Кнопка. В свойстве ИмяКоманды укажите команду через выбор. Так удобнее, когда группа глубоко вложена.
Внешний вид кнопки
У элемента-кнопки свои свойства, независимые от команды:
| Свойство | На что влияет |
|---|---|
| Вид | Обычная кнопка, гиперссылка, кнопка командной панели |
| Только во всех действиях | Показывать кнопку в панели или прятать в меню Ещё |
| Кнопка по умолчанию | Срабатывает по Ctrl+Enter |
| Видимость, Доступность | Начальное состояние, можно менять кодом |
Порядок кнопок меняют стрелками над деревом элементов или перетаскиванием внутри группы. Проверить результат без запуска можно на вкладке предварительного просмотра внизу редактора.
Код обработчика: клиент и сервер
Заготовка, которую создал конфигуратор, выглядит примерно так:
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
Если Объект.Товары.Количество() > 0 Тогда
Ответ = Вопрос("Табличная часть будет перезаполнена. Продолжить?", РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ЗаполнитьПоОстаткамНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
// здесь заполнение табличной части ДокументОбъект.Товары
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры
Модальный Вопрос() работает, только если в свойствах конфигурации разрешён режим использования модальности. В типовых конфигурациях он запрещён, поэтому там используют асинхронный вариант:
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Перезаполнить табличную часть?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ЗаполнитьПоОстаткамНаСервере();
КонецЕсли;
КонецПроцедуры
Правила, о которые спотыкаются чаще всего:
- 🖥 Обработчик команды формы всегда начинается на клиенте (
&НаКлиенте). К базе из него не обратиться — нужен серверный вызов. - 🔁
&НаСерверепередаёт на сервер всю форму с реквизитами. Если реквизиты формы не нужны, берите&НаСервереБезКонтекста— вызов легче. - 🚫 Из
&НаСервереБезКонтекстанельзя читатьОбъектиЭлементы: передавайте нужные значения параметрами.
Обработчик общей команды
В модуле общей команды заготовка другая:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды — ссылка или массив ссылок (при множественном режиме)
ПараметрыФормы = Новый Структура("Основание", ПараметрКоманды);
ОткрытьФорму("Обработка.МояОбработка.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник);
КонецПроцедуры
Кнопка, добавленная программно
Иногда кнопку создают кодом — например, когда нельзя трогать форму. Это делается в ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НоваяКоманда = Команды.Добавить("МояКоманда");
НоваяКоманда.Заголовок = "Проверить заполнение";
НоваяКоманда.Действие = "МояКомандаОбработка";
Кнопка = Элементы.Добавить("КнопкаМояКоманда", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
Кнопка.ИмяКоманды = "МояКоманда";
КонецПроцедуры
&НаКлиенте
Процедура МояКомандаОбработка(Команда)
Сообщить("Кнопка нажата");
КонецПроцедуры
Имя командной панели формы смотрите в дереве Элементы: в разных формах оно своё. Процедура-обработчик всё равно должна существовать в модуле формы.
Кнопка в типовой конфигурации через расширение
Для Бухгалтерии, ЗУП и УТ рабочий путь — расширение конфигурации . Расширения поддерживаются начиная с платформы 8.3.6.
Конфигурация → Расширения конфигурации→ добавить новое расширение. Задайте имя и префикс, напримерРасш1_.- В основной конфигурации найдите форму, щёлкните правой кнопкой →
Добавить в расширение. Форма появится в дереве расширения как заимствованная. - Откройте заимствованную форму. Добавьте команду, обработчик и кнопку теми же шагами, что описаны выше. Имена своих объектов начинайте с префикса — так их не спутать с типовыми.
- Сохраните расширение и обновите его в базе (
Конфигурация → Обновить конфигурацию базы данныхв окне расширения).
В свойствах расширения проверьте флажок Безопасный режим. Если код кнопки пишет в файлы или вызывает внешние компоненты, в безопасном режиме он упадёт с ошибкой о недостатке прав.
Расширение можно выгрузить в файл .cfe и подключить в другой базе через Администрирование → Печатные формы, отчеты и обработки → Расширения без открытия конфигуратора.
Права доступа: кто увидит кнопку
Кнопка видна пользователю, только если у одной из его ролей есть права на команду и на объект, с которым она работает.
Для общей команды. Откройте каждую роль, которая должна видеть кнопку, найдите команду в списке объектов и поставьте право Просмотр. Без него общая команда не появится нигде, даже у администратора без роли ПолныеПрава.
Для команды формы. Отдельного права в ролях нет. Ограничивают так:
- свойство команды Использование — по ролям: отметьте, каким ролям команда доступна;
- свойство кнопки Пользовательская видимость — по ролям, если кнопку нужно спрятать, но команду оставить доступной по горячей клавише;
- код в
ПриСозданииНаСервере:
Элементы.ЗаполнитьПоОстаткам.Видимость = РольДоступна("ПолныеПрава");
Скрытая кнопка — не защита данных. Если команда что-то меняет в базе, проверяйте права и в серверной процедуре, а не только на форме.
В типовых конфигурациях с профилями групп доступа новую роль из расширения добавляют пользователям через Администрирование → Настройки пользователей и прав → Профили групп доступа.
Проверка и отладка новой кнопки
- Сохраните конфигурацию и выполните
Конфигурация → Обновить конфигурацию базы данных(F7). Если в изменённой структуре нет новых реквизитов, обновление пройдёт быстро и без монопольного режима. - Запустите отладку:
Отладка → Начать отладку(F5). - В модуле формы поставьте точку останова на первой строке обработчика (
F9). - Нажмите кнопку в пользовательском режиме. Выполнение остановится, и в табло можно посмотреть значения переменных, шагать по строкам
F10иF11. - Проверьте кнопку под обычным пользователем, а не под администратором. Права — самое частое место, где всё работает «у меня» и не работает у бухгалтера.
Кнопка есть в конфигураторе, но не видна в программе? Пользователь мог раньше настроить форму под себя. Сбросьте: Ещё → Изменить форму → Ещё → Установить стандартные настройки.
В клиент-серверной базе для отладки серверного кода на сервере 1С должна быть включена отладка. Если точка останова в процедуре &НаСервере не срабатывает, а клиентская срабатывает, причина обычно в этом — вопрос к администратору сервера.