Ситуация, когда пользователь сформировал сложный «самописный» отчет, закрыл его и забыл сохранить, встречается в практике администраторов и разработчиков 1С довольно часто. Кажется, что раз данные были на экране, они должны были где-то сохраниться на диске. В этой статье мы подробно разберем, как платформа 1С:Предприятие 8 работает с временными данными, где физически могут находиться эти файлы и что нужно сделать программисту, чтобы такие ситуации больше не повторялись.
Для начала проанализируем, как 1С обрабатывает ТабличныйДокумент. Важно понимать, что платформа старается оптимизировать производительность, поэтому способ хранения данных зависит от их объема. Выясним основные принципы:
1cv8.exe (на клиенте) или rphost.exe (на сервере). При закрытии формы или завершении сеанса эта память просто освобождается, и данные исчезают бесследно.ПоместитьВоВременноеХранилище. Данные могут быть записаны во временный файл, если они не помещаются в кэш памяти.v8_ и расширением .tmp.Если мы надеемся найти следы закрытого документа, нам необходимо проверить стандартные пути расположения временных данных. Рассмотрим пошагово, где они находятся в ОС Windows:
1. Пользовательская папка Temp
Это основное место, куда платформа «сбрасывает» временные объекты. Перейдем по пути: %USERPROFILE%\AppData\Local\Temp. Здесь нас интересуют файлы, созданные в момент формирования отчета. Они обычно имеют нечитаемые имена вида v8_ABCD_12.tmp. Важный нюанс: сразу после закрытия окна 1С эти файлы автоматически удаляются платформой.
2. Локальный кэш конфигурации
Данные сеанса могут сохраняться в папке %USERPROFILE%\AppData\Local\1C\1Cv8\<Уникальный_ID_базы>. Хотя сами таблицы там хранятся редко, там могут остаться следы состояния форм. Однако извлечь оттуда осмысленный отчет без специализированных инструментов практически невозможно.
3. Серверные временные файлы
В клиент-серверном варианте работы формирование отчета происходит на стороне сервера приложений. Проверим папку профиля пользователя, под которым запущена служба 1C:Enterprise 8.3 Server Agent. Обычно это C:\Program Files\1cv8\srvinfo. Внутри рабочих процессов могут создаваться временные хранилища, но доступ к ним ограничен правами системы.
Разберем причины, по которым поиск файла спустя 20-30 минут после закрытия обычно не дает результатов. Проанализируем жизненный цикл временного объекта в 1С:
Во-первых, платформа 1С очень аккуратно «подметает» за собой. Как только объект ТабличныйДокумент выходит из области видимости (закрывается форма), вызывается деструктор, который удаляет связанные временные файлы на диске.
Во-вторых, временные файлы не имеют структуры .mxl в привычном понимании. Это двоичные данные (сериализованные объекты), которые платформа считывает внутренними методами. Даже если вы найдете удаленный .tmp файл с помощью программ для восстановления данных (типа Recuva), вы увидите там «кашу» из байтов.
Чтобы больше не сталкиваться с проблемой «квантовых отчетов», которые исчезают при попытке их закрыть, внедрим в самописный отчет механизм автоматического дублирования на диск. Это самый надежный способ помочь пользователю в будущем.
Рассмотрим пример кода, который можно добавить в модуль формы отчета перед вызовом метода Показать(). Мы будем сохранять копию документа в скрытую папку пользователя.
// В процедуре вывода отчета
ТабДок = Новый ТабличныйДокумент;
// ... здесь идет формирование отчета ...
// Автосохранение для подстраховки
ИмяФайлаБекапа = КаталогВременныхФайлов() + "Backup_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".mxl";
Попытка
ТабДок.Записать(ИмяФайлаБекапа, ТипФайлаТабличногоДокумента.MXL);
Сообщить("Копия отчета сохранена во временную папку: " + ИмяФайлаБекапа);
Исключение
// Ошибку записи можно игнорировать, чтобы не мешать пользователю
КонецПопытки;
ТабДок.Показать("Результат отчета");
Проанализируем, что дает этот подход. Во-первых, у администратора всегда будет копия файла в формате .mxl, которую можно открыть любой базой 1С. Во-вторых, использование КаталогВременныхФайлов() гарантирует, что у пользователя точно есть права на запись в эту директорию.
Если отчет сложный и передается между клиентом и сервером, мы можем использовать функции работы с временным хранилищем. Выясним, как это работает технически. Когда мы используем ПоместитьВоВременноеХранилище(Объект, УникальныйИдентификаторФормы), данные привязываются к жизни формы. Если пользователь не закрыл форму, а просто «потерял» результат, данные еще можно извлечь программно через отладчик или специальную консоль.
Посмотрим на пример передачи данных:
АдресХранилища = ПоместитьВоВременноеХранилище(ТабДок, ЭтаФорма.УникальныйИдентификатор);
// Теперь, пока форма открыта, данные доступны по адресу
Если отчет был жизненно важен, а автосохранение еще не было внедрено, проделаем следующие действия (шанс на успех мал, но он есть):
1cv8.exe. Специалист с помощью HEX-редактора теоретически может попытаться найти внутри дампа текстовые данные из отчета.Temp, хотя служба архивации редко срабатывает так часто.Подведем итоги нашего исследования. Найти «забытый» и закрытый табличный документ во временных файлах 1С практически невозможно из-за оперативного удаления временных .tmp файлов самой платформой.
Главный совет: если вы разрабатываете отчет, результат которого формируется долго или имеет высокую ценность, обязательно добавьте в код принудительную запись в файл (метод Записать()) или выводите его в режиме, исключающем случайное закрытие без подтверждения. Совместная работа программиста и механизмов платформы позволит избежать потери важных данных в будущем.