Регулярные сбои в работе файловых баз данных 1С — это классическая проблема небольших внедрений. Ситуация усугубляется, когда администраторы пытаются «починить» базу штатными средствами вроде утилиты chdbfl.exe, не понимая принципов её работы. В результате физическая целостность файла восстанавливается, но бизнес сталкивается с катастрофической потерей документов и битыми ссылками вида «Объект не найден».
В этой статье мы подробно разберем комплексный подход к спасению данных. Мы выясним, почему стандартная утилита разрушает логические связи, как точечно перенести уцелевшую информацию из бэкапов, как правильно сделать свертку поврежденной базы и как навсегда защитить файловую базу от сбоев без серьезных финансовых затрат.
Для начала проанализируем, что происходит при запуске утилиты chdbfl.exe. База данных 1С формата .1CD состоит из блоков-страниц. Когда в системе происходит сбой (например, аварийно завершился сеанс пользователя, отключили электричество или зависла локальная сеть), в файле повреждаются индексы или заголовки таблиц.
Утилита chdbfl.exe работает по методу «грубой силы». Она проверяет физическую структуру таблиц. Если строка данных или целая таблица не соответствует контрольной сумме или имеет некорректный заголовок, утилита просто удаляет поврежденный участок, чтобы база смогла физически открыться в платформе 1С. Вместе с поврежденным заголовком могут удалиться сотни и тысячи документов за последние месяцы работы. Именно это и произошло в рассматриваемой ситуации.
Чтобы минимизировать потери при последующих сбоях, рассмотрим альтернативные варианты восстановления:
_Document150) и выгрузить уцелевшие записи в формате XML или MXL, чтобы затем импортировать их в чистую конфигурацию.CONFIG или индексы таблиц итогов. Специалисты могут взять «здоровую» пустую базу той же конфигурации и релиза, скопировать правильные заголовки таблиц с помощью HEX-редактора (например, HxD) и переписать поврежденные сектора в сломанной базе. Это позволяет запустить базу без потери пользовательских транзакций.В нашем распоряжении есть две базы: старая архивная копия с частью утерянной информации и актуальная рабочая база, в которой отсутствуют два больших блока данных за прошлые периоды. Наша задача — объединить их, избежав дублирования и хаоса.
Простое использование обработки ВыгрузкаЗагрузкаДанныхXML «в лоб» не решит проблему, так как в рабочей базе уже существуют битые ссылки (объекты со статусом <Объект не найден> [Уникальный идентификатор GUID]). Нам необходимо восстановить ссылочную целостность.
Разберем по шагам технологию «оживления» битых ссылок:
<Объект не найден> (8471c93-9c87-11e8-80e9-00155d012401).СоздатьДокумент(), так как система сгенерирует новый GUID, и битая ссылка не закроется. Нам нужно принудительно установить старый GUID. Посмотрим на пример кода:
// Пример программного восстановления документа по его историческому GUID
ИскомыйGUID = Новый УникальныйИдентификатор("d8471c93-9c87-11e8-80e9-00155d012401");
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(ИскомыйGUID);
// Проверяем, действительно ли в базе нет этого документа (ссылка битая)
Если СсылкаНаДокумент.ПолучитьОбъект() = Неопределено Тогда
// Создаем новый документ
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Принудительно назначаем ему сохраненный GUID из бэкапа
НовыйДокумент.УстановитьСсылкуНового(СсылкаНаДокумент);
// Заполняем реквизиты данными, полученными из резервной копии
НовыйДокумент.Дата = ДатаИзБэкапа;
НовыйДокумент.Номер = НомерИзБэкапа;
НовыйДокумент.Организация = ОрганизацияИзБэкапа;
НовыйДокумент.Контрагент = КонтрагентИзБэкапа;
// Записываем документ с проведением, чтобы восстановить движения в регистрах
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Также проанализируем возможность реконструкции по Журналу регистрации. Если в рабочей базе пропали документы за определенный период, но сам журнал регистрации (файлы в каталоге базы 1Cv8Log) уцелел, мы можем прочитать лог транзакций. Существуют специализированные обработки, которые считывают события создания и изменения объектов из журнала регистрации и воссоздают удаленные документы с теми же реквизитами, которые вносили пользователи.
В обсуждении прозвучала идея сделать свертку на начало 2019 года, чтобы отсечь проблемный 2018 год, оставив только документы установки цен для анализа ценообразования. Свертка — это отличный инструмент оптимизации, но проводить её на поврежденной базе напрямую категорически запрещено.
Выясним причину: механизм свертки базы рассчитывает остатки на дату свертки программно, опираясь на движения документов за прошлые периоды (в нашем случае — за 2018 год). Если часть документов 2018 года физически удалена утилитой chdbfl.exe, то регистры накопления будут пусты или содержать некорректные данные. Сформированные документы ВводОстатков на 01.01.2019 будут абсолютно неверными, и учет превратится в хаос.
Разберем по шагам правильный алгоритм подготовки и проведения свертки:
УстановкаЦенНоменклатуры. Это позволит сохранить всю историю ценообразования для последующего анализа.ВводОстатков скорректируйте вручную на основании реальных данных инвентаризации.Участники форума справедливо отмечают, что файловый вариант работы предназначен исключительно для демонстрационных или однопользовательских целей. Если с базой одновременно работают несколько человек, повреждения файлов неизбежны. Основная причина — сетевой протокол SMB, используемый при доступе к «расшаренной» папке на ПК-сервере. Достаточно одному компьютеру пользователя зависнуть, потерять Wi-Fi соединение или пережить скачок напряжения в момент записи транзакции — и весь файл базы данных 1Cv8.1CD будет разрушен.
Если бюджет компании ограничен и покупка полноценной лицензии на сервер 1С не планируется, рассмотрим надежное и абсолютно бесплатное решение этой проблемы:
При такой архитектуре пользователи работают с базой не напрямую через общий сетевой ресурс, а обращаются к веб-серверу по протоколам HTTP/HTTPS через тонкий клиент.
Проанализируем преимущества этой схемы:
1Cv8.1CD локально работает только веб-сервер (IIS или Apache), запущенный на главном компьютере. Сетевые клиенты не имеют прямого доступа к файловой системе базы.Разберем краткий алгоритм публикации базы на бесплатном веб-сервере Apache:
http://192.168.1.10/my_base).Применение веб-сервера полностью нивелирует проблему физического разрушения файлов базы данных для небольших рабочих групп (до 5–10 пользователей) без дополнительных затрат на лицензии 1С.