В практике разработчиков на платформе 1С:Предприятие 7.7 повреждение структуры файла метаданных 1Cv7.md — явление редкое, но крайне неприятное. Сбой может заявить о себе внезапно, например, в процессе объединения конфигураций или при попытке сохранить очередные изменения. При этом штатная синтаксическая проверка в Конфигураторе гордо рапортует об отсутствии ошибок, а сама информационная база продолжает работать. Однако при попытке сравнения или обновления система выдает критическую ошибку, ссылаясь на «недопустимый символ» в каком-либо объекте (например, в отчете ОстаткиТМЦ или документе Реализация).
В этой статье мы подробно разберем природу этого явления, проанализируем причины возникновения структурных ошибок в OLE-хранилищах и рассмотрим пошаговые алгоритмы их поиска и устранения с помощью специализированного инструментария.
Прежде чем приступать к ремонту, выясним причину сбоя. Файл метаданных 1Cv7.md физически представляет собой так называемый Compound File (структурированное хранилище OLE / Microsoft Compound Document File). Это своеобразная «файловая система внутри файла», где содержатся каталоги и потоки данных, описывающие метаданные, формы диалогов, интерфейсы, модули и таблицы.
Когда в процессе редактирования конфигурации происходит микросбой сети, экстренное завершение работы Конфигуратора или переполнение дискового пространства, внутренняя структура этого OLE-хранилища нарушается. Внутри файлов-потоков (например, в свойствах экранных форм или заголовках объектов) могут записаться «мусорные» бинарные данные или недопустимые символы. Конфигуратор 1С умеет обходить эти повреждения при чтении кода, но полностью спотыкается на них при попытке реструктуризации или слияния конфигураций.
Самым популярным, надежным и технологичным способом восстановления структуры MD-файла является использование утилиты GComp. Эта утилита позволяет разобрать бинарный файл 1Cv7.md на множество простых текстовых файлов и файлов описания форм, а затем собрать их обратно в чистый, заново оптимизированный файл метаданных.
Рассмотрим по шагам алгоритм работы с утилитой GComp:
1Cv7.md. Все действия выполняем строго на копии!GComp. Нам понадобятся исполняемый файл gcomp.exe и сопутствующие библиотеки.C:\MD_Unpack, и помещаем туда поврежденный файл 1Cv7.md. Открываем командную строку (cmd) и выполняем команду разборки файла:
gcomp.exe -d -F C:\MD_Unpack\1Cv7.md
В процессе декомпиляции утилита разберет структуру метаданных по папкам. Если в процессе работы утилита выдает ошибку в консоли, внимательно читаем ее текст. Зачастую именно на этом этапе GComp указывает конкретную папку или файл-объект, на котором произошел сбой.
.1s. Мы можем открыть всю папку декомпиляции в современном текстовом редакторе (например, Notepad++ или VS Code) и запустить глобальный поиск по регулярным выражениям или специфическим непечатным символам, чтобы локализовать и удалить поврежденные участки кода.
gcomp.exe -c -D C:\MD_Unpack\SRC -F C:\MD_Unpack\1Cv7_new.md
Полученный файл 1Cv7_new.md переименовываем в 1Cv7.md, подкладываем в нашу тестовую базу и пробуем выполнить объединение конфигураций.
Довольно часто «мусорные» символы скапливаются внутри описаний элементов управления экранных форм (диалогов). Если стандартная декомпиляция падает с ошибкой, мы можем запустить разборку MD-файла, исключив синтаксический разбор экранных форм. Для этого используем специальный ключ --no-parse-dialogs:
gcomp.exe -d -F C:\MD_Unpack\1Cv7.md --no-parse-dialogs
В этом режиме модули будут извлечены как текст, а формы останутся в исходном бинарном виде. Это позволяет успешно разобрать даже сильно поврежденный файл, исправить текстовые ошибки в модулях и собрать его заново.
Если утилита GComp не справляется или выдает неинформативные ошибки при разборке, нам на помощь приходит специализированный софт для низкоуровневой диагностики структуры метаданных.
Проанализируем возможности двух ключевых утилит этого класса:
MDDiags позволяет выявить логические несоответствия (например, когда объект ссылается на несуществующий тип данных или реквизит), которые штатный Конфигуратор игнорирует.MD Doctor заключается в том, что он выдает точный внутренний адрес поврежденного элемента в структуре хранилища. Например, в логе работы вы можете увидеть запись вида: \\Report\\Report_Number2930\\WorkBook\\Dialog Stream - ошибка чтения. Получив этот адрес, мы точно знаем, какой именно объект поврежден.Рассмотрим ручной метод ремонта, когда мы точно знаем адрес поврежденного объекта, но стандартные средства бессильны. Для этого нам понадобится файловый менеджер Far Manager со встроенным плагином DocFile Browser (или специализированная утилита InsideMD).
Разберем этот ювелирный процесс по шагам:
1Cv7.md.Ctrl + PgDn на файле). Мы заходим «внутрь» структуры метаданных, которая теперь выглядит как обычное дерево папок.MD Doctor (например, идем по пути \Report\Report_Number2930\).Container.Contents. Открываем его во встроенном текстовом просмотрщике Far Manager (клавиша F3), обязательно переключив кодировку в Windows-1251 (ANSI). В первой строке этого файла мы увидим реальное пользовательское имя объекта (например, «ОстаткиТМЦ» или «ВедомостьПоставщиков»).Report_Number2930) в чистом файле, копируем оттуда неповрежденные потоки данных (модуль, диалог) и заменяем ими поврежденные файлы в битом MD.Container.Contents остаются ссылки на объекты, которые уже были удалены из конфигурации. Сравнив структуру родительского каталога с чистой базой, мы можем вручную отредактировать список идентификаторов, удалив фантомные записи.Иногда диагностические утилиты выдают ошибку с указанием только внутреннего системного номера объекта, например: \\Subconto\\Subconto_Number5893, а прочитать заголовок Container.Contents не удается из-за критического повреждения сектора. Как понять, какому справочнику или виду субконто в Конфигураторе соответствует этот номер?
Для решения этой задачи проанализируем структуру каталога самой базы данных:
1Cv7.DD, а для версии SQL — 1Cv7.DDS.5893 или Subconto5893).Не забываем о встроенных механизмах саморезервирования платформы 1С 7.7. В каталоге базы данных при каждом изменении структуры метаданных Конфигуратор создает временную папку NEW_STRU. В ней хранится копия файла 1Cv7.md на момент начала последнего сохранения изменений. Если сбой произошел прямо во время сохранения или объединения, попробуйте заглянуть в эту папку. Часто находящийся там файл оказывается полностью работоспособным и позволяет откатиться на один шаг назад без потери проделанной работы.