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

Отчеты и Аналитика · 13 мин

1С: как открыть отчет программно

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

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

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

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

Какой способ выбрать: обзор вариантов

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

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

Сравнение способов открытия отчета

ОткрытьФорму()

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

ОткрытьОтчет()

Глобальный контекстный метод для типовых отчетов. Проще синтаксис, но меньше возможностей тонкой настройки.

ПолучитьФорму().Открыть()

Основной способ обычного приложения. Дает доступ к объекту формы до её отображения.

Программное формирование без формы

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

Открытие отчета в управляемом приложении

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

Пример простейшего вызова из команды формы документа:

bsl
&НаКлиенте
Процедура ОткрытьОтчетПоПродажам(Команда)
	ОткрытьФорму("Отчет.ПродажиПоКонтрагентам.Форма");
КонецПроцедуры

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

bsl
&НаКлиенте
Процедура ПоказатьРезультат(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
	ОткрытьФорму("Отчет.ПродажиПоКонтрагентам.Форма", ПараметрыФормы);
КонецПроцедуры

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

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

На практике редко нужно просто открыть отчет — чаще требуется показать данные по конкретному контрагенту, периоду или документу. Для отчетов на СКД параметры передаются через структуру Отбор с вложенной структурой, где ключи — имена параметров и полей компоновки.

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

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

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

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

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

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

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

В обычном приложении все проще: ВнешниеОтчеты.Создать(\"C:\\Отчеты\\МойОтчет.erf\").ПолучитьФорму().Открыть(). Учитывайте, что путь к файлу должен быть доступен с того компьютера, где выполняется код — в клиент-серверном варианте путь на клиенте и на сервере различается.

Открытие отчета в обычном приложении

В обычном приложении (толстый клиент) логика другая: сначала получается объект отчета или его форма, затем форма открывается методом Открыть() или ОткрытьМодально(). Модальное открытие блокирует родительское окно до закрытия отчета — это удобно, когда дальнейшая работа пользователя зависит от просмотра результата.

bsl
Процедура КнопкаОтчетНажатие(Элемент)
	ФормаОтчета = Отчеты.ПродажиПоКонтрагентам.ПолучитьФорму();
	ФормаОтчета.Открыть();
КонецПроцедуры

Преимущество ПолучитьФорму() — доступ к реквизитам и экспортным процедурам формы до её отображения. Например, можно присвоить значение реквизиту формы ФормаОтчета.Контрагент = НужныйКонтрагент; и уже потом открыть её. Это старый, но рабочий способ передачи данных в форму.

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

Формирование отчета программно без открытия формы

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

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

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

Для установки отборов при программном формировании работайте с коллекцией Настройки.Отбор.Элементы: добавляйте элемент отбора, указывайте поле компоновки, вид сравнения и значение. Параметры устанавливаются через Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(\"ИмяПараметра\", Значение).

Порядок программного формирования отчета на СКД
  1. 1
    Создайте объект отчета и получите схему компоновки данных через ПолучитьМакет()
  2. 2
    Возьмите настройки по умолчанию или загрузите нужный вариант настроек
  3. 3
    Установите параметры и элементы отбора в настройках
  4. 4
    Выполните компоновщик макета, инициализируйте процессор компоновки
  5. 5
    Выведите результат в табличный документ и проверьте, что он не пустой

Проверка результата и диагностика проблем

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

Контрольные точки

Как проверить результат

Форма отчета открылась
Норма

Форма видна пользователю, нет сообщения об ошибке

Тревожный признак

Ошибка «Форма не найдена» — неверно указано имя формы или отчет внешний

Применился отбор
Норма

В шапке отчета видны установленные отбор и период

Тревожный признак

Отбор пуст — имя поля не совпадает с именем в СКД

Данные сформированы
Норма

Табличный документ содержит строки за ожидаемый период

Тревожный признак

Пустой результат — проверьте параметры периода и права доступа к данным

Программное формирование
Норма

Табличный документ содержит более одной строки

Тревожный признак

Пустой документ — проверьте настройки и инициализацию процессора компоновки

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

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

Ограничения и границы применения

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

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

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

Итог

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

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

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

Как открыть отчет и сразу сформировать его без нажатия кнопки?

Передайте в ОткрытьФорму структуру параметров с ключом СформироватьПриОткрытии = Истина. Этот параметр обрабатывается типовой формой отчета на СКД. Для самописной формы реализуйте формирование в обработчике ПриСозданииНаСервере самостоятельно.

Почему переданный отбор не применяется к отчету?

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

Можно ли открыть отчет из серверной процедуры?

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

Как программно открыть внешний отчет из файла?

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

Как сформировать отчет регламентным заданием и сохранить в файл?

Создайте объект отчета, получите схему компоновки, выполните компоновку макета и выведите результат в табличный документ через процессор вывода. Затем вызовите метод Записать() табличного документа с нужным типом файла — MXL, XLSX или PDF.

Отчет открывается, но данных нет, хотя они точно есть. В чем причина?

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