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