В процессе разработки в 1С часто возникает задача вызвать один объект из другого. Например, может потребоваться открыть форму отчета на основе данных из документа, обработки или, как в нашем случае, из формы регламентного задания. На первый взгляд, задача кажется простой, но есть важный нюанс, связанный с правильным получением объекта формы.
Рассмотрим типовую ошибку и несколько правильных способов ее решения. Проанализируем ситуацию, когда необходимо не просто открыть форму, но и передать в нее параметры или даже сформировать отчет полностью программно, без участия пользователя.
Основная ошибка многих начинающих разработчиков заключается в попытке получить форму отчета напрямую из менеджера отчетов. Код, который не сработает, выглядит примерно так:
// Этот код вызовет ошибку
ИмяОтчета = "МойОтчет";
Форма = Отчеты[ИмяОтчета].ПолучитьФорму("ФормаОтчета");
Форма.Открыть();
Такой подход неверен, потому что метод ПолучитьФорму() вызывается у экземпляра объекта, а не у его менеджера (Отчеты.МойОтчет). Менеджер управляет всей совокупностью отчетов данного вида, но не является конкретным отчетом. Чтобы получить форму, нужно сначала создать этот самый конкретный экземпляр.
Это наиболее универсальный и понятный метод, который отлично демонстрирует объектную модель 1С. Разберем его по шагам.
Создать(), применяемый к менеджеру нужного отчета. В результате мы получаем переменную, которая ссылается на полноценный объект отчета.
ПолучитьФорму(). В качестве параметра обычно передается имя формы, например, "ФормаОтчета".
Открыть(), чтобы показать ее пользователю.
Посмотрим на пример работающего кода, который решает исходную задачу:
// Имя отчета можно получить динамически или задать строкой
ИмяОтчета = "МойСуперОтчет";
// Шаг 1: Создаем объект отчета
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
// Шаг 2: Получаем его основную форму
// "ФормаОтчета" - стандартное имя, но может быть и другим
Форма = ОтчетОбъект.ПолучитьФорму("ФормаОтчета");
// Шаг 3: Открываем форму для пользователя
Форма.Открыть();
Важно: Этот способ дает вам полный контроль над объектом отчета (ОтчетОбъект) и его формой (Форма) еще до ее открытия. Вы можете изменять реквизиты отчета, его настройки СКД и другие параметры.
В управляемых формах существует более современный и лаконичный способ открытия форм — глобальная процедура ОткрытьФорму(). Она позволяет открыть форму по ее полному имени, без необходимости предварительно создавать объект.
Этот метод особенно удобен, когда вам нужно просто открыть форму и, возможно, передать в нее начальные параметры.
// Полное имя формы отчета
ИмяФормы = "Отчет.МойСуперОтчет.Форма.ФормаОтчета";
// Просто открываем форму
ОткрытьФорму(ИмяФормы);
Этот код выполнит ту же задачу, что и в первом решении, но выглядит компактнее. Однако он не предоставляет прямого доступа к объекту отчета до открытия формы.
Чаще всего отчет нужно открыть не просто так, а с уже установленными отборами или параметрами (например, с конкретным контрагентом или периодом). Оба рассмотренных способа позволяют это сделать.
Для передачи параметров используется объект типа Структура.
Передача параметров с `ОткрытьФорму()`:
Это самый распространенный сценарий. Параметры передаются вторым аргументом в процедуру.
// Готовим структуру с параметрами
ПараметрыДляФормы = Новый Структура;
ПараметрыДляФормы.Вставить("КонтрагентОтбор", НужныйКонтрагент);
ПараметрыДляФормы.Вставить("КлючВарианта", "ВариантПоПродажам");
// Открываем форму, передавая параметры
ИмяФормы = "Отчет.МойСуперОтчет.Форма.ФормаОтчета";
ОткрытьФорму(ИмяФормы, ПараметрыДляФормы);
В самой форме отчета эти параметры нужно обработать в событии ПриСозданииНаСервере. Они будут доступны в свойстве ЭтаФорма.Параметры.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, был ли передан параметр КонтрагентОтбор
Если Параметры.Свойство("КонтрагентОтбор") Тогда
// Устанавливаем значение отбора в СКД
// Примерный код для установки отбора
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Параметры.КонтрагентОтбор;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Иногда отчет не нужно показывать пользователю, а требуется, например, сформировать его и отправить по почте в виде файла PDF или Excel. В этом случае мы снова используем "классический" способ с созданием объекта отчета, но вместо открытия формы будем программно выполнять все этапы компоновки данных.
Это более сложный процесс, но он дает максимальную гибкость. Проанализируем основные шаги.
Примерный код может выглядеть так:
ОтчетОбъект = Отчеты.МойСуперОтчет.Создать();
// Устанавливаем параметр отчета (например, дату)
ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОтчета", ТекущаяДата());
// Инициализируем необходимые объекты
СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьСхемуКомпоновкиДанных();
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
// Выполняем компоновку макета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
// Запускаем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных();
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Готовим табличный документ для результата
ТабличныйДокументРезультат = Новый ТабличныйДокумент;
// Выводим результат
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент();
ПроцессорВывода.УстановитьДокумент(ТабличныйДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь в переменной ТабличныйДокументРезультат находится готовый отчет
// Его можно сохранить в файл или отправить по почте
Таким образом, мы рассмотрели несколько способов взаимодействия с отчетами из кода: от простого открытия формы до полного программного формирования. Выбор метода зависит от вашей конкретной задачи.