К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как открыть отчет в форме обработки в 1С

Как открыть отчет в форме обработки в 1С: способы через ОткрытьФорму, внешние отчеты, передача параметров, типовые ошибки и проверка результата.

Задача открыть отчет в форме обработки возникает в двух типовых сценариях: разработчик вызывает отчет программно из своей обработки (например, по кнопке «Показать результат»), либо пользователю нужно встроить отчет в интерфейс обработки, чтобы не переключаться между окнами. В обоих случаях используется механизм управляемых форм платформы 1С:Предприятие, а конкретный способ зависит от того, где хранится отчет — в конфигурации, во внешнем файле или в справочнике дополнительных отчетов.

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

Как устроен вызов отчета из обработки

В управляемом приложении любая форма — будь то форма документа, обработки или отчета — открывается единым способом: глобальным методом ОткрытьФорму() или методом ПолучитьФорму() с последующим вызовом Открыть(). Разница в том, что ОткрытьФорму() сразу показывает форму пользователю, а ПолучитьФорму() возвращает объект формы, с которым можно поработать до отображения.

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

Открытие отчета конфигурации из формы обработки

Самый простой случай — отчет входит в состав конфигурации. В модуле формы обработки создайте команду (например, кнопку «ОткрытьОтчет») и в обработчике вызовите ОткрытьФорму() с полным именем формы отчета.

&НаКлиенте

Процедура ОткрытьОтчет(Команда)

ОткрытьФорму("Отчет.ПродажиЗаПериод.Форма");

КонецПроцедуры

Если у отчета несколько форм и нужна конкретная, укажите её имя после точки: Отчет.ПродажиЗаПериод.Форма.ФормаОтчетаРасширенная. Если форма одна (основная), достаточно окончания .Форма — платформа подставит основную форму объекта.

Третьим параметром ОткрытьФорму() можно передать владельца формы — тогда отчет будет связан с обработкой и закроется вместе с ней. Это удобно, когда отчет логически является частью сценария обработки и не должен оставаться открытым после её завершения.

Порядок действий
  1. 1
    Создайте команду формы обработки и перетащите её на форму как кнопку
  2. 2
    В обработчике команды вызовите ОткрытьФорму("Отчет.ИмяОтчета.Форма")
  3. 3
    При необходимости передайте параметры и владельца формы
  4. 4
    Запустите обработку в режиме предприятия и нажмите кнопку
  5. 5
    Убедитесь, что отчет открылся и сформировался с ожидаемыми настройками

Передача параметров и отборов в открываемый отчет

На практике отчет редко открывают «пустым» — обычно из обработки нужно передать период, организацию или другой отбор. Для этого вторым параметром ОткрытьФорму() передается структура с параметрами формы.

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

&НаКлиенте

Процедура ОткрытьОтчет(Команда)

ПараметрыФормы = Новый Структура;

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

ПараметрыФормы.Вставить("Отбор", Новый Структура("Организация", Организация));

ОткрытьФорму("Отчет.ПродажиЗаПериод.Форма", ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

Учтите ограничение: параметр Отбор работает только для полей, доступных в настройках СКД отчета. Если поле не выведено в настройки и не помечено как доступное, отбор по нему будет проигнорирован без сообщения об ошибке — это частая причина «неработающих» параметров.

Открытие внешнего отчета из обработки

Внешний отчет — файл с расширением .erf — не имеет постоянного имени в конфигурации, поэтому перед открытием его нужно подключить. Для этого служит метод ВнешниеОтчеты.Подключить(), который вызывается на сервере и возвращает временное имя отчета.

&НаСервере

Функция ПодключитьВнешнийОтчет(АдресХранилища)

Возврат ВнешниеОтчеты.Подключить(АдресХранилища, "МойОтчет", Ложь);

КонецФункции

&НаКлиенте

Процедура ОткрытьВнешнийОтчет(Команда)

ИмяОтчета = ПодключитьВнешнийОтчет(АдресВоВременномХранилище);

ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма");

КонецПроцедуры

Файл внешнего отчета сначала помещается во временное хранилище (например, через НачатьПомещениеФайла()), а на сервер передается адрес хранилища, а не путь к файлу — в клиент-серверном режиме у сервера нет доступа к диску клиента. Третий параметр Подключить() отвечает за безопасный режим; для недоверенных файлов его следует оставлять включенным.

Вывод результата отчета прямо в форме обработки

Иногда открывать отдельное окно отчета не нужно — результат должен отображаться внутри самой обработки, например на закладке «Результат». В этом случае форму отчета открывать не требуется: в форму обработки добавляется реквизит типа ТабличныйДокумент, а отчет формируется программно через компоновщик СКД.

Порядок формирования: получить схему компоновки данных из отчета (Отчеты.ИмяОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных")), инициализировать компоновщик настроек, установить параметры и отборы, затем через процессор компоновки вывести результат в табличный документ. Весь код выполняется на сервере.

&НаСервере

Процедура СформироватьНаСервере()

СхемаКД = Отчеты.ПродажиЗаПериод.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Настройки = СхемаКД.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Результат.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры

Реквизит Результат (тип ТабличныйДокумент) перетаскивается на форму — после формирования пользователь увидит отчет прямо в окне обработки. Такой подход требует больше кода, но дает полный контроль: можно формировать несколько отчетов на одну форму, добавлять свои кнопки печати и обработку расшифровки.

Сравнение вариантов

ОткрытьФорму отчета

Быстро, минимум кода, штатные настройки и расшифровка. Ограничение: отчет открывается отдельным окном, вне формы обработки.

Программный вывод СКД в ТабличныйДокумент

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

Внешний отчет через Подключить()

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

Типичные ошибки и их устранение

Самая частая ошибка — «Форма не найдена» при вызове ОткрытьФорму(). Причины: опечатка в имени отчета (имя проверяется по конфигуратору, а не по синониму), попытка открыть внешний отчет без предварительного подключения, либо указание синонима вместо имени объекта метаданных.

Вторая группа проблем связана с контекстом выполнения. Метод ВнешниеОтчеты.Подключить() доступен только на сервере — вызов в клиентской процедуре приведет к ошибке. Аналогично передача пути к файлу вместо адреса временного хранилища не сработает в клиент-серверном режиме.

Третья типичная ситуация — отчет открывается, но параметры не применяются. Проверьте, что поля отбора доступны в настройках СКД, типы значений совпадают, а у формы отчета не переопределен обработчик ПриОткрытии(), игнорирующий стандартные параметры.

Типичные ошибки
01
Указание синонима отчета вместо имени метаданных — форма не находится, хотя отчет виден в меню
02
Вызов ВнешниеОтчеты.Подключить() на клиенте — ошибка выполнения, метод доступен только на сервере
03
Передача строки вместо ссылки в отбор — параметр молча игнорируется
04
Открытие внешнего отчета по имени файла без Подключить() — платформа не знает такого объекта
05
Формирование на клиенте тяжелого отчета — зависание интерфейса, выносите формирование на сервер

Проверка результата и ограничения

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

Контрольные точки: отчет открывается без ошибок, отборы и период соответствуют переданным из обработки, при закрытии обработки связанные формы отчетов ведут себя ожидаемо. Если отчет формируется внутри обработки — убедитесь, что повторное формирование очищает предыдущий результат и не дублирует данные.

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

Итог

Что важно запомнить

Отчет конфигурации открывается через ОткрытьФорму("Отчет.Имя.Форма", Параметры), внешний — после ВнешниеОтчеты.Подключить() на сервере. Параметры и отборы передаются структурой, а для вывода результата внутри обработки используется программная компоновка СКД в ТабличныйДокумент.

Частые вопросы

Можно ли открыть отчет модально, чтобы заблокировать обработку?

Да, используйте метод ОткрытьФормуМодально() или передайте в ОткрытьФорму() параметр РежимОткрытияОкна со значением блокировки окна владельца. Учтите, что модальные вызовы не рекомендуются и в веб-клиенте могут быть ограничены.

Как открыть отчет с конкретным вариантом настроек?

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

Почему отчет открывается, но не формируется автоматически?

Стандартная форма отчета формирует результат при открытии только если передан параметр СформироватьПриОткрытии = Истина либо это задано в настройках самого отчета. Добавьте этот параметр в структуру при вызове ОткрытьФорму().

Можно ли открыть форму настроек отчета, а не сам отчет?

Да, у отчета есть отдельная форма настроек: ОткрытьФорму("Отчет.ИмяОтчета.ФормаНастроек", Параметры, Владелец). В параметрах обычно передают ключ текущих настроек, чтобы форма открыла их для редактирования.

Как открыть отчет из обработки в обычном (неуправляемом) приложении?

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