Ситуация
Маленькая файловая база Бух3, учёт ведется 4 года, во время очередного обновления вылетает конфигуратор, при повторной попытке обновления имеем сообщение о невозможности применить изменения конфигурации.
Стандартный алгоритм действий:
- Долго себя ругаем за лень при создании архива перед обновлением;
- Откатываем конфигурацию на версию БД. При попытке запустить базу – ошибка, что таблица такая-то не найдена и вылет;
- Конфигуратор – тестирование и исправление, опять ошибка, что таблица такая-то отсутствует и невозможность ремонта;
- Попытка залить предыдущую типовую конфигурацию – опять критическая ошибка SDBL;
- Последняя попытка – выгрузка базы в DT, проходит частично и вылетает. При загрузке DT – получаем базу с 90% пустых таблиц и сохранившейся ошибкой при тестировании и исправлении.
- С удивлением узнаем, что у админа нет архивных копий от слова совсем;
- Осознание того, что проблема серьезная и требуется помощь. Отправка запроса в 1С и замечательный ответ о том, что ваша база разрушена, поэтому восстановите базу из архивной копии и будет вам хорошо.
- Гуглим, находим “Tool 1CD”, с горечью осознаём, что с версией 8.3.8 он работает только на чтение. Вывод – что-то чинить можно в режиме SQL.
- Загружаем базу из ранее выгруженного DT. Получаем те же проблемы, но на этот раз можно использовать Profiler и, например, создать недостающие таблицы, поля.
- Некоторое время закрываем проблемы по отсутствующим полям на SQL, пока не получаем вот такое сообщение
При условии работающей базы, мы вполне можем узнать что это за регистр, но работающей базы у нас нет, от слова совсем. - Опять гуглим на предмет: «А что такое схема базы данных», и вот тут информация крайне скудная. Официальная трактовка от 1С:
- Открываем эту табличку в SQL, это бинарные данные. Выгружаем их в файлик, открываем его Notepad++ и видим набор массивов с описанием полей базы:
Попытка найти информацию о том, что же это всё такое – результат нулевой. Ок, значит разбираться придётся самому. Перечитывание нескольких статей на инфостарте даёт понимание необходимости просмотра также данных сопоставление объектов конфигурации в файлике DBNames и самой конфигурации 1С. - Проблема, как найти идентификаторы объектов конфигурации 1С, решилась выгрузкой конфигурации в XML. Предварительно файл cf был выгружен с помощью Tool 1CD и загружен в чистую базу на SQL.
- Далее путем поиска таблицы в DBNames получаем её идентификатор, и ищем по нему в каталоге с выгруженной конфигурацией XML. Находим, удаляем объект в конфигураторе, снова попытка сохранения – другая ошибка, на другую таблицу… в общем повторяем итерацию в надежде вылечить базу до тех пор, пока не получаем вот такую ошибку:
- И это серьезная засада, потому как непонятно что ещё можно удалить из конфигуратора. Можно конечно запустить Profiler и найти на какую таблицу он ругается. Но в конце концов это всё закончилось такой ошибкой на поле Fld793 (ОбластьДанныхОсновныеДанные), и по профайлеру всё останавливается после проверки таблицы журналов и всё, вылетает.
- В итоге приходим к выводу, что «скотчем и соплями» проблему не решить, и придётся подходить к вопросу системно.
Инструментарий
- Загрузка/выгрузка данных из DBSchema и DBNames(используя алгоритм Deflate);
- Загрузка схемы объекта из чистой эталонной базы, автозамена реквизитов объекта на наши. Добавление/замена схем объектов в DBSchema;
- Проверка и автоматическое(не все) создание недостающих схем объектов, проверка реквизитов в таблице DBNames;
- Реструктуризация таблиц SQL, добавление/замена полей(не все);
- Загрузка в таблицы SQL, выгруженные из файловой базы с помощью Tool 1CD
upd. 2019.07.13 - Добавлена интеграция с обработкой //infostart.ru/public/275315/. Подключаемся к "убитой" базе, читаем список таблиц и загружаем напрямую нужные таблицы в SQL
upd. 2020.08.03 - Добавлена возможность прямой выгрузки из списка DBNames в базу. Добавлена возможность генерации перечня DBNames для случаев когда в схеме базы объекты есть, а в DBNames нехватает. Автоматически генерируется для констант, перечислений и документов, остальные объекты можно доработать по желанию.