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