Ошибка «Длина таблицы не кратна длине записи» является одной из самых серьезных проблем, с которыми может столкнуться администратор или программист 1С при работе с файловой базой данных (формат .1CD). Как правило, она сопровождается аварийным завершением работы программы и сообщением о том, что файл базы данных поврежден. В этой статье мы подробно разберем причины возникновения этой ситуации и пошагово рассмотрим методы ее устранения.
Для начала проанализируем ситуацию. В файловой версии 1С данные каждой таблицы хранятся в виде набора страниц фиксированного размера (обычно 4 Кб). Каждая запись внутри таблицы также имеет свою фиксированную длину. Ошибка кратности означает, что физический размер файла, в котором хранятся записи конкретной таблицы, не соответствует ожидаемому количеству полных записей. Проще говоря, в конце файла образовался «мусорный хвост» или данные обрезались посередине записи.
Рассмотрим основные причины, приводящие к такому состоянию:
_INFORG (регистры сведений, например, «Версии объектов»). В файловой базе 1С размер каждого из трех внутренних файлов таблицы (данные, индексы, неограниченные поля) не может превышать 4 Гб. Когда размер приближается к критической отметке, механизм выделения новых страниц может дать сбой.ValueStorage (Хранилище значения). Если логическая связь между основной таблицей и блоком двоичных данных нарушается, структура может быть повреждена.Прежде чем приступать к манипуляциям внутри конфигуратора, необходимо восстановить физическую целостность контейнера .1CD. Проанализируем возможности стандартной утилиты chdbfl.exe.
Эта утилита поставляется вместе с платформой и находится в папке bin установленной версии 1С. В отличие от внутреннего тестирования в конфигураторе, она работает с файлом напрямую, не требуя успешного открытия базы. Разберем порядок действий:
1Cv8.1CD.chdbfl.exe.Утилита проверит структуру страниц и, если будет обнаружена некратность длины, она «отсечет» поврежденные байты в конце таблицы, приводя ее размер в соответствие с длиной записи. Это позволит базе открыться в режиме «Конфигуратор».
Если проблема вызвана переполнением таблицы «Версии объектов» (что характерно для конфигураций с интенсивным документооборотом), необходимо уменьшить количество хранимых данных. Рассмотрим, как это сделать программно, если стандартные средства очистки не справляются из-за ошибок.
Выясним причину разрастания. Скорее всего, в вашей базе включено версионирование для всех объектов без ограничения срока хранения. Напишем пример кода для удаления старых записей из регистра сведений ВерсииОбъектов. Вы можете использовать подобную обработку, запустив ее в режиме «1С:Предприятие»:
// Пример удаления записей до определенной даты
ДатаОчистки = '20180101000000';
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДатаВерсии.Установить(ДатаОчистки, ВидСравнения.Меньше);
// Если записей слишком много, удаление нужно делать порциями
// В данном примере рассмотрим упрощенный механизм
НаборЗаписей.Записать();
Важно помнить: простое удаление записей из регистра не уменьшает физический размер файла базы данных. Система лишь помечает записи как удаленные, чтобы использовать это место в будущем.
Проанализируем ситуацию: мы удалили данные, но файл 1Cv8.1CD все еще занимает 4 Гб и выдает ошибку. Чтобы физически высвободить место и перестроить структуру таблиц, необходимо выполнить процедуру сжатия.
Разберем последовательность действий в «Конфигураторе»:
Во время этого процесса 1С полностью пересоздает файлы таблиц, исключая из них «дыры», оставшиеся после удаления записей. Именно после этой процедуры размер файла на диске должен существенно уменьшиться, а ошибка кратности исчезнуть.
Иногда повреждения настолько серьезны, что файловое сжатие завершается аварией. В этом случае рассмотрим метод миграции данных через клиент-серверный вариант. Это особенно актуально, если вы работаете в распределенной информационной базе (РИБ).
Посмотрим на алгоритм действий:
ВерсииОбъектов..dt..dt обратно.Процедура выгрузки-загрузки через .dt полностью перестраивает физическую структуру базы, что гарантированно решает проблему некратности записей.
Проанализируем особенности для узлов РИБ. Если вы очищаете версии объектов в одном узле, помните, что информация об удалении может начать мигрировать по всей сети. Рассмотрим лучшие практики:
Чтобы в будущем не сталкиваться с ошибкой «Длина таблицы не кратна длине записи», рекомендуем придерживаться следующих правил:
.1CD.Таким образом, мы выяснили, что ошибка кратности — это сигнал о достижении физических пределов или сбое записи. Комбинируя использование chdbfl.exe, очистку данных и обязательное «Сжатие таблиц», вы сможете восстановить работоспособность системы и обеспечить ее стабильную работу в дальнейшем.