Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда внешний отчет, добавленный в справочник «Дополнительные отчеты и обработки», ведет себя не так, как при обычном открытии через меню «Файл — Открыть». Одной из самых частых и неприятных проблем является падение системы при попытке выполнить расшифровку данных в табличном документе.
Пользователь делает двойной клик на ячейке сформированного отчета, ожидая увидеть детализацию, но вместо этого на экране появляется критическая ошибка: «Ошибка при вызове метода контекста (Создать) по причине: Ошибка подключения внешних метаданных по причине: Файл не обнаружен...» с указанием пути к временному файлу в каталоге пользователя AppData\Local\Temp\v8_XXXX_XX.tmp.
Давайте подробно проанализируем, почему возникает эта ошибка, как устроен жизненный цикл временных файлов внешних обработок в системе «1С:Предприятие» и какие существуют надежные способы решения этой проблемы без изменения типовой конфигурации.
Когда мы открываем внешний отчет с диска локального компьютера через меню «Файл — Открыть», платформа 1С фиксирует абсолютный путь к файлу (например, D:\Reports\MyReport.erf) и записывает его в системное свойство ЭтотОбъект.ИспользуемоеИмяФайла. Этот файл физически существует на диске на протяжении всего сеанса работы. При расшифровке платформа повторно обращается по этому пути, находит файл и успешно инициализирует новый экземпляр отчета для отображения детализированных данных.
В случае запуска отчета через справочник дополнительных отчетов и обработок (на базе БСП — Библиотеки стандартных подсистем) логика работы кардинально меняется:
ХранилищеЗначения)..tmp или .erf).ЭтотОбъект.ИспользуемоеИмяФайла по-прежнему ссылается на уже удаленный файл в папке Temp.ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла). Поскольку временный файл был стерт механизмами БСП, платформа мгновенно генерирует исключение «Файл не обнаружен».Рассмотрим самый быстрый способ исправления, который не требует изменения конфигурации информационной базы и не затрагивает другие объекты системы. Мы можем научить наш внешний отчет самостоятельно сохранять копию своего файла в надежное место, откуда платформа сможет его считать при расшифровке.
Разберем этот процесс по шагам:
ПутьКФайлуДляРасшифровки с типом данных Строка (длина неограничена).ПриСозданииНаСервере. Если его нет, создадим этот обработчик.Посмотрим на пример реализации такого кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем путь к текущему файлу отчета
ИмяФайлаИсточника = РеквизитФормыВЗначение("Отчет").ИспользуемоеИмяФайла;
// Проверяем, что отчет открыт как внешний и путь к нему указывает на временный каталог
Если ЗначениеЗаполнено(ИмяФайлаИсточника) И Найти(ВРег(ИмяФайлаИсточника), "TEMP") > 0 Тогда
// Создаем копию файла в безопасном временном месте, которое не очищается БСП автоматически
ИмяФайлаКопии = ПолучитьИмяВременногоФайла("erf");
Попытка
КопироватьФайл(ИмяФайлаИсточника, ИмяФайлаКопии);
// Сохраняем путь к копии в реквизит нашего отчета
Отчет.ПутьКФайлуДляРасшифровки = ИмяФайлаКопии;
Исключение
// Обработка исключения, если файл уже удален к моменту инициализации формы
ЗаписьЖурналаРегистрации("ВнешнийОтчет.КопированиеФайла",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось скопировать файл отчета для расшифровки: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Теперь в обработчике расшифровки табличного документа (событие ОбработкаРасшифровки) мы должны явно указать платформе использовать сохраненный путь вместо стандартного ИспользуемоеИмяФайла. Проанализируем пример кода:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Если у нас сохранен альтернативный путь к копии файла, переопределяем стандартное поведение
Если ЗначениеЗаполнено(Отчет.ПутьКФайлуДляРасшифровки) Тогда
СтандартнаяОбработка = Ложь;
// Формируем параметры для открытия расшифровки
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ИмяФайлаОтчета", Отчет.ПутьКФайлуДляРасшифровки);
ПараметрыВыполнения.Вставить("ИдентификаторРасшифровки", Расшифровка);
// Вызываем функцию создания и открытия формы расшифровки
ОткрытьФормуРасшифровкиНаСервере(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
Если в вашей информационной базе используется множество внешних отчетов и вы не хотите модифицировать код каждого из них, наиболее изящным решением будет использование механизма расширений. Основная конфигурация останется на поддержке, а проблема решится централизованно.
Мы можем перехватить код общего модуля БСП, отвечающий за удаление временных файлов после запуска отчета, либо доработать процедуру открытия отчетов так, чтобы временный файл оставался на диске до окончания сеанса работы текущего пользователя.
В современных версиях БСП запуск внешних отчетов осуществляется через общий модуль ДополнительныеОтчетыИОбработкиКлиент. Рассмотрим по шагам, как переопределить поведение системы:
ДополнительныеОтчетыИОбработкиКлиент (или серверный аналог, в зависимости от версии БСП).ВыполнитьКомандуОтчета).УдалитьФайлы(), мы регистрируем путь к файлу в глобальном массиве сеанса, который будет очищен только при закрытии приложения.Пример переопределения логики удаления файлов в расширении:
&Вместо("ОчиститьВременныеФайлыОтчетов")
Процедура Расш_ОчиститьВременныеФайлыОтчетов(МассивФайлов)
// Вместо удаления файлов сразу, мы можем просто пропустить эту процедуру,
// либо перенаправить файлы в очередь очистки при закрытии системы.
// Это гарантирует, что на протяжении работы пользователя все файлы расшифровок будут доступны.
КонецПроцедуры
Этот способ крайне удобен, так как полностью автоматизирует процесс для всех существующих и будущих внешних отчетов без необходимости ручной доработки каждого файла.
Часто данная проблема возникает в устаревших отчетах, где расшифровка программируется вручную с использованием старых механизмов построителя отчета или ручного обхода группировок выборки. Современный и наиболее рекомендуемый подход фирмы «1С» — это перевод отчетов на полноценную Систему компоновки данных (СКД).
Почему при использовании СКД ошибка пропадает?
Когда отчет разработан с использованием схемы компоновки данных и выводится через стандартную форму отчета (предоставляемую платформой или БСП), платформа осуществляет расшифровку на основе внутреннего макета компоновки данных, который целиком находится в оперативной памяти сеанса. Платформе не требуется физически переоткрывать файл внешнего отчета с диска, чтобы построить отчет-расшифровку. Вся работа по перестроению дерева запроса и выводу новых группировок происходит в памяти сервера 1С.
Если вы переведете ваш отчет на СКД:
Мы подробно разобрали техническую природу ошибки «Файл не обнаружен» при работе с внешними отчетами из справочника дополнительных обработок в 1С. Причина кроется в автоматическом удалении временных файлов механизмами очистки БСП. В зависимости от ваших задач, вы можете выбрать один из трех рассмотренных вариантов решения:
Используйте данные рекомендации в своей практике, чтобы ваши отчеты работали стабильно и радовали пользователей быстрым и безошибочным анализом данных!