Как программно открыть форму внешнего отчета из внешней обработки в 1С 8.3?

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

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

Различие между методами Создать() и Подключить()

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

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

Шаг 1. Помещение файла во временное хранилище

Работа с внешними файлами в управляемом приложении всегда начинается на клиенте. Мы не можем передать путь к файлу на диске (например, C:\Reports\Report.erf) напрямую в серверный метод, так как у сервера может не быть доступа к локальным дискам пользователя. Поэтому первым делом мы должны передать двоичные данные файла во временное хранилище.

Рассмотрим современный асинхронный способ (рекомендуется для версий 8.3.15 и выше), который не блокирует интерфейс и корректно работает в веб-клиенте:


&НаКлиенте
Асинх Процедура ЗагрузитьИОткрытьОтчет(Команда)
    
    // Подготавливаем описание файла
    ОписаниеФайла = Новый ОписаниеПередаваемогоФайла("C:\МоиОтчеты\ВнешнийОтчет.erf");
    МассивФайлов = Новый Массив;
    МассивФайлов.Добавить(ОписаниеФайла);
    
    // Помещаем файл во временное хранилище
    РезультатЗагрузки = Ждать ПоместитьФайлыНаСерверАсинх(,,, МассивФайлов);
    
    Если РезультатЗагрузки.Количество() > 0 Тогда
        АдресХранилища = РезультатЗагрузки[0].Адрес;
        ПодключитьИОткрытьНаСервере(АдресХранилища);
    КонецЕсли;

КонецПроцедуры

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

Шаг 2. Подключение отчета на сервере

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


&НаСервере
Функция ПодключитьОтчетНаСервере(АдресХранилища)
    
    // Генерируем уникальное имя для подключения, чтобы избежать конфликтов в сеансе
    ИмяПодключения = "ВнешнийОтчет_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
    
    // Регистрируем отчет в системе
    // Параметры: Адрес, Имя, БезопасныйРежим
    ВозвращаемоеИмя = ВнешниеОтчеты.Подключить(АдресХранилища, ИмяПодключения, Ложь);
    
    Возврат ВозвращаемоеИмя;
    
КонецФункции

Обратите внимание на параметр БезопасныйРежим. Если установить его в Истина (значение по умолчанию), отчет не сможет выполнять потенциально опасные действия: записывать файлы на диск, работать с COM-объектами или отправлять HTTP-запросы. Если ваш отчет использует такие функции, передавайте Ложь.

Шаг 3. Открытие формы на клиенте

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


&НаКлиенте
Процедура ПодключитьИОткрыть(АдресХранилища)
    
    // 1. Подключаем на сервере
    ИмяОтчета = ПодключитьОтчетНаСервере(АдресХранилища);
    
    // 2. Открываем форму
    // Путь к форме имеет формат: ВнешнийОтчет.[Имя].Форма
    ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма");
    
КонецПроцедуры

Передача параметров и автоматическое формирование

Зачастую просто открыть форму недостаточно — нужно сразу установить период или другие настройки. Рассмотрим подробнее, как передать параметры в открываемую форму внешнего отчета. Мы можем передать структуру параметров третьим аргументом в функцию ОткрытьФорму.


&НаКлиенте
Процедура ОткрытьСПараметрами(ИмяОтчета)
    
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    
    // Пример передачи пользовательских настроек для СКД
    // Это позволит отчету открыться уже с заполненными фильтрами
    ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма", ПараметрыОтчета);
    
КонецПроцедуры

Важные нюансы и рекомендации

Разобравшись с основным механизмом, обратим внимание на критические моменты, которые могут повлиять на стабильность работы системы:

  1. Расширения файлов: Помните, что для отчетов используется менеджер ВнешниеОтчеты и расширение .erf, а для обработок — ВнешниеОбработки и .epf. Они не взаимозаменяемы.
  2. Уникальность имен: При вызове Подключить() всегда старайтесь использовать уникальное имя (например, на базе УникальныйИдентификатор). Если два пользователя или два разных процесса попытаются подключить разные файлы под одним и тем же коротким именем в одном сеансе, возникнет ошибка.
  3. Очистка ресурсов: Каждое подключение занимает определенный объем памяти в сеансе. Хотя явного метода "Отключить" не существует, система очистит эти данные при завершении сеанса пользователя.
  4. Использование БСП: Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), выясним, что правильнее использовать методы подсистемы «Дополнительные отчеты и обработки». Например, ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(). Это обеспечит соответствие стандартам безопасности 1С и корректную работу в облачных сервисах (1С:Фреш).

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

← На главную