Рассмотрим ситуацию, когда при работе с файловой базой 1С:Предприятие 7.7 возникает критический сбой с кодом Codebase Error - 70. Эта ошибка относится к категории низкоуровневых проблем движка CodeBase, который 1С использует для управления таблицами в формате DBF и индексными файлами CDX. Чаще всего проблема проявляется при получении обновлений из центральной базы, выполнении тяжелых отчетов или в моменты массовой записи движений регистров.
В этой статье мы подробно разберем природу данной ошибки, проанализируем структуру поврежденных файлов и изучим несколько методик восстановления работоспособности системы — от простых манипуляций с индексами до низкоуровневого исправления заголовков DBF.
Для начала проанализируем техническую суть сообщения. Ошибка - 70 в библиотеке CodeBase интерпретируется как Reading File. Она возникает в тот момент, когда движок пытается прочитать определенную запись, но сталкивается с физическим препятствием. Проанализируем возможные варианты:
.CDX содержит ссылку на запись номер 100, но в самом .DBF файле физически присутствует только 90 записей.DBF указано неверное количество записей или неправильная длина одной записи.d4go (внутренней функции движка).Разберем описание функции d4go, на которую опирается 1С при работе с данными:
int d4go( DATA4 *data, long recordNumber )
// Функция d4go считывает указанную запись в буфер.
// Чтобы операция прошла успешно, recordNumber должен быть
// > 0 и <= d4recCount (количеству записей в заголовке).
Если это условие нарушается или данные в позиции recordNumber не соответствуют формату, система выдает ошибку - 70.
Первое, что мы должны сделать — исключить проблему повреждения самих индексов. Посмотрим на примере файла RG9495.CDX, который упоминался в обсуждении. Файлы с префиксом RG — это таблицы остатков регистров. Они являются производными от таблиц движений (RA).
Попробуем стандартный метод восстановления:
RG9495.CDX (только индекс!).Если после этого ошибка сменилась с RG9495.CDX на RG9495.DBF, значит, проблема гораздо глубже и поврежден сам файл данных.
Когда простая переиндексация не помогает, нам необходимо изучить заголовок DBF файла. Рассмотрим структуру заголовка, на которую ориентируется движок CodeBase:
Проанализируем ситуацию: если в результате сбоя питания или сетевого лага 1С успела инкрементировать счетчик записей в байтах 04-07, но физически не дописала данные в конец файла, возникнет ошибка - 70.
Как исправить заголовок:
DBF-вьювером или HEX-редактором.(Размер_файла - Положение_первой_записи) / Длина_одной_записи. Это число должно в точности совпадать с тем, что записано в байтах 04-07.Если поврежденный файл начинается на RG (например, RG9495.DBF), у нас есть преимущество. В архитектуре 1С 7.7 таблицы RG хранят только итоги на начало месяца. Сами данные о движениях лежат в файлах RA.
Рассмотрим алгоритм безопасного пересчета:
RGxxxx.DBF и RGxxxx.CDX.Важный момент: Пересчет итогов может занять длительное время на слабых компьютерах. Если магазин или склад не может долго простаивать, воспользуемся методикой частичного восстановления:
1Cv7.MD и 1Cv7.DD.DBF файлы.RGxxxx.DBF из этой новой базы и подменяем им битый файл в рабочей базе.Как отметил автор темы, иногда проблема кроется в "пустых" записях в конце таблицы. В DBF-вьювере они могут отображаться как строки, заполненные символами NULL или пробелами, при этом программа может помечать их "зеленой галочкой" (корректные, но пустые).
Проанализируем, почему это мешает: 1С ожидает увидеть в поле PERIOD валидную дату начала месяца, а в полях SPxxxx — числовые значения. Наличие пустых строк в середине или конце файла сбивает механизмы агрегации.
Решение: Используйте утилиты для работы с DBF (например, DBF Commander или Clipper-утилиты), чтобы физически удалить записи, в которых ключевые поля (период, измерения) не заполнены. После удаления обязательно выполните упаковку (Pack) таблицы, чтобы физически перестроить файл.
Чтобы в будущем не сталкиваться с разрушением файлов CodeBase, рекомендуем выполнить следующие настройки на сервере и рабочих станциях:
Opportunistic Locking. Это предотвратит ситуацию, когда клиент кэширует запись в память, а сервер считает, что файл уже закрыт.SMB v2/v3 могут конфликтовать с логикой блокировок 1С 7.7. Рекомендуется использовать специальные патчи для BkEnd.dll, адаптирующие работу со старыми файловыми системами..DBF и .CDX в список исключений, чтобы антивирус не блокировал файл в момент изменения его размера.Используя предложенные методики, мы сможем восстановить базу данных даже при серьезных повреждениях структуры таблиц, минимизировав время простоя бизнеса.