Как программно открыть отчет с установленными отборами и автоматическим формированием

Программист 1С v8.3 (Управляемые формы)
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача: вызвать отчет непосредственно из формы документа или справочника, при этом отчет должен сразу открыться с данными, отфильтрованными по текущему объекту, и сформироваться автоматически, чтобы пользователю не приходилось нажимать лишние кнопки. В этой статье мы подробно разберем, как реализовать этот функционал, используя механизмы управляемых форм и Систему компоновки данных (СКД).

Метод 1: Использование параметров открытия формы (Стандартный механизм платформы)

Самый простой и правильный способ реализации данной задачи — передача специальной структуры параметров в функцию ОткрытьФорму. Платформа 1С обладает встроенными механизмами, которые анализируют переданные параметры и применяют их к настройкам отчета до того, как форма будет отображена пользователю.

Рассмотрим пошагово, как это реализовать. Предположим, у нас есть кнопка на форме, при нажатии на которую должен открыться отчет ХитрыйОтчет с фильтром по текущей номенклатуре.

Для начала проанализируем код клиентской процедуры и серверной функции, подготавливающей параметры:


&НаКлиенте
Процедура КомандаОткрытьОтчет(Команда)
    
    // Получаем структуру параметров на сервере
    ПараметрыОтчета = ПолучитьПараметрыДляОтчета();
    
    // Открываем форму отчета, передавая подготовленные параметры
    // Четвертый параметр (Уникальность) позволяет открывать разные копии отчета для разных товаров
    ОткрытьФорму("Отчет.ХитрыйОтчет.Форма", ПараметрыОтчета, ЭтотОбъект, "ОтчетПоНоменклатуре_" + Объект.Ссылка.УникальныйИдентификатор());
    
КонецПроцедуры

&НаСервере
Функция ПолучитьПараметрыДляОтчета()
    
    // Создаем структуру для отборов
    СтруктураОтбора = Новый Структура;
    // Ключ должен в точности совпадать с путем к данным в СКД отчета
    СтруктураОтбора.Вставить("Номенклатура", Объект.Ссылка);
    
    // Формируем общую структуру параметров формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор",                   СтруктураОтбора);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыФормы.Вставить("КлючВарианта",            "Основной"); // Указываем имя варианта отчета
    
    Возврат ПараметрыФормы;
    
КонецФункции

Разберем ключевые параметры, которые мы передали:

  1. Отбор — это структура, где ключом является имя поля в схеме компоновки данных (например, Номенклатура), а значением — конкретная ссылка, по которой мы хотим отфильтровать данные. Важно: если поле находится внутри группы или является реквизитом другого поля, путь нужно указывать через точку, например, Номенклатура.Бренд.
  2. СформироватьПриОткрытии — логический параметр. Если установить его в значение Истина, платформа автоматически инициирует компоновку результата при открытии формы.
  3. КлючВарианта — определяет, какой именно вариант настроек отчета будет загружен. Если этот параметр не указать, загрузится вариант по умолчанию.

Метод 2: Использование возможностей Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация разработана на базе БСП (как большинство типовых решений: УТ 11, ERP, КА 2, БП 3.0), рекомендуется использовать программный интерфейс общих модулей библиотеки. Это обеспечит более корректную интеграцию с подсистемой вариантов отчетов.

Проанализируем ситуацию, когда необходимо программно добавить отбор через специализированные методы:


&НаКлиенте
Процедура ОткрытьОтчетЧерезБСП(Команда)
    
    ПараметрыОткрытия = Новый Структура;
    // Передаем признак автоматического формирования
    ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
    
    // Получаем форму отчета, но пока не открываем её
    ФормаОтчета = ПолучитьФорму("Отчет.НашОтчет.Форма", ПараметрыОткрытия);
    
    // Используем методы БСП для корректной установки отбора в компоновщике настроек
    // Это гарантирует, что отбор появится в пользовательских настройках на форме
    БухгалтерскиеОтчетыКлиентСервер.ДобавитьОтбор(ФормаОтчета.Отчет.КомпоновщикНастроек, "Номенклатура", Объект.Ссылка);
    
    // Теперь открываем уже настроенную форму
    ОткрытьФорму(ФормаОтчета);
    
КонецПроцедуры

Обратите внимание на использование метода ДобавитьОтбор. Он позволяет не просто передать структуру, а модифицировать КомпоновщикНастроек формы. Это дает пользователю возможность увидеть установленный фильтр в шапке отчета и, при необходимости, изменить его.

Особенности автоматического формирования (СкомпоноватьРезультат)

Иногда разработчики сталкиваются с ошибкой "Недостаточно параметров" при попытке вызвать метод СкомпоноватьРезультат(). Выясним причину этой проблемы. Метод СкомпоноватьРезультат() у формы отчета на управляемых формах ожидает, что система понимает, куда именно выводить результат (обычно в табличный документ).

Если вы хотите, чтобы отчет сформировался "сам", лучше всего полагаться на параметр СформироватьПриОткрытии. Если же форма отчета кастомизирована (создана вручную и не является стандартной), вам потребуется в модуле формы отчета в обработчике ПриОткрытии или ПриСозданииНаСервере прописать явный вызов формирования, анализируя параметры открытия.

Пример обработки в форме отчета:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передан ли параметр автоматического формирования
    Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии Тогда
        // Логика формирования отчета на сервере
    КонецЕсли;
    
КонецПроцедуры

Работа с фиксированными настройками

Если ваша задача — установить отбор так, чтобы пользователь не мог его удалить или изменить в процессе работы с отчетом, следует использовать ФиксированныеНастройки. Это свойство КомпоновщикаНастроек, которое накладывается "сверху" всех пользовательских фильтров.

Рассмотрим, как передать такие настройки при открытии:


&НаСервере
Функция ПодготовитьФиксированныеНастройки()
    
    Схема = Отчеты.ХитрыйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = Схема.НастройкиПоУмолчанию;
    
    // Очищаем существующие отборы в фиксированных настройках, если нужно
    Настройки.Отбор.Элементы.Очистить();
    
    // Добавляем новый элемент отбора
    ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Номенклатура");
    ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Объект.Ссылка;
    ЭлементОтбора.Использование  = Истина;
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    
    Возврат ПараметрыФормы;
    
КонецФункции

Важные рекомендации и частые ошибки

При реализации данного функционала следует учитывать несколько важных моментов:

Таким образом, мы рассмотрели различные способы программного управления отчетами. Использование структуры параметров при вызове ОткрытьФорму является наиболее универсальным и эффективным методом для большинства задач в среде 1С:Предприятие 8.3.

← На главную