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