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