Как программно передать параметры и отборы в отчет на базе СКД

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

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

Постановка задачи и анализ механизмов СКД

Представим ситуацию: у нас есть стандартный отчет «Продажи», созданный на СКД. Нам нужно вызвать его из общей формы или формы документа, передав туда конкретный период и организацию. Основная сложность заключается в том, что в управляемых формах 1С 8.3 настройки компоновки данных разделены на несколько уровней: основные настройки и пользовательские настройки. Если мы установим значение только в основных настройках, пользователь может не увидеть изменений в интерфейсе или они будут перекрыты значениями по умолчанию.

Способ 1. Простая установка параметра в обычных формах

Если вы работаете в режиме обычного приложения (или пишете код внутри модуля формы отчета), самый быстрый способ получить доступ к параметрам — это использование объекта КомпоновщикНастроек. Рассмотрим, как найти и установить значение параметра «Период»:


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

Этот код ищет параметр по его имени, заданному в схеме компоновки, устанавливает значение и, что очень важно, включает флаг Использование. Без этого флага система проигнорирует установленное значение.

Способ 2. Передача параметров через «ОткрытьФорму» (Управляемые формы)

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


// Подготовим структуру для открытия
ПараметрыОткрытия = Новый Структура;

// Создадим объект отчета для доступа к компоновщику
ОтчетОбъект = Отчеты.НазваниеВашегоОтчета.Создать();
КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
Настройки = КомпоновщикНастроек.Настройки;

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

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

// 2. Добавление отбора (например, по Организации)
ОтборОрганизация = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ОтборОрганизация;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = СсылкаНаОрганизацию;
ЭлементОтбора.Использование = Истина;

// Помещаем настройки в параметры открытия
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);

ОткрытьФорму("Отчет.НазваниеВашегоОтчета.Форма", ПараметрыОткрытия);

Разберем по шагам: мы создаем временный объект отчета, чтобы добраться до его КомпоновщикаНастроек. Устанавливаем значения и обязательно проверяем ИдентификаторПользовательскойНастройки. Если он заполнен, значит, этот параметр выведен пользователю на форму, и нам нужно обновить его и в коллекции ПользовательскиеНастройки. В конце мы передаем эти коллекции в метод ОткрытьФорму.

Способ 3. Программное формирование отчета в Табличный Документ

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


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

При использовании этого метода важно помнить, что за вывод отвечает ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Мы сначала создаем макет компоновки, затем инициализируем процессор и выводим результат в объект типа ТабличныйДокумент.

Использование функций БСП (Библиотеки стандартных подсистем)

В современных конфигурациях (УТ 11, ERP, БП 3.0) многие рутинные операции с СКД уже автоматизированы. Выясним, как можно сократить код с помощью модуля КомпоновкаДанныхКлиентСервер. Рассмотрим пример добавления отбора:


// Использование типовой процедуры БСП для добавления отбора
КомпоновкаДанныхКлиентСервер.ДобавитьОтбор(
    НастройкиКомпоновки, 
    Новый ПолеКомпоновкиДанных("Склад"), 
    ВыбранныйСклад, 
    ВидСравненияКомпоновкиДанных.Равно, 
    Истина, 
    Новый Структура("ВПользовательскиеНастройки, ЗаменятьСуществующий", Истина, Истина)
);

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

Важные нюансы и решение проблем

Рассмотрим несколько типичных проблем, с которыми сталкиваются разработчики:

  1. Отчет открывается, но не формируется автоматически. Убедитесь, что в параметрах открытия передан ключ "СформироватьПриОткрытии" = Истина. Также проверьте свойство формы отчета АвтоотображениеСостояния. Если установлено «Авто», попробуйте изменить на «Не отображать», чтобы избежать лишних вопросов системы пользователю.
  2. Значения параметров сбрасываются. Это происходит, когда у пользователя есть сохраненные ранее настройки данного отчета. Система сначала применяет ваши программные настройки, а затем «накатывает» поверх них сохраненные настройки пользователя. Чтобы этого избежать, используйте параметр КлючНазначенияИспользования или очищайте пользовательские настройки перед установкой своих.
  3. Неверный формат хранилища данных. Если вы пытаетесь открыть файл отчета (.erf), созданный в более новой версии платформы или имеющий специфическую структуру, вы можете получить эту ошибку. Всегда проверяйте совместимость версий платформы (например, 8.2 и 8.3 имеют разные механизмы работы с формами).

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

← На главную