При разработке на платформе 1С:Предприятие 8.3 часто возникает задача добавить одну и ту же функциональность (кнопку) сразу в большое количество документов или справочников. Если таких объектов десятки или сотни, ручное редактирование каждой формы становится нецелесообразным. Рассмотрим, как решить эту задачу правильно, используя возможности платформы и библиотеку стандартных подсистем (БСП).
Разберем типичную ошибку начинающих разработчиков. Платформа 1С требует, чтобы в свойстве команды Действие (Action) было указано имя процедуры, которая физически расположена в модуле этой самой формы. Попытка прописать строку вида "ИмяОбщегоМодуля.ИмяПроцедуры" не приведет к результату, так как клиентская команда ищет обработчик исключительно в контексте формы. Процедуры общего модуля не видны напрямую как действия команд формы, даже если они помечены ключевым словом Экспорт.
Проанализируем ситуацию: нам нужно добавить кнопку на 200 форм. Вместо того чтобы писать код в каждой, мы воспользуемся глобальными механизмами перехвата или типовыми подсистемами.
Если ваша конфигурация построена на базе БСП (как, например, КА 2.4, ERP или УТ 11), это самый надежный и «чистый» метод. Он позволяет регистрировать команды в одном месте, а БСП сама выведет их на нужные формы.
Рассмотрим по шагам процесс регистрации команды через общий модуль ПодключаемыеКомандыПереопределяемый. Нам необходимо найти процедуру ПриОпределенииКомандПодключенныхКОбъекту и добавить в нее описание нашей команды.
Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Команды) Экспорт
// Определяем, для каких объектов должна появиться кнопка
// Можно проверять через НастройкиФормы.ИмяФормы или метаданные
Если НастройкиФормы.ИмяФормы = "Документ.ЗаказПоставщику.Форма.ФормаДокумента" Тогда
Команда = Команды.Добавить();
Команда.Идентификатор = "МояСпециальнаяКоманда";
Команда.Представление = "Выполнить действие";
// Указываем обработчик в общем модуле
Команда.Обработчик = "МойОбщийМодульВызовСервера.ВыполнитьДействиеПоКнопке";
Команда.РежимЗаписи = "НеЗаписывать";
Команда.Вид = "КоманднаяПанель";
КонецЕсли;
КонецПроцедуры
Выясним причину, почему это удобно: БСП берет на себя всю «грязную» работу по созданию элементов формы. Обработчик в общем модуле должен иметь определенную структуру. Посмотрим на пример кода в серверном общем модуле:
Процедура ВыполнитьДействиеПоКнопке(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт
// Получаем контекст формы, если нужно
Форма = ПараметрыВыполнения.Форма;
// Реализуем логику
Для Каждого Ссылка Из МассивСсылок Цикл
// Обработка данных
КонецЦикла;
КонецПроцедуры
Если задача стоит максимально просто — добавить кнопку с одним и тем же действием для всех документов — рассмотрим вариант создания объекта метаданных Общая команда. Это встроенный механизм платформы, который не требует написания кода для встраивания кнопки в каждую форму.
Командная панель формы.Важное или Панель навигации формы.Обычное.Важный нюанс: Платформа автоматически добавит эту команду на формы всех выбранных типов объектов. Нам не нужно использовать ПриСозданииНаСервере или программно создавать элементы. Это «штатный» путь 1С для подобных задач.
Бывают ситуации, когда механизмы БСП не подходят, а общая команда не дает нужной гибкости (например, кнопку нужно выводить только при определенных условиях в данных). В этом случае мы можем программно добавить команду и кнопку на форму в расширении через &После("ПриСозданииНаСервере").
Чтобы кнопка заработала без создания процедуры в модуле формы, мы можем использовать стандартную процедуру-обработчик, которая уже есть в большинстве типовых форм, — Подключаемый_ВыполнитьКоманду. Настроим это следующим образом:
&После("ПриСозданииНаСервере")
Процедура Мой_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем команду формы
НоваяКоманда = ЭтаФорма.Команды.Добавить("МояПрограммнаяКоманда");
НоваяКоманда.Заголовок = "Спец. действие";
// Важный момент: действие привязываем к существующей типовой процедуре БСП
НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";
// Создаем кнопку на панели
НовыйЭлемент = ЭтаФорма.Элементы.Добавить("КнопкаМояКоманда", Тип("КнопкаФормы"), ЭтаФорма.Элементы.КоманднаяПанель);
НовыйЭлемент.ИмяКоманды = "МояПрограммнаяКоманда";
КонецПроцедуры
Далее нам остается только «перехватить» вызов в общем модуле, который отвечает за выполнение подключаемых команд (обычно это ПодключаемыеКомандыКлиент). Мы можем использовать расширение этого модуля, чтобы внедрить свою логику через &Перед или &Вместо процедуры ВыполнитьКоманду.
Проанализировав ситуацию, можно сделать следующие выводы:
Элементы.Добавить, если задачу можно решить через настройки метаданных — это упрощает будущие обновления системы.Сервер и Вызов сервера, передавая туда контекст формы или ссылку на объект в качестве параметров.Используя эти подходы, вы сможете эффективно управлять функциональностью в крупных конфигурациях, минимизируя рутинный труд и количество ошибок при массовом внедрении изменений.