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