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