В практике администрирования и поддержки решений на платформе «1С:Предприятие» иногда возникают критические ситуации, когда база данных переходит в так называемое «полуразрушенное» состояние. Конфигурация запускается в режиме предприятия, пользователи могут вести учет, однако при попытке выполнить обновление система выдает ошибку «Файл не содержит доступных обновлений», наглухо зависает или аварийно завершает работу конфигуратора с ошибками реструктуризации базы данных SDBL.
Проанализируем подобную ситуацию на примере конфигурации 1С:Бухгалтерия предприятия 3.0. Выясним глубинные технические причины возникновения таких сбоев, разберем физическую природу внутренних ошибок платформы и рассмотрим пошаговые методики гарантированного восстановления работоспособности базы данных без потери накопленной информации.
Для того чтобы понять, почему база данных отказывается обновляться и выдает ошибки при попытке объединения с типовым файлом конфигурации (*.cf), заглянем под капот платформы «1С:Предприятие». Любой объект метаданных — будь то справочник Контрагенты, документ РеализацияТоваровУслуг или реквизит табличной части — идентифицируется системой не по его символьному имени, а по уникальному внутреннему 128-битному идентификатору — GUID (UUID).
Когда база данных обновляется стандартным образом (через поддержку), платформа строго сопоставляет объекты старой конфигурации с объектами новой по их UUID. Однако, если базу снимают с поддержки и пытаются вносить в нее изменения некорректными методами (например, путем ручного переноса объектов через буфер обмена из других конфигураций, некорректного копирования XML-структур или хаотичного сравнения-объединения без сохранения конфигурации поставщика), уникальные идентификаторы метаданных начинают «разъезжаться».
В результате мы получаем ситуацию «псевдотиповой» конфигурации. Внешне справочник называется точно так же, его структура полей совпадает с типовой, но его UUID в базе данных отличается от UUID аналогичного справочника в оригинальном дистрибутиве 1С. При попытке выполнить обновление платформа сравнивает UUID объектов:
Если в этот момент принудительно накатить чистый типовой *.cf файл без ручного сопоставления объектов, платформа физически удалит исходные таблицы базы данных, содержащие всю накопленную информацию по этому объекту, и создаст абсолютно новые пустые таблицы. Данные будут безвозвратно утеряны. Если же мы пытаемся обновиться стандартным файлом обновления (*.cfu), платформа просто отказывается это делать, выдавая ошибку отсутствия доступных обновлений, так как не может сопоставить структуру метаданных.
При попытке принудительного сравнения и объединения поврежденной конфигурации с типовой часто возникает критическая ошибка реструктуризации СУБД: «Таблица ... не создана в новом поколении». Разберем техническую причину этого явления.
Механизм SDBL (Simple DataBase Layer) — это внутренний программный слой платформы 1С, который транслирует обобщенные запросы к метаданным в низкоуровневые SQL-запросы к конкретной СУБД (MS SQL Server, PostgreSQL, IBM DB2 или локальный движок файловой базы *.1CD).
В процессе реструктуризации (который запускается при обновлении конфигурации базы данных по клавише F7) платформа выполняет следующие действия:
Если в структуре базы данных имеются логические нарушения (например, битые ссылки в системной таблице Config, дубликаты UUID метаданных или циклические ссылки), транзакция реструктуризации аварийно прерывается базой данных на первом или втором шаге. Слой SDBL пытается обратиться к ожидаемой таблице нового поколения, которая физически не была создана из-за прерывания транзакции, и выбрасывает критическую ошибку.
Стоит отметить, что к подобному сбою могут приводить и внешние факторы, такие как жесткое прерывание процессов СУБД из-за нехватки оперативной памяти или перегрузки процессора. Например, если на сервере или рабочем компьютере параллельно выполняются фоновые процессы (такие как несанкционированный скрытый майнинг или тяжелое резервное копирование), дисковая подсистема и CPU могут не справиться с нагрузкой, транзакция реструктуризации отвалится по таймауту, оставив таблицы базы данных в заблокированном и разрушенном промежуточном состоянии.
Если в свойствах конфигурации затерты или искажены сведения о версии, нам необходимо точно выяснить, на каком релизе фактически находится база данных, чтобы подобрать идентичный чистый *.cf файл для восстановления структуры. Для этого воспользуемся регистром сведений, куда записывается вся история обновлений конфигурации.
Запустим базу данных в режиме «1С:Предприятие». Перейдем в функции для технического специалиста (или откроем регистр напрямую через навигационную ссылку) и найдем регистр сведений с именем ВерсииПодсистем.
Проанализируем записи этого регистра:
БухгалтерияПредприятия или StandardEnterpriseAccounting).Версия. Этот ресурс содержит точный номер релиза (например, 3.0.59.56), на котором база данных успешно завершила последнее обновление данных на уровне предприятия.БСП - Библиотека Стандартных Подсистем). Это поможет нам убедиться, что в базе нет «каши» из несовместимых модулей от разных релизов.Прежде чем приступать к исправлению метаданных, мы обязаны исключить физическое повреждение файлов базы данных. Все процедуры выполняем строго на копии базы данных!
Проведем стандартный комплекс восстановительных работ:
chdbfl.exe (она находится в папке bin установленной платформы 1С). Запустим проверку с установленным флагом «Исправлять обнаруженные ошибки».*.dt) и загрузим его обратно в чистую созданную базу. Эта процедура позволяет полностью пересоздать структуру хранения данных на физическом уровне, очистить СУБД от накопленного системного мусора и временных таблиц.Если физических ошибок в базе данных не обнаружено, но конфигурация все еще «разъехалась» по идентификаторам и не желает обновляться, применим метод ручного сопоставления объектов. Этот процесс требует предельной внимательности, но гарантирует сохранение данных.
Рассмотрим алгоритм по шагам:
3.0.59.56). Создаем пустую базу из этого шаблона и выгружаем из нее чистый файл конфигурации 1cv8.cf.1cv8.cf типовой конфигурации.Валюты или документы) помечены пиктограммами «удаления» в основной конфигурации и «создания» из файла, несмотря на идентичность их имен. Это прямое следствие несовпадения внутренних UUID.В особо запущенных случаях, когда база данных подверглась необратимым деформациям и конфигуратор аварийно завершает работу при любой попытке сравнения или сохранения конфигурации, единственным выходом остается перенос данных в чистую типовую базу.
Почему стандартная выгрузка всей базы через XML-обмен зависает и раздувается до гигантских объемов? Причина кроется в нарушении ссылочной целостности метаданных. Когда обработка начинает выгружать, например, документ, она пытается рекурсивно выгрузить все связанные с ним объекты (контрагентов, договора, номенклатуру, физических лиц). Если в базе повреждена структура связей, процесс выгрузки попадает в бесконечный цикл зацикливания ссылок, дублируя одни и те же данные миллионы раз в выходной файл.
Чтобы избежать этого, применим тактику послойной (порционной) выгрузки данных без переноса связанных объектов по ссылкам.
Разберем этот процесс по шагам:
1С:Бухгалтерия актуального или близкого релиза из официального шаблона поставщика.Валюты, Банки, КлассификаторЕдиницИзмерения, СтраныМира). Выгружаем их в XML-файл и сразу загружаем в чистую базу-приемник.Организации, ПодразделенияОрганизаций, Склады, ФизическиеЛица). Производим загрузку в приемник.Номенклатура, Контрагенты, а затем справочник ДоговорыКонтрагентов. На этом этапе внимательно следим за журналом регистрации базы-приемника. Если при загрузке какого-то объекта происходит сбой, мы сразу локализуем конкретный «битый» элемент и сможем пропустить его или исправить вручную в исходной базе.ВводОстатков. Это кардинально снизит объем переносимых данных и очистит базу от накопившихся ошибок прошлых периодов.ПоступлениеТоваровУслуг, затем РеализацияТоваровУслуг) и с ограничением по периоду (помесячно или подекадно).Такой системный послойный подход гарантирует успешный перенос всей важной информации даже из самой безнадежно разрушенной информационной базы.
Рассмотрим еще один профессиональный метод «обмана» конфигуратора, когда платформа блокирует изменение метаданных в основной базе. Мы можем использовать для лечения механизм Распределенных Информационных Баз (РИБ):
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
*.cf) через меню Конфигурация — Загрузить конфигурацию из файла.... База успешно примет типовую структуру, а все накопленные данные перенесутся в чистые обновляемые таблицы.Используя предложенные методики, мы сможем успешно диагностировать причины сбоев, восстановить корректные внутренние уникальные идентификаторы метаданных и вернуть поврежденную базу 1С:Бухгалтерия 3.0 на стандартную поддержку для последующих беспрепятственных обновлений.