При работе с устаревшими, но всё еще надежными системами на базе 1С:Предприятие 7.7 (особенно в конфигурации «Торговля и Склад»), системные администраторы и программисты часто сталкиваются с капризами формата DBF. Одной из самых неприятных ситуаций является «Невосстановимая ошибка Базы Данных. Код: -4» при попытке выполнить обмен данными через механизм УРБД (Управление распределенными информационными базами). Рассмотрим подробно, почему это происходит и как вылечить базу, если массовое изменение реквизитов (например, ставки НДС) привело к невозможности синхронизации с периферийными базами.
Для начала проанализируем, что скрывается за кодом -4. В движке CodeBase, который 1С 7.7 использует для работы с DBF-файлами, эта ошибка классифицируется как Read Error или Data file is not a table. В контексте 1С это означает одно из двух:
SC84.dbf) указывает на одно количество записей, а фактически файл обрывается раньше.В рассматриваемом случае проблема возникла после массовой замены ставки НДС. Казалось бы, в центральной базе (ЦБ) всё прошло успешно, но периферийная база отказывается принимать изменения. Это происходит потому, что механизм УРБД считывает данные иначе, чем обычная форма справочника — он проходит по всей таблице регистрации изменений 1SDBSET и пытается упаковать данные каждого измененного объекта. Если в объекте сидит «битый» символ, процесс обрывается.
Как показывает практика, наиболее частой причиной ошибки при обмене в ТиС 7.7 являются символы CR (возврат каретки, код 13) и LF (перевод строки, код 10), случайно попавшие в наименование номенклатуры. Проанализируем ситуацию: при замене НДС программным способом (обработкой) 1С перезаписывает объект. Если в наименовании уже был скрытый «мусор», при перезаписи индексы могут перестроиться таким образом, что чтение этой записи станет критическим для выгрузки.
Важный момент: Ошибка часто не вылезает в ЦБ при работе пользователей, так как 1С в обычном режиме может «проглатывать» такие символы в экранных формах, но «спотыкается» о них при формировании текстового файла выгрузки обмена.
Если справочник номенклатуры огромный (десятки тысяч позиций), искать одну проблемную карточку вручную невозможно. Проанализируем алгоритм быстрого поиска:
Чтобы не гадать, где именно спрятался плохой символ, мы можем написать обработку, которая «прочешет» справочник Номенклатура и удалит недопустимые символы. Рассмотрим пример кода для такой очистки:
Процедура ОчиститьНаименования()
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
ТекНаим = Спр.Наименование;
ТекПолнНаим = Спр.ПолнНаименование;
// Удаляем символы перевода строки и возврата каретки
НовНаим = СтрЗаменить(ТекНаим, Симв(10), "");
НовНаим = СтрЗаменить(НовНаим, Симв(13), "");
НовПолнНаим = СтрЗаменить(ТекПолнНаим, Симв(10), " ");
НовПолнНаим = СтрЗаменить(НовПолнНаим, Симв(13), " ");
Если (НовНаим <> ТекНаим) Или (НовПолнНаим <> ТекПолнНаим) Тогда
Сообщить("Исправлен элемент: " + Спр.ТекущийЭлемент());
Спр.Наименование = НовНаим;
Спр.ПолнНаименование = НовПолнНаим;
Спр.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание: В 1С 7.7 функция СтрЗаменить работает достаточно быстро. Мы проверяем и краткое, и полное наименование. Символы с кодами 10 и 13 — главные виновники проблем в DBF-версиях.
Если программная очистка не помогла, выясним причину на физическом уровне. Для этого необходимо запустить Тестирование и исправление ИБ (Конфигуратор -> Администрирование -> Тестирование и исправление ИБ).
Обязательно выберите пункты:
.CDX, что часто решает проблему ошибки -4, если она была в индексе).Рассмотрим ситуацию, когда даже ТИИ не может справиться. Это бывает при повреждении Memo-полей (файлы с расширением .FPT). Если в справочнике номенклатуры есть поля неограниченной длины, они хранятся отдельно. Ошибка ввода-вывода может возникать при попытке прочитать ссылку на блок в Memo-файле, который физически отсутствует.
В этом случае можно попробовать:
SC84.dbf и загрузить данные обратно. При выгрузке «битая» запись либо пропустится, либо обработка выдаст ошибку на конкретном коде товара.Подведем итог: Ошибка «Код -4» при обмене УРБД — это сигнал о том, что в данных справочника Номенклатура присутствует «мусор» или физический дефект записи. Массовое изменение реквизитов (НДС) лишь активирует проблему, заставляя систему перечитывать и регистрировать эти записи для обмена. Последовательная очистка наименований от символов Симв(10) и Симв(13) в сочетании с реиндексацией решают проблему в 99% случаев.