В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), пользователи привыкли к удобному интерфейсу, где все связанные с объектом отчеты собраны в едином подменю «Отчеты». Однако при разработке внешних отчетов программисты часто сталкиваются с тем, что их отчет попадает в общее окно «Дополнительные отчеты», что неудобно для конечного пользователя. В этой статье мы подробно разберем, как заставить внешний отчет отображаться в контекстном меню конкретного документа или справочника.
Рассмотрим ситуацию: у нас есть документ, например, РеализацияТоваровУслуг, и мы создали внешний отчет, который должен анализировать данные именно этого документа. Мы хотим, чтобы пользователь, находясь в форме списка или форме документа, нажал кнопку «Отчеты» и увидел там наш отчет наравне со встроенными в конфигурацию. Для реализации этой задачи нам не потребуется вносить изменения в саму конфигурацию — достаточно правильно настроить модуль внешнего отчета.
Основная логика взаимодействия внешнего объекта и системы БСП заложена в функции СведенияОВнешнейОбработке, которая располагается в модуле объекта внешнего отчета. Рассмотрим ключевой момент: параметр Вид. Многие по привычке указывают там значение ДополнительныйОтчет, но именно это и является ошибкой, если мы хотим видеть отчет в подменю.
Выясним причину: когда БСП видит вид ДополнительныйОтчет, она классифицирует его как глобальный отчет, который вызывается из разделов интерфейса. Чтобы отчет стал "контекстным", ему нужно назначить вид Отчет.
Проанализируем пример кода для функции регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыКлиентСервер.ПараметрыРегистрацииОтчета();
// Важнейший момент: устанавливаем вид "Отчет"
ПараметрыРегистрации.Вид = ДополнительныеОтчетыКлиентСервер.ВидОтчетаОтчет();
// Или можно просто строкой: ПараметрыРегистрации.Вид = "Отчет";
ПараметрыРегистрации.Наименование = "Анализ продаж по документу (внешний)";
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Указываем объекты, в которых появится кнопка
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПокупателя");
// Заполнение таблицы команд
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Отчет по текущему документу";
НоваяКоманда.Идентификатор = "ОсновнаяКоманда";
НоваяКоманда.Использование = ДополнительныеОтчетыКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Чтобы отчет «понимал», к каким объектам метаданных он привязан, мы используем массив Назначение. Если оставить этот массив пустым, система не сможет определить, в каких именно формах нужно выводить команду вызова вашего отчета. Обратите внимание, что указывать нужно полное имя объекта метаданных, как оно задано в конфигураторе.
Разберем подробнее, что происходит внутри системы: БСП при загрузке внешнего отчета анализирует этот массив и создает записи в регистре сведений, который отвечает за формирование динамических меню. Если вы позже захотите добавить еще один документ в список назначения, вам придется обновить внешний отчет в справочнике «Дополнительные отчеты и обработки».
Для отчетов в подменю наиболее распространенным типом команды является ОткрытиеФормы. Посмотрим на настройки команды:
ДополнительныеОтчетыКлиентСервер.ТипКомандыОткрытиеФормы() указывает системе, что при нажатии на кнопку нужно просто открыть основную форму отчета.Когда пользователь вызывает отчет из документа, он ожидает, что отчет сформируется именно по этому документу. БСП передает параметры контекста в открываемую форму. Рассмотрим, как их получить в модуле формы внешнего отчета.
В процедуре ПриСозданииНаСервере формы отчета мы можем проанализировать структуру Параметры. Обычно БСП передает параметр ОбъектыНазначения, который содержит массив ссылок на выбранные объекты (или одну ссылку, если вызов из формы документа).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") Тогда
// Массив ссылок на документы, из которых вызван отчет
МассивСсылок = Параметры.ОбъектыНазначения;
Если МассивСсылок.Количество() > 0 Тогда
// Устанавливаем значение параметра СКД или отбор
ЗначениеПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДокументСсылка");
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = МассивСсылок[0];
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
После того как код написан и файл сохранен, выполним следующие шаги:
СведенияОВнешнейОбработке.Даже если всё сделано правильно, иногда кнопка не появляется сразу. Рассмотрим основные причины:
Отчет) актуален для версий БСП 2.4, 3.0 и выше. В очень старых конфигурациях механизмы могут отличаться.Если вы хотите увидеть «эталонную» реализацию, рекомендуется заглянуть в демонстрационную конфигурацию БСП. Там в справочнике «Дополнительные отчеты и обработки» всегда присутствует элемент с наименованием вида «Пример внешнего отчета (контекстный)». Выгрузив его в файл, вы сможете изучить модуль объекта и увидеть все тонкости настройки команды вызова.
Таким образом, использование вида "Отчет" вместо "ДополнительныйОтчет" является ключом к бесшовной интеграции ваших внешних разработок в интерфейс типовых конфигураций. Это значительно повышает удобство работы пользователей и делает вашу систему более профессиональной и целостной.