Внезапное отключение электроэнергии или аварийная перезагрузка компьютера во время разработки — критическая ситуация, с которой сталкивался практически каждый разработчик 1С. При попытке открыть внешнюю обработку конфигуратор выдает ошибку: "Ошибка при выполнении файловой операции... по причине: Неверный формат хранилища данных". При открытии файла через шестнадцатеричный редактор или просмотрщик обнаруживается, что файл имеет небольшой размер (например, несколько килобайт), но полностью заполнен нулями.
Разберем подробнее, почему так происходит, можно ли восстановить утерянный программный код и как действовать в подобной ситуации.
Проанализируем техническую сторону проблемы. Файловые системы современных операционных систем используют механизмы отложенной записи и буферизации кэша. В момент сохранения файла система сначала резервирует дисковое пространство и обновляет дескрипторы метаданных, а реальные блоки данных из оперативной памяти сбрасываются на накопитель с небольшой задержкой. Если питание пропадает ровно в момент записи, файловая система фиксирует новую длину файла, но физические секторы остаются незаписанными или инициализированными нулями.
Формат внешней обработки (.epf или .erf) представляет собой составной контейнер потоков данных, сжатых алгоритмом Deflate (zlib). Если заголовок и дерево каталогов контейнера затерты нулями, стандартные механизмы 1С не смогут прочитать файл. Утилита chdbfl.exe здесь не поможет, так как она предназначена исключительно для табличных баз данных формата .1CD.
Тем не менее, сам исходный код модуля обработки еще можно извлечь из резервных источников и следов в системе. Рассмотрим основные варианты спасения наработок.
Во время работы платформы и отладки конфигуратор активно взаимодействует с временными директориями текущего пользователя. Нередко там сохраняются рабочие копии или распакованные потоки обработки.
%TEMP% и нажмем клавишу Enter.C:\Users\<ИмяПользователя>\AppData\Local\Temp (или Documents and Settings\user\Local Settings\Temp в устаревших ОС)..tmp, а также вложенные папки с шестнадцатеричными именами, созданные конфигуратором непосредственно перед сбоем..tmp-файл подходящего размера, создадим его копию, изменим расширение на .epf и попробуем открыть через Файл — Открыть в конфигураторе.Если на логическом диске была включена защита системы или служба теневого копирования томов (VSS), файловая система могла зафиксировать состояние файла до момента повреждения.
Если сам файл восстановить целиком не удается, нашей главной целью остается спасение написанного программного кода. Поскольку код модулей 1С пишется в текстовом виде (кодировка UTF-8), его фрагменты часто остаются в освобожденных секторах диска или в системном файле виртуальной памяти.
Разберем, как извлечь программный код:
&НаКлиенте, Процедура, КонецПроцедуры.pagefile.sys или swapfile.sys в режиме только для чтения через hex-редактор и выполним поиск по уникальной строке из модуля обработки. При нахождении совпадения выделим блок текста от начала процедуры до её завершения и скопируем в отдельный текстовый файл.Если занулен только начальный заголовок файла, а в теле файла после смещения в несколько килобайт все еще присутствуют данные, контейнер можно попробовать разобрать вручную. Внутри контейнеров 1С сжатые потоки данных Deflate начинаются со стандартных сигнатур zlib: 78 9C, 78 DA или 78 01. Обнаружив такие заголовки, можно распаковать поток соответствующим распаковщиком и извлечь текст модуля.
Полагаться только на стабильность электросети не стоит. Чтобы избежать безвозвратной потери кода, настроим безопасный процесс разработки: