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

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

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

Общая логика решения задачи

Давайте проанализируем последовательность действий, которую необходимо выполнить для достижения цели. Процесс можно разделить на несколько ключевых этапов:

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

Реализация процедуры поиска и открытия

Рассмотрим программный код, который позволяет автоматизировать этот процесс. Мы создадим универсальную процедуру, которая будет принимать код или ссылку на элемент справочника и выполнять запуск.

Обратите внимание, что в обычных формах (толстый клиент) нам не требуются директивы компиляции вроде &НаКлиенте, так как код выполняется в едином контексте приложения. Разберем пример реализации:


Процедура ОткрытьВнешнийОтчетПоКоду(КодОтчета)
    
    // Шаг 1. Находим элемент справочника. 
    // В типовых конфигурациях на обычных формах это справочник "ВнешниеОбработки"
    СсылкаНаОтчет = Справочники.ВнешниеОбработки.НайтиПоКоду(КодОтчета);
    
    Если СсылкаНаОтчет.Пустая() Тогда
        Сообщить("Внешний отчет с кодом " + КодОтчета + " не найден в справочнике!");
        Возврат;
    КонецЕсли;
    
    // Проверим, что это именно отчет, а не обработка (если в справочнике есть разделение)
    Если СсылкаНаОтчет.ВидОбработки <> Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
        // Обработка логики, если типы могут отличаться
    КонецЕсли;

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

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

Разбор методов работы с внешними объектами

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

Метод ПолучитьФорму(ПутьКФайлу) является наиболее быстрым способом визуализации отчета. Если во внешнем файле .erf задана основная форма, система сразу инициализирует ее. Однако, если вам требуется предварительно программно заполнить какие-либо реквизиты отчета (например, установить дату начала периода или организацию), этот метод может быть неудобен.

В ситуации, когда необходима предварительная настройка, мы используем метод Создать(ПутьКФайлу). Рассмотрим подробнее, как это выглядит при передаче параметров:


// Создаем объект отчета в памяти
ОтчетОбъект = ВнешниеОтчеты.Создать(ПутьКФайлу);

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

// После настройки получаем форму и открываем ее
Форма = ОтчетОбъект.ПолучитьФорму();
Форма.Открыть();

Важные дополнения и безопасность

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

1. Управление временными файлами. Каждый раз при вызове метода ПолучитьИмяВременногоФайла() в системной папке Temp создается новый файл. Если их не удалять, через некоторое время папка переполнится, что приведет к замедлению работы системы. Рекомендуется удалять файл сразу после открытия формы, если отчет не требует доступа к этому файлу в процессе работы, или использовать механизмы очистки при закрытии формы.

2. Безопасный режим. Метод ВнешниеОтчеты.Создать(Путь, БезопасныйРежим) позволяет передать второй параметр. Если вы не уверены в источнике отчета, крайне рекомендуется устанавливать его в значение Истина. В безопасном режиме отчету запрещено:

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

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

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

Для открытия отчета через БСП достаточно знать его ссылку в справочнике ДополнительныеОтчетыИОбработки. Выясним, как это сделать одной строкой кода, используя программный интерфейс библиотеки:


// Для управляемых и обычных форм в контексте БСП
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(СсылкаНаДопОтчет, ПараметрыВыполнения);

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

Резюме

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

← На главную