В процессе длительной эксплуатации баз данных 1С:Предприятие 7.7 в файловом режиме (DBF) разработчики иногда сталкиваются с критической ошибкой переполнения поля ID в справочниках. Архитектура системы ограничивает количество элементов в одном справочнике значением, определяемым 36-ричной системой счисления (максимально 2 176 782 335 записей). Когда этот лимит достигнут, система перестает создавать новые объекты. Рассмотрим, как можно решить эту проблему и корректно изменить идентификаторы.
Если справочник является общим или база была расширена, использование механизмов УРБД (Управление распределенными информационными базами) позволяет изменить суффикс (префикс) базы данных. Идентификаторы объектов в 1С 7.7 уникальны в связке «номер + сигнатура базы». При смене сигнатуры новые объекты начнут создаваться с иными кодами, что позволит временно обойти ограничение.
Этот метод считается более «чистым» с точки зрения целостности структуры метаданных, так как позволяет избежать прямых манипуляций с системными файлами DBF. Разберем его по шагам:
Ctrl+Insert и Shift+Insert).Важно: Этот метод требует обязательной переиндексации базы после внесения изменений в метаданные.
Если справочник не имеет внешних ссылок и используется исключительно для хранения данных (например, в отчетах), можно прибегнуть к прямому обновлению значений поля ID в файле DBF. Это решение требует осторожности и работы в монопольном режиме, либо при условии отсутствия блокировок со стороны пользователей.
Рассмотрим пример кода, позволяющий перебрать записи справочника и обновить их идентификаторы:
ПолноеИмяФайла = КаталогИБ() + "SC27225.DBF";
// Подключение к DBF через провайдер Microsoft.Jet.OLEDB.4.0
АДО = СоздатьОбъект("ADODB.Connection");
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + КаталогИБ() + ";Extended Properties=DBASE IV;";
АДО.Open(СтрокаСоединения);
rs = CreateObject("ADODB.Recordset");
rs.ActiveConnection = АДО;
rs.Source = "SC27225.DBF";
rs.CursorType = 0; // adOpenForwardOnly
rs.LockType = 3; // adLockOptimistic
rs.Open();
инд = 0;
Пока rs.EOF = 0 Цикл
инд = инд + 1;
ИД = СокрЛП(_IdToStr(инд)); // Используем системную функцию преобразования
rs.Fields("id").Value = ИД;
rs.Update();
rs.MoveNext();
КонецЦикла;
rs.Close();
АДО.Close();
В приведенном примере мы используем объект ADODB.Recordset для прямого доступа к таблице справочника. Обратите внимание на использование функции _IdToStr(), которая преобразует порядковый номер в 36-ричный вид, принятый в 1С 7.7.
При выполнении любых манипуляций с системными данными, помните о следующих правилах:
ID приведет к появлению «битых ссылок» (объект не найден). В таких случаях необходимо обновлять ссылки и во всех связанных таблицах.DBF-файле всегда выполняйте процедуру Тестирование и исправление или переиндексацию в Конфигураторе, чтобы актуализировать индексы CDX.ADODB при открытой базе 1С может привести к конфликтам доступа и повреждению файлов. Выполняйте операции, когда никто из пользователей не работает в системе.Данный подход позволяет успешно решить проблему исчерпания идентификаторов, однако мы настоятельно рекомендуем использовать его только как крайнюю меру, если штатные средства (архивирование данных, выгрузка-загрузка) не дают нужного результата.