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