При выполнении процедуры «Тестирование и исправление информационной базы» (ТИИ) в файловой версии 1С:Предприятия 7.7 пользователи иногда сталкиваются со следующей ошибкой:
Файл 1SBLOB.dbf. Запись 443365. Поле BLOCKNO. Неверное содержимое поля Numeric - "****"
Разберем детально, почему возникает эта ошибка, как устроена структура хранения длинных строк в DBF-версии 1С 7.7 и какими способами можно устранить проблему без потери важных данных.
Проанализируем механику работы 1С 7.7 с реквизитами неограниченной длины. В файловом варианте базы данных (DBF) текстовые поля неограниченной длины и периодические данные неограниченной длины хранятся в специальной служебной таблице 1SBLOB.dbf.
Каждая длинная строка разбивается платформой на отдельные текстовые фрагменты — блоки размером по 80 символов (поле BLOCK, тип Char(80)). Для поддержания порядка этих блоков используется служебное поле BLOCKNO (номер блока).
Рассмотрим ограничение разрядности этого поля в структуре DBF:
BLOCKNO имеет жестко заданный тип Numeric(4,0).Numeric(4,0), платформа записывает в поле символы ****, обозначающие переполнение числового поля DBF.В результате этого повреждается индекс таблицы 1SBLOB.dbf, а процедура ТИИ сигнализирует о некорректном содержимом поля.
Перед удалением или очисткой записей выясним, к какому именно документу, справочнику или реквизиту относится поврежденная строка. Для этого воспользуемся редактором DBF-таблиц (например, DBF Viewer) и файлом описания структуры базы данных 1Cv7.DD.
Разберем порядок действий по шагам:
1SBLOB.dbf с помощью любого DBF-редактора и перейдем к номеру записи, указанной в логе ТИИ (например, 443365).OBJID (идентификатор объекта) и FIELDID (идентификатор реквизита).1Cv7.DD, который находится в каталоге базы данных, в любом текстовом редакторе.FIELDID. Файл 1Cv7.DD содержит таблицы соответствия ID реквизитов их названиям в конфигураторе (например, реквизит Комментарий документа ПриходнаяНакладная).OBJID, найдем конкретную позицию в базе через встроенный язык 1С 7.7.Рассмотрим пример кода на встроенном языке 1С 7.7 для получения ссылки на объект по известному OBJID:
// Пример поиска документа в 1С 7.7 по ID объекта
Док = СоздатьОбъект("Документ.ПриходнаяНакладная");
ЗначениеID = " 1FK2O "; // Значение OBJID из таблицы 1SBLOB
Если Док.НайтиПоРеквизиту("ID", ЗначениеID, 0) = 1 Тогда
Сообщить("Найден документ: " + Док.ТекущийДокумент());
// Очищаем переполненный реквизит
Док.Комментарий = "";
Док.Записать();
КонецЕсли;
Выяснив источник переполнения, рассмотрим варианты решения технической проблемы.
Вариант 1. Очистка реквизита через интерфейс или код 1С
Если проблемный объект найден, наиболее безопасный способ — обрезать или полностью очистить содержимое слишком длинной строки средствами платформы. Это автоматически удалит лишние блоки из 1SBLOB.dbf и восстановит корректную структуру.
Вариант 2. Корректировка записи напрямую в DBF
Если объект не находится или является «осиротевшей» записью (остатком удаленного документа), допустимо физически пометить битые записи на удаление или очистить их в DBF-редакторе. Важно: после прямой работы с файл-сервером DBF необходимо обязательно запустить переиндексацию базы данных или выполнить режим ТИИ «Пересчет служебных таблиц / Создание индексов».
Чтобы избежать повторения ошибок переполнения BLOCKNO, проанализируем архитектурные рекомендации:
1SBLOB хранятся в типах данных IMAGE / TEXT. В них отсутствует деление на 80-байтовые блоки, и ограничение BLOCKNO не применяется.