В процессе эксплуатации файловых баз данных 1С (формат 1Cv8.1CD) нередко возникают ситуации аварийного завершения работы программы. Это может произойти из-за внезапного отключения электропитания, сбоев локальной сети или принудительного закрытия процесса пользователем. Одним из наиболее неприятных последствий таких сбоев является частичное разрушение внутренней структуры таблиц базы данных.
В данном материале мы подробно разберем специфический сценарий повреждения файловой базы, при котором обычные пользователи могут беспрепятственно заходить в систему и работать, в то время как пользователи с административными правами при попытке авторизации получают критическую ошибку "Файл базы данных поврежден". Мы проанализируем физику этого процесса, выясним причины некорректного поведения штатных утилит и рассмотрим пошаговые методы реанимации базы данных и спасения накопленных сведений.
Для понимания сути происходящего рассмотрим, как устроена авторизация в современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП). Учетные записи пользователей в таких системах разделены на два уровня:
v8users.Справочник.Пользователи и связанные с ними механизмы разграничения прав, включая справочник Справочник.ГруппыДоступа (физическое имя таблицы в СУБД — _Reference33) и его табличную часть Пользователи (физическое имя таблицы — _Reference33_VT747).Когда в информационную базу пытается войти рядовой пользователь с ограниченным набором ролей, платформа успешно авторизует его на платформенном уровне. Если логика его работы в системе не инициирует обращение к механизмам проверки групп доступа БСП (или эти проверки успешно обходятся кэшированными данными), сеанс запускается без ошибок.
Однако при попытке входа пользователя с административными ролями (ПолныеПрава или АдминистраторСистемы) БСП в обязательном порядке выполняет полную инициализацию прав доступа. На этом этапе программный код БСП обращается к таблице _Reference33 (Группы доступа) для сопоставления текущего пользователя с административной группой. Если эта таблица повреждена, СУБД возвращает платформе ошибку, сеанс аварийно прерывается, и на экран выводится сообщение о повреждении файла БД.
Попытка исправить ситуацию с помощью стандартной утилиты проверки файловой базы chdbfl.exe часто приводит к усугублению проблемы. Утилита chdbfl.exe предназначена для проверки физической целостности страниц файла 1Cv8.1CD. Если она обнаруживает неустранимые нарушения логической структуры или повреждения заголовков конкретной таблицы, она действует радикально — полностью удаляет поврежденную таблицу из файла базы данных. В результате после работы утилиты при любом обращении к объекту система выдает критическую ошибку SQL: "Таблица не найдена '_Reference33'".
Рассмотрим детальные инженерные методы решения этой проблемы, расположенные от простых к более сложным.
Если после работы утилиты chdbfl.exe база данных открывается в режиме Конфигуратора, мы можем заставить саму платформу 1С заново создать физическую структуру недостающих таблиц в файле базы данных. Для этого нам необходимо инициировать процедуру реструктуризации поврежденного объекта метаданных. Разберем этот процесс по шагам:
1Cv8.1CD перед началом любых манипуляций.Справочники -> ГруппыДоступа.ВременныйРеквизитДляРеструктуризации с типом данных Булево.В процессе обновления платформа проанализирует расхождения между метаданными конфигурации и фактической физической структурой таблиц в файле базы данных. Не обнаружив физических таблиц _Reference33 и _Reference33_VT747, СУБД платформы автоматически сгенерирует новые пустые таблицы с правильной структурой полей и индексов для соответствия обновленным метаданным.
После успешного завершения реструктуризации и сохранения изменений выполним обратную процедуру: удалим созданный временный реквизит из справочника ГруппыДоступа и еще раз обновим конфигурацию базы данных с помощью клавиши F7. Теперь физическая структура таблиц полностью восстановлена, хотя сами таблицы пока остаются пустыми.
В случаях, когда попытка реструктуризации через Конфигуратор прерывается системными ошибками СУБД, нам потребуется использовать специализированный инструмент низкоуровневой работы с файловыми базами 1С. Ранее популярная утилита Tool_1CD не всегда корректно поддерживает современные форматы баз данных (начиная с релиза платформы 8.3.8, где размер страницы по умолчанию равен 8 Кб). Поэтому мы будем использовать её современный и развивающийся аналог — кроссплатформенную утилиту ctool1cd.
С помощью этой утилиты мы скопируем корректную структуру поврежденных таблиц из чистой базы той же конфигурации и импортируем её в поврежденный файл базы данных. Проанализируем алгоритм выполнения этой операции:
.cf) или выгрузить файл конфигурации из поврежденной базы через Конфигуратор и загрузить его в новую чистую базу.ctool1cd и откроем в ней файл 1Cv8.1CD чистой базы данных._Reference33 и _Reference33_VT747._Reference33, вызовем контекстное меню и выберем пункт экспорта структуры таблицы во внешний XML-файл схемы. Сохраним файл под именем Reference33_schema.xml. Повторим операцию для таблицы табличной части, сохранив её как Reference33_VT747_schema.xml.ctool1cd наш поврежденный файл базы данных 1Cv8.1CD, предварительно переведя утилиту в режим редактирования (записи)._Reference33 и _Reference33_VT747, прописав их во внутренних служебных каталогах СУБД.После выполнения этих шагов платформа 1С перестанет аварийно завершать работу с ошибкой отсутствия таблиц СУБД, так как физические контейнеры для данных теперь присутствуют в файле базы данных.
После того как мы восстановили физическую структуру таблиц справочника групп доступа (одним из двух описанных выше способов), эти таблицы стали пустыми. При попытке зайти в режим "1С:Предприятие" под учетной записью администратора программный код БСП выполнит проверку прав, обратится к пустой таблице _Reference33, не найдет там записи о группе "Администраторы" и о вхождении туда текущего пользователя. Это приведет либо к ошибке инициализации прав, либо к отказу в доступе.
Рассмотрим методы, позволяющие обойти этот барьер и вернуть административный доступ к данным в пользовательском режиме.
Вариант А. Создание нового "независимого" администратора в Конфигураторе
Этот способ позволяет использовать встроенные механизмы автоматического создания служебных данных БСП при первом входе нового пользователя.
EmergencyAdmin. Важно, чтобы пользователя с таким именем ранее никогда не существовало в справочнике Справочник.Пользователи в режиме Предприятия.ПолныеПрава и АдминистраторСистемы (в зависимости от конфигурации названия ролей могут незначительно отличаться, нам необходимы максимальные административные права платформы). Нажмем ОК.EmergencyAdmin.При первом входе нового пользователя с полными платформенными правами программные модули БСП определят, что для данной учетной записи еще нет сопоставленных элементов в прикладных справочниках. Система запустит алгоритм первоначальной инициализации, автоматически создаст элемент в справочнике Справочник.Пользователи, создаст предопределенную группу доступа "Администраторы" в таблице _Reference33 и свяжет их между собой. База станет полностью доступной для администрирования.
Вариант Б. Применение параметров командной строки запуска
Если конфигурация использует современные версии БСП, мы можем временно отключить жесткий контроль прав и регламентные процедуры при старте системы с помощью специальных ключей запуска. Для этого добавим в строку запуска базы данных следующий параметр:
/C СтартБезПроверок
Или, в зависимости от версии БСП:
/C ЗапускБезПроверок
Данный параметр передается в код модуля управляемого приложения и указывает системе пропустить инициализационные проверки прав доступа БСП при старте, что позволит зайти в базу под существующим администратором и выполнить регламентные операции по восстановлению данных.
Вариант В. Использование привилегированного режима во внешних обработках
Если нам необходимо программно заполнить воссозданные пустые таблицы групп доступа, минуя ограничения прав текущего залогиненного пользователя (под которым мы зашли без админских прав), мы можем написать внешнюю обработку и запустить её выполнение в привилегированном режиме.
Посмотрим на пример кода, который мы можем разместить в модуле внешней обработки для программного наполнения справочника групп доступа:
Процедура ВосстановитьГруппуАдминистраторы() Экспорт
// Включаем привилегированный режим для обхода ограничений прав доступа
УстановитьПривилегированныйРежим(Истина);
// Проверим, существует ли уже элемент справочника
ГруппаАдмин = Справочники.ГруппыДоступа.НайтиПоНаименованию("Администраторы");
Если ГруппаАдмин.Пустая() Тогда
ГруппаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент();
ГруппаОбъект.Наименование = "Администраторы";
// Попытаемся найти и сопоставить предопределенный профиль "Администратор"
ПрофильАдмин = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Администратор");
Если Не ПрофильАдмин.Пустая() Тогда
ГруппаОбъект.Профиль = ПрофильАдмин;
КонецЕсли;
// Добавим основного администратора в табличную часть группы доступа
АдминистраторПользователь = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
Если Не АдминистраторПользователь.Пустая() Тогда
НоваяСтрока = ГруппаОбъект.Пользователи.Добавить();
НоваяСтрока.Пользователь = АдминистраторПользователь;
КонецЕсли;
Попытка
ГруппаОбъект.Записать();
Сообщить("Справочник Группы Доступа успешно инициализирован элементами.");
Исключение
Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Группа 'Администраторы' уже существует в базе данных.");
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Запустив данную обработку в пользовательском режиме (даже под учетной записью с ограниченными правами, если конфигурация позволяет открывать внешние обработки), мы программно восстановим необходимые записи в таблице _Reference33, после чего вход для основных администраторов системы будет разблокирован.
Если структура файла базы данных 1Cv8.1CD серьезно повреждена в нескольких местах и локальное восстановление таблиц не гарантирует стабильной работы системы в будущем, оптимальным решением будет перенос всех накопленных данных в новую, заведомо исправную базу данных.
Рассмотрим два основных инструмента для реализации этого сценария.
Инструмент 1. Выгрузка и загрузка данных XML
Для переноса данных мы можем использовать универсальную обработку ВыгрузкаЗагрузкаДанныхXML.epf. Этот инструмент выгружает данные на уровне объектов (документов, справочников, регистров), полностью игнорируя физические индексы СУБД исходного файла.
ВыгрузкаЗагрузкаДанныхXML.epf.Справочник.ГруппыДоступа и снимем с него отметку выгрузки. Это критически важно, так как попытка прочитать данные из поврежденной или пустой таблицы вызовет ошибку и прервет процесс экспорта..cf).Инструмент 2. Переход в облачный сервис (встроенный механизм БСП)
В современных конфигурациях 1С присутствует штатный механизм выгрузки данных для перехода во Фреш или другое облако. Этот механизм примечателен тем, что он формирует ZIP-архив с XML-описанием данных всей информационной базы, используя оптимизированные алгоритмы обхода ограничений платформы.
Мы подробно разобрали внутренние механизмы повреждения структуры файловой базы 1С при работе со справочником групп доступа БСП. Применение любого из описанных методов (реструктуризация метаданных, использование низкоуровневых утилит ctool1cd или выгрузка данных на логическом уровне) позволяет успешно восстановить работоспособность информационной базы без необходимости ручного редактирования файла базы данных в Hex-редакторах.
Для минимизации рисков повторения подобных инцидентов настоятельно рекомендуем перевести информационную базу на клиент-серверный вариант работы (под управлением СУБД PostgreSQL, MS SQL или аналогичных) при превышении размера файловой базы барьера в 4–6 Гб или при количестве одновременно работающих пользователей более 5–10 человек. Также крайне важно настроить ежедневное автоматическое создание резервных копий по расписанию с ведением архива глубиной не менее нескольких недель.