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