Как программно открыть внешнюю обработку или отчет в 1С (Обычные и Управляемые формы)?

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

При разработке расширений или доработке конфигураций часто возникает задача программного запуска внешней обработки или отчета. Это может потребоваться, если обработка хранится в макете, в справочнике (например, в "Дополнительные отчеты и обработки") или просто лежит в файловой системе.

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

Задача

Нам необходимо открыть форму внешней обработки (.epf) или отчета (.erf) — для работы с такими файлами также существуют инструменты-распаковщики — не добавляя их в дерево конфигурации. Источником может быть:

  1. Файл на диске.
  2. Двоичные данные, хранящиеся в справочнике (например, Справочник.ВнешниеОбработки или Справочник.ДополнительныеОтчетыИОбработки).

Решение для Обычных форм (Толстый клиент)

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

Разберем классический алгоритм действий:

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

Рассмотрим пример кода, который выполняет эти действия:


Процедура ОткрытьВнешнююОбработкуИзСправочника()
    
    // 1. Находим ссылку на обработку
    // Лучше искать по реквизиту (например, ИмяОбъекта) или Коду, но для примера возьмем Наименование
    СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("МояОбработка");
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Сообщить("Обработка не найдена!");
        Возврат;
    КонецЕсли;

    // 2. Получаем имя временного файла
    // Платформа сама определит папку TEMP и сгенерирует уникальное имя
    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    
    // 3. Извлекаем данные и сохраняем на диск
    ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
    ДвоичныеДанные.Записать(ИмяФайла);
    
    // 4. Получаем и открываем форму
    // Обратите внимание: метод работает именно с путем к файлу
    Попытка
        Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
        Форма.Открыть();
    Исключение
        Сообщить("Не удалось открыть обработку: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Важный момент: удаление временного файла
    // В обычных формах файл занят пока открыта форма, поэтому
    // удалять его нужно либо при закрытии формы, либо полагаться на очистку TEMP системой.
    // Если обработка выполняется без открытия формы, удалять нужно сразу.
    
КонецПроцедуры

Если вам нужно открыть Внешний отчет, логика абсолютно такая же, меняется только менеджер объекта:


// Для отчета
Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
Форма.Открыть();

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


Попытка
    УдалитьФайлы(ИмяФайла);
Исключение
    // Файл может быть заблокирован, если обработка еще открыта
КонецПопытки;

Решение для Управляемых форм (Тонкий и Веб-клиент)

В управляемом приложении все сложнее. Мы не можем просто так сохранить файл на диск (особенно в веб-клиенте) и сказать серверу "открой его". Здесь используется механизм подключения внешних обработок через временное хранилище.

Алгоритм работы в управляемых формах выглядит так:

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

Рассмотрим полный пример, который можно использовать в управляемой форме.


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

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

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

Особенности открытия отчетов в Управляемом приложении

Для отчетов (например, если открывается управляемая консоль отчетов) механизм похож, но имеет свои нюансы — использование менеджера ВнешниеОтчеты и работа с вариантами.

Обратите внимание на формирование строки для метода ОткрытьФорму. Для отчета она начинается с ВнешнийОтчет....


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

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

Использование механизмов БСП (Библиотеки Стандартных Подсистем)

Если вы работаете в современной типовой конфигурации (1С:Бухгалтерия 3.0, Управление Торговлей 11, ERP, ЗУП 3.1), не стоит изобретать велосипед. В этих конфигурациях внедрена БСП, которая уже содержит готовые методы для безопасного и правильного открытия внешних обработок, зарегистрированных в справочнике ДополнительныеОтчетыИОбработки.

Использование штатного метода БСП предпочтительнее, особенно если реализуется постобработка печатных форм, так как он учитывает права доступа и параметры запуска.

Пример кода для вызова обработки через БСП:


&НаКлиенте
Процедура ОткрытьЧерезБСП(Команда)
    
    // Получаем структуру параметров запуска на сервере
    ПараметрыЗапуска = ПолучитьПараметрыЗапускаНаСервере("ИмяОбработкиВСамойОбработке");
    
    Если ПараметрыЗапуска <> Неопределено Тогда
        // Вызываем штатный метод БСП для открытия
        // Модуль: ДополнительныеОтчетыИОбработкиКлиент
        ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ПараметрыЗапуска, Неопределено, Неопределено);
    КонецЕсли;

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

&НаСервере
Функция ПолучитьПараметрыЗапускаНаСервере(ИмяОбъекта)
    
    // Ищем обработку не по наименованию, а по внутреннему имени (так надежнее)
    // Реквизит "ИмяОбъекта" в справочнике ДополнительныеОтчетыИОбработки
    Ссылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", ИмяОбъекта);
    
    Если Ссылка.Пустая() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Формируем структуру, которую ожидает БСП
    // В старых версиях БСП структура может отличаться, проверяйте модуль ДополнительныеОтчетыИОбработки
    Структура = Новый Структура;
    Структура.Вставить("Ссылка", Ссылка);
    Структура.Вставить("Представление", Строка(Ссылка));
    Структура.Вставить("ЭтоОтчет", Ложь); // Или Истина для отчета
    // Вид обработки важен для БСП
    Структура.Вставить("Вид", Ссылка.Вид); 
    
    Возврат Структура;

КонецФункции

Важные нюансы и возможные ошибки

При реализации программного открытия, а также при отладке внешних печатных форм, обратите внимание на следующие моменты:

  1. Безопасный режим и Защита от опасных действий.

    Начиная с версии платформы 8.3.9, при подключении внешних обработок может появляться окно "Предупреждение безопасности". Чтобы его избежать при программном подключении, в методе Подключить (или Создать в толстом клиенте) третьим параметром можно передать Ложь (отключение безопасного режима), а четвертым — объект ОписаниеЗащитыОтОпасныхДействий. Однако это работает только если у пользователя есть соответствующие права (обычно административные).

  2. Уникальность имени при подключении.

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

  3. Блокировка файлов.

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

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

← На главную