Почему возникает ошибка «Файл не обнаружен» при расшифровке внешнего отчета в 1С и как это исправить?

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

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

Пользователь делает двойной клик на ячейке сформированного отчета, ожидая увидеть детализацию, но вместо этого на экране появляется критическая ошибка: «Ошибка при вызове метода контекста (Создать) по причине: Ошибка подключения внешних метаданных по причине: Файл не обнаружен...» с указанием пути к временному файлу в каталоге пользователя AppData\Local\Temp\v8_XXXX_XX.tmp.

Давайте подробно проанализируем, почему возникает эта ошибка, как устроен жизненный цикл временных файлов внешних обработок в системе «1С:Предприятие» и какие существуют надежные способы решения этой проблемы без изменения типовой конфигурации.

Выясняем истинную причину: жизненный цикл временного файла

Когда мы открываем внешний отчет с диска локального компьютера через меню «Файл — Открыть», платформа 1С фиксирует абсолютный путь к файлу (например, D:\Reports\MyReport.erf) и записывает его в системное свойство ЭтотОбъект.ИспользуемоеИмяФайла. Этот файл физически существует на диске на протяжении всего сеанса работы. При расшифровке платформа повторно обращается по этому пути, находит файл и успешно инициализирует новый экземпляр отчета для отображения детализированных данных.

В случае запуска отчета через справочник дополнительных отчетов и обработок (на базе БСП — Библиотеки стандартных подсистем) логика работы кардинально меняется:

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

Способ 1. Сохранение файла силами самого внешнего отчета

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

Разберем этот процесс по шагам:

  1. Откроем наш внешний отчет в конфигураторе 1С.
  2. Добавим в реквизиты отчета новый реквизит ПутьКФайлуДляРасшифровки с типом данных Строка (длина неограничена).
  3. В модуле формы отчета найдем событие ПриСозданииНаСервере. Если его нет, создадим этот обработчик.
  4. Вставим код, который скопирует временный файл отчета в уникальное место до того, как БСП успеет его удалить.

Посмотрим на пример реализации такого кода:


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

Теперь в обработчике расшифровки табличного документа (событие ОбработкаРасшифровки) мы должны явно указать платформе использовать сохраненный путь вместо стандартного ИспользуемоеИмяФайла. Проанализируем пример кода:


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

Способ 2. Использование расширения конфигурации

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

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

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

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

Пример переопределения логики удаления файлов в расширении:


&Вместо("ОчиститьВременныеФайлыОтчетов")
Процедура Расш_ОчиститьВременныеФайлыОтчетов(МассивФайлов)
    // Вместо удаления файлов сразу, мы можем просто пропустить эту процедуру,
    // либо перенаправить файлы в очередь очистки при закрытии системы.
    // Это гарантирует, что на протяжении работы пользователя все файлы расшифровок будут доступны.
КонецПроцедуры

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

Способ 3. Перевод внешнего отчета на Систему компоновки данных (СКД)

Часто данная проблема возникает в устаревших отчетах, где расшифровка программируется вручную с использованием старых механизмов построителя отчета или ручного обхода группировок выборки. Современный и наиболее рекомендуемый подход фирмы «1С» — это перевод отчетов на полноценную Систему компоновки данных (СКД).

Почему при использовании СКД ошибка пропадает?

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

Если вы переведете ваш отчет на СКД:

Подведем итоги

Мы подробно разобрали техническую природу ошибки «Файл не обнаружен» при работе с внешними отчетами из справочника дополнительных обработок в 1С. Причина кроется в автоматическом удалении временных файлов механизмами очистки БСП. В зависимости от ваших задач, вы можете выбрать один из трех рассмотренных вариантов решения:

  1. Локальный (Способ 1): Быстрая модификация одного конкретного отчета путем сохранения его копии во временный файл.
  2. Глобальный (Способ 2): Создание расширения конфигурации для управления временем жизни временных файлов во всей системе.
  3. Архитектурный (Способ 3): Перевод структуры отчета на механизмы СКД, что является наиболее перспективным и надежным решением.

Используйте данные рекомендации в своей практике, чтобы ваши отчеты работали стабильно и радовали пользователей быстрым и безошибочным анализом данных!

← На главную