Как добавить свою кнопку в «Быстрые действия» формы 1С через расширение
Чтобы добавить собственное «быстрое действие» в типовую форму 1С, достаточно создать команду формы в расширении, вывести её кнопкой на командную панель (или в меню «Ещё») и написать обработчик: на клиенте — сбор контекста/выделения, на сервере — основная бизнес‑логика.
Оглавление
Что в 1С считается «быстрым действием»
На практике «быстрые действия» — это команды формы, которые выведены:
- кнопкой на командной панели;
- пунктом в меню «Ещё»;
- иногда — отдельной группой действий на панели.
Техническая связка почти всегда одна: Команда формы → элемент интерфейса (кнопка/пункт меню) → обработчик в модуле формы.
Какой способ выбрать: через заимствование или программно
Сравнение подходов добавления команды
| Подход | Как делается | Плюсы | Риски/минусы |
|---|---|---|---|
| A. Заимствование формы | Добавляете команду и кнопку в форме расширения | Предсказуемо, «по-типовому», проще сопровождать права/настройки UI | Расширение зависит от структуры формы (хотя меньше, чем при правке конфигурации) |
| B. Программно при открытии | Создаёте команду/кнопку в событии формы | Минимум правок структуры, удобно для быстрых внедрений | Может сломаться при изменении имён/иерархии элементов формы |
Если действие — важная часть пользовательского сценария и должно «жить» в форме надолго, чаще выбирают Подход A. Подход B хорош как аккуратный «плагин», но требует дисциплины по проверкам Найти(...).
Способ A: команда и кнопка в заимствованной форме
- Заимствуйте форму в расширение (обычно достаточно формы списка или формы объекта).
- В форме добавьте Команду формы, например
МоеБыстроеДействие, задайте заголовок/подсказку. - Выведите команду кнопкой на командную панель или пунктом в «Ещё».
- Реализуйте обработчик: клиент — собирает выделение/контекст, сервер — выполняет изменения данных.
Пример каркаса (форма списка: работаем с выделением):
&НаКлиенте
Процедура МоеБыстроеДействие(Команда)
Ссылки = ПолучитьВыделенныеСсылки();
Если Ссылки.Количество() = 0 Тогда
Сообщить("Выберите хотя бы одну строку.");
Возврат;
КонецЕсли;
Если Не Вопрос("Выполнить действие для выбранных: " + Ссылки.Количество() + "?", РежимДиалогаВопрос.ДаНет) Тогда
Возврат;
КонецЕсли;
ВыполнитьДействиеНаСервере(Ссылки);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьДействиеНаСервере(Ссылки) Экспорт
// Здесь — запись/проведение/регистры/создание объектов.
// Обязательно учитывайте права и валидируйте входные данные.
КонецПроцедуры
Получение выделения зависит от элемента списка в конкретной форме (имя может отличаться):
&НаКлиенте
Функция ПолучитьВыделенныеСсылки()
Результат = Новый Массив;
ЭлСписок = Элементы.Найти("Список");
Если ЭлСписок = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Для каждого Стр Из ЭлСписок.ВыделенныеСтроки Цикл
Если Стр.Свойство("Ссылка") Тогда
Результат.Добавить(Стр.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Главная причина «не работает в другой форме/после обновления» — неверное имя элемента списка. Всегда проверяйте через Элементы.Найти(...) и подбирайте имя по реальной форме.
Способ B: добавить команду и кнопку программно
Подход полезен, когда вы не хотите менять структуру формы в конфигураторе: команда и кнопка создаются «на лету» при создании формы.
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Команды.Найти("МоеБыстроеДействие") = Неопределено Тогда
Ком = Команды.Добавить("МоеБыстроеДействие");
Ком.Заголовок = "Сделать действие";
Ком.Действие = "МоеБыстроеДействие";
КонецЕсли;
Панель = Элементы.Найти("КоманднаяПанель");
Если Панель <> Неопределено И Элементы.Найти("КнопкаМоеБыстроеДействие") = Неопределено Тогда
Кнопка = Элементы.Добавить("КнопкаМоеБыстроеДействие", Тип("КнопкаФормы"), Панель);
Кнопка.Команда = Команды.МоеБыстроеДействие;
Кнопка.Заголовок = "Сделать действие";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура МоеБыстроеДействие(Команда)
Сообщить("Команда выполнена!");
КонецПроцедуры
Чтобы кнопка была «умной», удобнее управлять доступностью команды, а не ругаться уже в обработчике:
&НаКлиенте
Процедура ОбновитьДоступностьКоманд()
Команды.МоеБыстроеДействие.Доступность = (ПолучитьВыделенныеСсылки().Количество() > 0);
КонецПроцедуры
При программном добавлении всегда делайте проверки Команды.Найти(...) и Элементы.Найти(...), иначе при повторном открытии формы получите дубликаты элементов или ошибки.
Частые ошибки
- Вся логика на клиенте. Итог: проблемы с правами и безопасностью. Делайте изменения данных на сервере.
- Работа только с текущей строкой вместо выделения. Для списков явно обрабатывайте
ВыделенныеСтроки. - Жёсткая привязка к имени панели/группы. Ищите элементы через
Найти(...)и предусмотрите «мягкий отказ» (нет панели — нет кнопки). - Команда видна всем, но выполнять нельзя. Либо скрывайте/отключайте команду по правам, либо выдавайте понятное сообщение при запрете на сервере.
FAQ
Можно ли добавить быстрое действие совсем без заимствования формы?
Да: через программное добавление (Способ B). Но учитывайте, что типовая форма может поменять имена/структуру элементов.
Что лучше: команда формы или общая команда?
Для действий, завязанных на контекст формы (выделение строк, текущий объект), обычно лучше команда формы. Общие команды уместны для глобальных сервисных действий.
Где правильнее проверять права?
Критично — на сервере перед изменением данных (и обрабатывать исключения). На клиенте можно дополнительно управлять доступностью команды для лучшего UX.