Как передать параметр в форму отчета БСП без создания собственных форм?

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

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

Давайте подробно разберем, как реализовать этот механизм, сохранив чистоту конфигурации и не вмешиваясь в стандартные формы БСП.

Основные принципы передачи параметров

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

Реализация через общие модули

Для удобства работы рекомендуется вынести логику подготовки настроек в отдельный общий модуль. Это позволит использовать один и тот же код для разных отчетов. Рассмотрим пошагово, как это сделать.

Первым делом нам потребуются функции для извлечения настроек из объекта отчета. Для этого создадим функции в модуле, доступном на сервере (например, СерверВызов):


Функция СКДНастройки(Отчет) Экспорт
    ОбъектОтчета = Отчеты[Отчет].Создать();
    Возврат ОбъектОтчета.КомпоновщикНастроек.Настройки;
КонецФункции

Функция СКДПользовательскиеНастройки(Отчет) Экспорт
    ОбъектОтчета = Отчеты[Отчет].Создать();
    Возврат ОбъектОтчета.КомпоновщикНастроек.ПользовательскиеНастройки;
КонецФункции

Функция СКДФиксированныеНастройки(Отчет) Экспорт
    ОбъектОтчета = Отчеты[Отчет].Создать();
    Возврат ОбъектОтчета.КомпоновщикНастроек.ФиксированныеНастройки;
КонецФункции

Процедура установки параметра в настройки

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


Процедура СКДНастройкиУстановитьПараметр(Настройки, Параметр, Значение, Использовать = Истина) Экспорт
    Если ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных") Тогда
        Элементы = Настройки.ПараметрыДанных.Элементы;
    Иначе
        Элементы = Настройки.Элементы;
    КонецЕсли;

    Для каждого Пар Из Элементы Цикл
        Если "" + Пар.Параметр = Параметр Тогда
            Пар.Использование = Использовать;
            Пар.Значение = Значение;
            Возврат;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Открытие формы отчета с параметрами

Теперь соберем все воедино в процедуре открытия формы. Мы будем формировать структуру параметров, включающую ПользовательскиеНастройки и ФиксированныеНастройки, и передавать их при вызове стандартной формы отчета.


Процедура СКДОтчетОткрыть(ИмяОтчета, ПараметрыОтчета) Экспорт
    Настройки = СерверныйМодуль.СКДНастройки(ИмяОтчета);
    ПользовательскиеНастройки = СерверныйМодуль.СКДПользовательскиеНастройки(ИмяОтчета);
    ФиксированныеНастройки = СерверныйМодуль.СКДФиксированныеНастройки(ИмяОтчета);

    Для каждого Параметр Из ПараметрыОтчета Цикл
        СКДНастройкиУстановитьПараметр(Настройки, Параметр.Ключ, Параметр.Значение);
        СКДНастройкиУстановитьПараметр(ПользовательскиеНастройки, Параметр.Ключ, Параметр.Значение);
        СКДНастройкиУстановитьПараметр(ФиксированныеНастройки, Параметр.Ключ, Параметр.Значение);
    КонецЦикла;

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыФормы.Вставить("ФиксированныеНастройки", ФиксированныеНастройки);
    ПараметрыФормы.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
    ПараметрыФормы.Вставить("Настройки", Настройки);

    ОткрытьФорму("Отчет." + ИмяОтчета + ".Форма", ПараметрыФормы, , ТекущаяДата(), , , , РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры

Как использовать это в коде

Теперь вызов отчета из другой формы (например, при нажатии кнопки в списке документов) становится максимально лаконичным и чистым:


&НаКлиенте
Процедура НайтиДелаАрхива(Команда)
    ИмяОтчета = "МестоположениеДел";
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("Ссылка", Элементы.Список.ТекущиеДанные.Ссылка);
    
    МойОбщийМодуль.СКДОтчетОткрыть(ИмяОтчета, ПараметрыОтчета);
КонецПроцедуры

Почему этот способ эффективен

  1. Отсутствие модификаций: Мы не меняем конфигурацию и не создаем новые формы, что облегчает обновление типовой конфигурации в будущем.
  2. Гибкость: Использование ПользовательскихНастроек позволяет пользователю после открытия отчета увидеть переданные нами значения и при необходимости скорректировать их вручную.
  3. Автоматизация: Параметр СформироватьПриОткрытии заставляет отчет сразу выполнить расчет, что экономит время пользователя на лишние клики.
  4. Универсальность: Созданный механизм подходит для любого отчета на СКД, достаточно передать правильное имя отчета и структуру параметров.

Используя данный подход, вы сможете эффективно интегрировать отчеты в бизнес-процессы системы, обеспечивая при этом высокую скорость работы и удобство сопровождения кода.

← На главную