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