Как программно добавить свою кнопку на панель формы отчета в БСП 3.1.4

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с необходимостью добавить пользовательскую кнопку на форму отчета (например, рядом со стандартной кнопкой "Сформировать"). Создание собственной формы отчета часто приводит к ошибкам вроде «Не передан служебный параметр "Настройки отчета"», так как стандартные механизмы БСП ожидают определенную инициализацию. Правильный путь — использование программного интерфейса БСП для модификации стандартной формы отчета.

В этой статье мы разберем, как добавить свою команду и кнопку, используя механизмы переопределения в БСП 3.1.4 и выше, не создавая при этом уникальную форму отчета.

Шаг 1. Регистрация возможности изменения формы

Для начала нам необходимо сообщить системе, что наш отчет будет самостоятельно определять настройки своей формы. Это делается в общем модуле ВариантыОтчетовПереопределяемый. Нам нужно найти процедуру НастроитьВариантыОтчетов (или НастроитьВариантОтчета в зависимости от версии) и прописать настройки для нашего объекта.

Проанализируем необходимый код:


Процедура НастроитьВариантыОтчетов(Настройки) Экспорт
    // Указываем, что для нашего отчета настройки формы будут определяться в его модуле объекта
    ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.МойОтчет).ОпределитьНастройкиФормы = Истина;
КонецПроцедуры

Важный нюанс: Если вы добавили этот код, но выполнение не заходит в процедуру (точка останова не срабатывает), это означает, что система использует кэшированные данные. В этом случае необходимо запустить обновление информационной базы с параметром /С ЗапуститьОбновлениеИнформационнойБазы или обновить идентификаторы объектов метаданных.

Шаг 2. Подключение событий в модуле объекта отчета

Теперь перейдем в Модуль объекта вашего отчета. Здесь необходимо создать экспортную процедуру ОпределитьНастройкиФормы. Эта процедура позволяет «подписаться» на события формы отчета, которая будет создана динамически.

Рассмотрим пример реализации:


// Определяет настройки формы отчета.
//
// Параметры:
//  Форма          - ФормаКлиентскогоПриложения - Форма отчета.
//  КлючВарианта   - Строка - Идентификатор варианта отчета.
//  Настройки      - Структура - Настройки формы.
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    // Включаем перехват события ПриСозданииНаСервере
    Настройки.События.ПриСозданииНаСервере = Истина;        
КонецПроцедуры

Устанавливая Настройки.События.ПриСозданииНаСервере = Истина, мы говорим БСП, что при создании формы отчета система должна вызвать процедуру ПриСозданииНаСервере, расположенную в этом же модуле объекта отчета.

Шаг 3. Программное добавление команды и кнопки

Теперь реализуем саму процедуру ПриСозданииНаСервере в модуле объекта. Именно здесь мы будем добавлять элементы управления на форму. Рассмотрим два способа: ручное добавление элементов и использование стандартного метода БСП ОтчетыСервер.ВывестиКоманду.

Вариант 1: Использование метода ОтчетыСервер.ВывестиКоманду (Рекомендуется)

Этот метод предпочтителен, так как он автоматически размещает кнопку в правильном месте согласно стандартам интерфейса БСП.


Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    
    // Создаем команду формы
    Команда = Форма.Команды.Добавить("МояСпециальнаяКоманда");
    Команда.Действие  = "Подключаемый_Команда"; // Специальное имя действия для БСП
    Команда.Заголовок = "Выполнить действие";
    
    // Выводим команду на панель. 
    // Обычно используется группа "ГруппаКоманднаяПанельОтчета"
    ОтчетыСервер.ВывестиКоманду(Форма, Команда, "ГруппаКоманднаяПанельОтчета");
    
КонецПроцедуры

Вариант 2: Ручное добавление через элементы формы

Если вам нужен более тонкий контроль над размещением, можно добавить кнопку напрямую в коллекцию элементов.


Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    
    // Добавляем команду
    ТвояКоманда = Форма.Команды.Добавить("НазваниеКоманды");
    ТвояКоманда.Действие  = "Подключаемый_Команда";
    ТвояКоманда.Заголовок = "Моя Кнопка";
    
    // Регистрируем команду в постоянных командах формы (специфика БСП)
    Форма.ПостоянныеКоманды.Добавить(ТвояКоманда.Имя);
    
    // Добавляем кнопку на форму в группу программного интерфейса
    ТвояКнопка = Форма.Элементы.Добавить(ТвояКоманда.Имя, Тип("КнопкаФормы"), Форма.Элементы.ГруппаПрограммныйИнтерфейс);
    ТвояКнопка.ИмяКоманды = ТвояКоманда.Имя;
    ТвояКнопка.ТолькоВоВсехДействиях = Ложь; // Чтобы кнопка была видна сразу на панели
    
КонецПроцедуры

Шаг 4. Обработка нажатия кнопки на клиенте

Обратите внимание, что в поле Действие мы указали "Подключаемый_Команда". Это зарезервированное имя в БСП. При нажатии на такую кнопку управление передается в общий модуль ОтчетыКлиентПереопределяемый, в процедуру ОбработчикКоманды.

Разберем, как обработать нажатие в этом модуле:


Процедура ОбработчикКоманды(Форма, ПараметрыКоманды, РезультатВыполнения) Экспорт
    
    Если ПараметрыКоманды.ИмяКоманды = "МояСпециальнаяКоманда" Тогда
        // Здесь пишем логику или вызываем метод из формы/модуля
        ПоказатьПредупреждение(, "Кнопка нажата!");
    КонецЕсли;
    
КонецПроцедуры

Если логика действия специфична только для конкретного отчета и вы не хотите загромождать общий модуль ОтчетыКлиентПереопределяемый, вы можете вызвать экспортный метод из самой формы отчета (если она у вас все-таки создана) или выполнить универсальное действие, опираясь на тип объекта в параметре Форма.

Почему это не работает сразу? (Важные советы)

Проанализируем типичные причины, по которым кнопка может не появиться:

  1. Кэш метаданных: БСП хранит информацию о том, какие отчеты переопределяют настройки формы, в справочнике «Идентификаторы объектов метаданных». Если вы изменили код в модуле ВариантыОтчетовПереопределяемый, обязательно обновите версию конфигурации или запустите процедуру обновления данных.
  2. Группа размещения: Если вы используете ОтчетыСервер.ВывестиКоманду, убедитесь, что имя группы (например, "ГруппаКоманднаяПанельОтчета") указано верно. В разных версиях БСП имена стандартных групп могут незначительно отличаться. Проверьте имя группы в конфигураторе, открыв общую форму ФормаОтчета.
  3. Экспортный статус: Все процедуры (ОпределитьНастройкиФормы, ПриСозданииНаСервере) в модуле объекта отчета обязательно должны иметь ключевое слово Экспорт.

Дополнительные возможности настройки

Помимо ПриСозданииНаСервере, в структуре Настройки.События можно включить и другие перехватчики:

Использование описанного подхода позволяет сохранять чистоту конфигурации, минимизировать количество уникальных форм и максимально эффективно использовать возможности 1С:Библиотеки стандартных подсистем.

← На главную