Приветствуем вас! В практике администрирования и разработки на платформе 1С:Предприятие нередки критические ситуации, когда база данных «умирает» — она перестает запускаться как в режиме «1С:Предприятие», так и в режиме «Конфигуратор». При этом у вас может не оказаться актуальной резервной копии. Единственным спасением становится попытка извлечь данные напрямую из поврежденного файла таблицы (например, 1Cv8.1CD для файлового варианта) с помощью низкоуровневых утилит, таких как легендарная программа Tool_1CD.
Однако здесь мы неизбежно сталкиваемся с серьезным техническим препятствием. Даже если мы создадим абсолютно чистую базу-приемник с точно таким же релизом конфигурации, физические имена таблиц и полей в исходной (поврежденной) базе и в новой чистой базе практически наверняка будут различаться. Например, справочник «Организации» в старой базе может называться Reference120, а в новой — Reference130. Реквизиты внутри этих таблиц также получат другие суффиксы (например, _Fld121 вместо _Fld131).
В этой статье мы подробно разберем, почему возникает эта проблема, как устроен механизм сопоставления метаданных DBNames, и рассмотрим эффективные методы решения этой задачи: от логического переноса через формат XML до прямого редактирования структуры базы данных.
Давайте разберем внутреннее устройство платформы 1С. Когда мы создаем объекты метаданных в конфигураторе (справочники, документы, регистры), платформа не создает в СУБД или файле 1CD таблицы с понятными именами вроде «Справочник.Организации». Вместо этого она генерирует системные имена: ReferenceN для справочников, DocumentN для документов, _InfoRegN для регистров сведений, где N — это порядковый номер.
Связь между понятным логическим именем (например, Справочник.Контрагенты), уникальным идентификатором объекта (UUID) и физическим именем таблицы (например, Reference120) хранится в специальной системной таблице базы данных под названием Params в поле с именем dbnames. Этот файл представляет собой бинарные данные, сжатые по алгоритму Deflate.
Порядковые номера таблицам присваиваются динамически в момент создания объекта в конфигураторе или в процессе обновления конфигурации. Если две базы данных создавались в разное время или обновлялись разными путями (например, одна база обновлялась последовательно через 10 релизов, а вторая была создана сразу из файла поставки новой версии), то последовательность создания таблиц будет отличаться. Соответственно, справочник, который в старой базе получил номер 120, в новой базе легко может получить номер 130. Прямое бинарное копирование таблиц в таком случае приведет к полной неработоспособности базы данных.
Прежде чем приступать к сложному низкоуровневому переносу таблиц, давайте проанализируем состояние «мертвой» базы. Часто база не открывается из-за незавершенных транзакций, сбоев динамического обновления («демонического» обновления) или повреждения индексных файлов. Перед извлечением таблиц выполним следующие действия:
1Cv8.1CD перед любыми манипуляциями!*.1CLa, *.1CLck).chdbfl.exe, которая находится в папке bin установленной платформы 1С. Отметьте флаг «Исправлять обнаруженные ошибки».Tool_1CD. Найдите таблицы, содержащие конфигурацию (Config, ConfigSave). Очень часто сбой происходит из-за того, что в базе зависли остатки «демонического» обновления. Попробуйте очистить таблицу ConfigSave или откатить конфигурацию к стабильной версии, удалив записи, связанные с незавершенным обновлением.Если эти базовые шаги не помогли, и конфигуратор по-прежнему отказывается открывать базу, переходим к методам извлечения данных.
Это самый безопасный и универсальный способ. Вместо того чтобы переносить таблицы физически и пытаться сопоставить их внутреннюю структуру, мы выгрузим данные на логическом уровне в универсальный формат XML, а затем загрузим их в чистую базу стандартными средствами платформы 1С.
Давайте рассмотрим этот процесс пошагово:
Tool_1CD. Утилита позволяет экспортировать содержимое таблиц справочников и документов в XML-файлы. На этом этапе программа автоматически преобразует физические структуры (строки и колонки таблицы Reference120) в структурированный XML-документ, где элементы будут описаны понятными именами метаданных.*.cf, который можно получить из аналогичного здорового релиза или попробовать извлечь из таблицы Config старой базы через ту же Tool_1CD).Reference130 вместо старой Reference120).Этот метод полностью исключает риск нарушения логической целостности базы данных и гарантирует, что структура новой базы останется абсолютно корректной.
Если вы все же решили переносить таблицы физически (путем копирования бинарных данных через утилиту), вам придется решить проблему битых ссылок. Давайте разберем, что такое _TREF и почему ссылки ломаются при переносе таблиц.
В базах данных 1С ссылки на другие объекты хранятся в виде пары значений: идентификатор типа (номера таблицы, на которую указывает ссылка, — это поле с суффиксом _TREF) и уникальный идентификатор самой записи (поле _RTRef или UUID). Если вы просто скопируете таблицу документов из старой базы, где ссылка на контрагента указывала на таблицу 120 (Reference120), в новую базу, где контрагенты лежат в таблице 130 (Reference130), все ссылки в документах станут «битыми» (в интерфейсе вы увидите ошибку «Объект не найден»).
Для решения этой проблемы автор утилиты Tool_1CD предусмотрел специальный механизм:
Tool_1CD.
Reference120=Reference130
Document50=Document55
_TREF, заменив старые идентификаторы таблиц на новые.После проведения этой операции таблицы можно безопасно импортировать в чистую базу, связи между объектами будут корректно восстановлены.
Этот способ подходит для опытных системных администраторов баз данных и разработчиков, работающих с клиент-серверным вариантом (SQL-серверы MS SQL, PostgreSQL и др.). Мы можем заставить платформу 1С думать, что старые физические таблицы соответствуют новым объектам конфигурации, путем изменения системной таблицы Params.
Давайте разберем алгоритм действий:
Params, где хранится запись с ключевым именем dbnames:
SELECT [BinaryData] FROM [Params] WHERE [FileName] = 'dbnames'
Reference120 привязанными к новым метаданным).Params базы данных на SQL-сервере с помощью UPDATE-запроса.Этот метод чрезвычайно сложен и требует глубокого понимания структуры хранения данных 1С, но он позволяет «подружить» конфигурацию с уже существующими таблицами без физического копирования гигабайтов данных.
Мы проанализировали различные варианты решения проблемы несовпадения имен таблиц в базах 1С. Давайте подведем итоги: