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