Многие разработчики, поддерживающие системы на базе платформы 1С:Предприятие 7.7, сталкивались с неприятной ситуацией: при попытке сохранить внешнюю обработку или отчет в Конфигураторе возникает ошибка, после которой файл обработки становится полностью пустым (весит 0 байт) или битым. В результате часы работы могут быть потеряны. Проанализируем ситуацию, выясним причины такого поведения системы и подробно разберем по шагам все возможные способы восстановления утерянного кода.
Файлы с расширениями .ert и .md в 1С 7.7 представляют собой структурированные хранилища — Microsoft OLE Compound Document. Их структура напоминает миниатюрную файловую систему внутри одного файла. Посмотрим, что происходит в момент сохранения:
Файловая система NTFS при записи в один файл использует внутренние механизмы транзакций. Если 1С "упала" до завершения сохранения файла, операционная система может оставить файл в незавершенном, нулевом или нечитаемом состоянии. Разберем рабочие алгоритмы по спасению кода.
Если после сбоя вы еще не закрыли Конфигуратор или окно 1С:Предприятия (в котором эта обработка была открыта), шанс на полное восстановление кода очень велик. Код всё ещё находится в оперативной памяти процесса 1cv7.exe. Рассмотрим подробнее, как его оттуда достать:
1cv7.exe..dmp во временную папку.Если программа уже закрыта, проанализируем временные файлы. При сохранении 1С часто создает промежуточные файлы. Посмотрим на алгоритм поиска:
%TEMP% (можно ввести этот путь прямо в адресную строку Проводника).ExtForms.~ (например, ~ert..., ~md... или ~1c...). Также обращайте внимание на файлы с расширением .tmp или вообще без расширения, время изменения которых совпадает с моментом сбоя.Иногда после сбоя файл не становится нулевым, но Конфигуратор отказывается его открывать, выдавая ошибку формата потока. В таком случае поврежден лишь заголовок OLE-контейнера, а сам текст модуля остался цел. Разберем, как его вытащить:
.ert с командой распаковки.MainProgram). Откроем его в текстовом редакторе — здесь будет лежать спасенный программный код.Если файл полностью обнулился (0 байт), а бэкапов нет, старая версия файла скорее всего всё ещё физически находится на поверхности диска в неразмеченной области (пока эти сектора не перезаписали другие программы). Выясним причину, почему это работает: при изменении файла ОС часто пишет новые данные в новые сектора, освобождая старые.
Здесь нам помогут программы для восстановления данных на уровне секторов диска. Искать нужно по стандартному заголовку составного файла Microsoft OLE. Разберем по шагам:
D0 CF 11 E0 A1 B1 1A E1.Потерять 40 минут работы — это не потерять два дня, но всё равно обидно. Чтобы не заниматься восстановлением файлов из секторальных недр, организуем надежную систему резервного копирования. Рассмотрим несколько проверенных практикой методов.
Метод 1: Скрипт автоматического бэкапа для OpenConf
Если вы используете расширение Конфигуратора OpenConf (что крайне рекомендуется для 1С 7.7), мы можем перехватить событие сохранения файла и автоматически создавать его копию в папку архива. Посмотрим на пример скрипта на VBScript:
' Делает инкрементную копию файла ERT после каждого сохранения в конфигураторе.
Sub makeCopyToArhive(psDocPath)
vCopyFolder = IBDir + "ExtForms\_Arhive\"
vCheckFolder = IBDir + "ExtForms\"
vDocPathNew = psDocPath
' Проверяем, находится ли сохраняемый файл в папке внешних отчетов
if InStr(psDocPath, vCheckFolder) = 0 Then
exit sub
Else
vDocPathNew = Replace(vDocPathNew, vCheckFolder, "")
vDocPathNew = Replace(vDocPathNew, "\", "#")
end if
' Создаем объект FileSystemObject для работы с файлами
Set gFso = CreateObject("Scripting.FileSystemObject")
' Проверяем наличие папки для архива
if not gFso.FolderExists(vCopyFolder) Then
exit sub
end if
' Формируем уникальное имя файла с отметкой времени
vTimeString = Year(Now) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & "_" & Right("0" & Hour(Now), 2) & Right("0" & Minute(Now), 2) & Right("0" & Second(Now), 2)
vDocPathNew = vTimeString & "_" & vDocPathNew
vDocPathNew = vCopyFolder + vDocPathNew
' Копируем файл
gFso.CopyFile psDocPath, vDocPathNew
End Sub
' Подписываемся на событие OpenConf "Файл сохранен"
Sub Configurator_OnFileSaved( psDoc )
makeCopyToArhive psDoc.path
End Sub
Этот скрипт каждый раз при нажатии Ctrl+S будет брать ваш файл и сохранять его копию с текущей датой и временем в подпапку _Arhive. Это обеспечит идеальное версионирование: вы сможете откатиться на любое сохранение, сделанное минуту или час назад.
Метод 2: Внешние утилиты резервного копирования
Если вы не используете OpenConf, настройте внешнюю синхронизацию рабочего каталога. Отличными вариантами будут:
Backup_ERT (так называемый Ромиксовский бэкапер), который делает резервные копии в оперативном режиме.Проанализировав все способы, делаем вывод: лучший способ спасти код — не терять его. Включите версионирование файлов (скриптами или утилитами), возьмите в привычку периодически делать "Сохранить как..." с добавлением номеров версий (например, Отчет_v1.ert, Отчет_v2.ert) и тогда сбои конфигуратора перестанут быть проблемой.