Как восстановить код внешней обработки (ERT) в 1С 7.7 при сбое сохранения?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Почему файл обнуляется при сбое сохранения?

Файлы с расширениями .ert и .md в 1С 7.7 представляют собой структурированные хранилища — Microsoft OLE Compound Document. Их структура напоминает миниатюрную файловую систему внутри одного файла. Посмотрим, что происходит в момент сохранения:

  1. Система сначала создает новую структуру компаунд-файла (контейнера). В этот момент размер файла на диске может временно обнулиться или измениться.
  2. Затем начинается потоковая запись метаданных, структуры форм и модуля кода внутрь этого контейнера.
  3. Если на этапе записи происходит сбой (ошибка сети, конфликт с антивирусом, нехватка памяти или сбой жесткого диска), транзакция записи прерывается.

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

Шаг 1. Извлечение исходного кода из дампа памяти (Memory Dump)

Если после сбоя вы еще не закрыли Конфигуратор или окно 1С:Предприятия (в котором эта обработка была открыта), шанс на полное восстановление кода очень велик. Код всё ещё находится в оперативной памяти процесса 1cv7.exe. Рассмотрим подробнее, как его оттуда достать:

  1. Откройте Диспетчер задач Windows.
  2. Перейдите на вкладку "Подробности" (или "Процессы") и найдите процесс 1cv7.exe.
  3. Кликните по нему правой кнопкой мыши и выберите команду "Создать дамп памяти". Система сохранит файл с расширением .dmp во временную папку.
  4. Откройте полученный дамп в любом шестнадцатеричном редакторе (например, HxD) или мощном текстовом редакторе вроде Notepad++.
  5. Используйте функцию поиска. Введите специфичную строку из вашего кода — уникальное название переменной, комментарий или имя написанной вами процедуры.
  6. Найдя нужный фрагмент, вы увидите свой исходный код открытым текстом. Выделите его и скопируйте в новый файл.

Шаг 2. Поиск во временных папках (Temp)

Если программа уже закрыта, проанализируем временные файлы. При сохранении 1С часто создает промежуточные файлы. Посмотрим на алгоритм поиска:

  1. Перейдите в каталог временных файлов пользователя. Обычно это папка %TEMP% (можно ввести этот путь прямо в адресную строку Проводника).
  2. Откройте каталог вашей информационной базы, в частности папку ExtForms.
  3. Включите отображение скрытых и системных файлов в настройках Проводника.
  4. Ищите файлы, имя которых начинается с символа тильды ~ (например, ~ert..., ~md... или ~1c...). Также обращайте внимание на файлы с расширением .tmp или вообще без расширения, время изменения которых совпадает с моментом сбоя.
  5. Открывайте подозрительные файлы с помощью Блокнота и проверяйте их содержимое на наличие вашего программного кода.

Шаг 3. Использование распаковщиков (GComp) для битых файлов

Иногда после сбоя файл не становится нулевым, но Конфигуратор отказывается его открывать, выдавая ошибку формата потока. В таком случае поврежден лишь заголовок OLE-контейнера, а сам текст модуля остался цел. Разберем, как его вытащить:

  1. Воспользуемся специализированной утилитой GComp, которая предназначена для разборки и сборки компаунд-файлов 1С 7.7.
  2. Натравим GComp на наш битый файл .ert с командой распаковки.
  3. Программа попытается разложить контейнер на отдельные потоки (формы, реквизиты, модуль).
  4. Перейдем в папку с распакованными данными и найдем текстовый поток (часто он называется MainProgram). Откроем его в текстовом редакторе — здесь будет лежать спасенный программный код.

Шаг 4. Глубокий поиск по секторам физического диска (Raw Recovery)

Если файл полностью обнулился (0 байт), а бэкапов нет, старая версия файла скорее всего всё ещё физически находится на поверхности диска в неразмеченной области (пока эти сектора не перезаписали другие программы). Выясним причину, почему это работает: при изменении файла ОС часто пишет новые данные в новые сектора, освобождая старые.

Здесь нам помогут программы для восстановления данных на уровне секторов диска. Искать нужно по стандартному заголовку составного файла Microsoft OLE. Разберем по шагам:

  1. Запустите программу для посекторного поиска (WinHex, DMDE, R-Studio).
  2. Укажите поиск по шестнадцатеричной (HEX) сигнатуре: D0 CF 11 E0 A1 B1 1A E1.
  3. Также можно запустить прямой текстовый поиск (в кодировке Windows-1251) по всему логическому диску, указав уникальную строчку вашего кода.
  4. Этот процесс может занять несколько часов, но он позволяет вытащить код прямо из "свободного" места на жестком диске.

Профилактика: как навсегда забыть о потере кода

Потерять 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, настройте внешнюю синхронизацию рабочего каталога. Отличными вариантами будут:

  1. Облачные сервисы (Dropbox, Яндекс.Диск). Сохраняйте все обработки прямо в папку, синхронизируемую с облаком. Облачные клиенты автоматически поддерживают версионирование файлов. Вы заметите повреждение файла, зайдете в веб-интерфейс облака и просто восстановите версию файла пятиминутной давности.
  2. Программы типа Cobian Backup. Настройте задание на теневое копирование (VSS) вашей рабочей папки каждые 15–20 минут. Это не нагружает систему, но спасает массу нервов при сбоях.
  3. Специальные плагины. В сообществе разработчиков 7.7 популярен плагин Backup_ERT (так называемый Ромиксовский бэкапер), который делает резервные копии в оперативном режиме.

Проанализировав все способы, делаем вывод: лучший способ спасти код — не терять его. Включите версионирование файлов (скриптами или утилитами), возьмите в привычку периодически делать "Сохранить как..." с добавлением номеров версий (например, Отчет_v1.ert, Отчет_v2.ert) и тогда сбои конфигуратора перестанут быть проблемой.

← На главную