Как программно открыть внешний отчет, находящийся на сервере 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

При попытке вызвать метод ВнешниеОтчеты.Подключить("d:\report1.erf") прямо на сервере система выдает ошибку имени файла. Разберем, почему возникает эта ошибка и как правильно реализовать открытие такого отчета на клиенте.

Причина возникновения ошибки

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

  1. Навигационную ссылку на реквизит объекта информационной базы (типа ХранилищеЗначения).
  2. Адрес во временном хранилище (строку вида e1cib/tempstorage/...).

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

Решение: Подключение отчета через временное хранилище

Рассмотрим пошагово алгоритм решения этой задачи.

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

После получения имени отчета на стороне клиента выполняется вызов процедуры ОткрытьФорму().

Разберем практический пример кода для управляемой формы:


&НаСервере
Функция ПодключитьВнешнийОтчетНаСервере(ПутьКФайлуНаСервере)
    
    // 1. Читаем файл отчета с диска сервера в двоичные данные
    ДвоичныеДанныеОтчета = Новый ДвоичныеДанные(ПутьКФайлуНаСервере);
    
    // 2. Помещаем двоичные данные во временное хранилище
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОтчета, ЭтаФорма.УникальныйИдентификатор);
    
    // 3. Регистрируем внешний отчет и получаем его внутреннее имя
    ИмяОтчета = ВнешниеОтчеты.Подключить(АдресХранилища);
    
    Возврат ИмяОтчета;
    
КонецФункции

&НаКлиенте
Процедура ОткрытьВнешнийОтчет(Команда)
    
    ПутьКФайлу = "d:\report1.erf"; // Путь к файлу на сервере
    
    // Получаем зарегистрированное имя отчета с сервера
    ИмяОтчета = ПодключитьВнешнийОтчетНаСервере(ПутьКФайлу);
    
    // Открываем форму отчета на клиенте
    Если Не ПустаяСтрока(ИмяОтчета) Тогда
        ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма");
    КонецЕсли;
    
КонецПроцедуры

Настройка параметров безопасности

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

  1. Безопасный режим (3-й параметр): По умолчанию установлен в Истина. В безопасном режиме внешнему отчету запрещены доступ к файловой системе сервера, выполнение внешних команд, работа с COM-объектами и внешними компонентами. Если подключаемый отчет использует подобные операции, при подключении передайте значение Ложь: ИмяОтчета = ВнешниеОтчеты.Подключить(АдресХранилища, , Ложь);
  2. Защита от опасных действий (4-й параметр): Контролирует выдачу предупреждения пользователю об исполнении внешнего кода. При программном вызове его также можно при необходимости отключить передачей значения Ложь: ИмяОтчета = ВнешниеОтчеты.Подключить(АдресХранилища, , Ложь, Ложь);

Альтернативный вариант: Фоновое/Серверное формирование отчета без открытия формы

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


&НаСервере
Процедура СформироватьОтчетНаСервере()
    
    ПутьКФайлу = "d:\report1.erf";
    
    // Метод Создать принимает прямой путь к файлу на сервере
    ОбъектОтчет = ВнешниеОтчеты.Создать(ПутьКФайлу);
    
    // Далее можно работать с объектом отчета (заполнять настройки, компоновать макет и т.д.)
    
КонецПроцедуры

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

← На главную