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

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

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

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

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

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

Частая ошибка заключается в неправильном формировании имени формы или путанице между типами объектов. В частности:

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

Правильный синтаксис обращения к форме

Обратимся к синтаксис-помощнику платформы 1С. Для обращения к стандартной форме внешнего объекта (когда отдельная форма в файле не создана) предусмотрен специальный синтаксис строкового имени формы:

  1. Для внешних отчетов: ВнешнийОтчет.<ИмяПодключенногоОтчета>.Форма
  2. Для внешних обработок: ВнешняяОбработка.<ИмяПодключеннойОбработки>.Форма

Если в файле отчета создана собственная управляемая форма с конкретным именем, то имя указывается через разделитель: ВнешнийОтчет.<ИмяПодключенногоОтчета>.Форма.<ИмяФормы>.

Готовый шаблон кода для подключения и открытия отчета

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


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

&НаСервере
Функция ПолучитьИмяФайлаОбработки()
    
    // Находим нужный элемент в дополнительных отчетах
    СсылкаНаОбъект = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Прайс-лист");
    
    // Извлекаем двоичные данные внешнего отчета
    ДвоичныеДанные = СсылкаНаОбъект.ХранилищеОбработки.Получить();
    
    // Сохраняем во временный файл на сервере
    ИмяФайла = ПолучитьИмяВременногоФайла("erf");
    ДвоичныеДанные.Записать(ИмяФайла);
    
    Возврат ИмяФайла;
    
КонецФункции

&НаСервере
Функция ПолучитьСсылкуНаОбработку(АдресХранилища)
    
    // Подключаем отчет во внешних отчетах и возвращаем зарегистрированное имя
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
    
КонецФункции

Альтернативный подход с использованием функций БСП

Если работа ведется в конфигурации, где используется Библиотека Стандартных Подсистем (БСП), не обязательно вручную считывать двоичные данные во временные файлы. В БСП предусмотрены механизмы для работы с дополнительными отчетами и обработками.

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

← На главную