Как изменить ID справочника в 1С 7.7 при его переполнении?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе длительной эксплуатации баз данных 1С:Предприятие 7.7 в файловом режиме (DBF) разработчики иногда сталкиваются с критической ошибкой переполнения поля ID в справочниках. Архитектура системы ограничивает количество элементов в одном справочнике значением, определяемым 36-ричной системой счисления (максимально 2 176 782 335 записей). Когда этот лимит достигнут, система перестает создавать новые объекты. Рассмотрим, как можно решить эту проблему и корректно изменить идентификаторы.

Вариант 1: Использование УРБД для изменения префикса базы

Если справочник является общим или база была расширена, использование механизмов УРБД (Управление распределенными информационными базами) позволяет изменить суффикс (префикс) базы данных. Идентификаторы объектов в 1С 7.7 уникальны в связке «номер + сигнатура базы». При смене сигнатуры новые объекты начнут создаваться с иными кодами, что позволит временно обойти ограничение.

Вариант 2: Создание нового справочника и перенос данных

Этот метод считается более «чистым» с точки зрения целостности структуры метаданных, так как позволяет избежать прямых манипуляций с системными файлами DBF. Разберем его по шагам:

  1. Откройте Конфигуратор и добавьте новый справочник с аналогичной структурой (можно скопировать старый справочник с помощью Ctrl+Insert и Shift+Insert).
  2. Напишите обработку, которая перебирает все элементы старого справочника и переносит их данные в новый.
  3. После успешного переноса данных удалите старый справочник из метаданных.
  4. Переименуйте новый справочник, присвоив ему имя и идентификатор старого.

Важно: Этот метод требует обязательной переиндексации базы после внесения изменений в метаданные.

Вариант 3: Прямая модификация DBF-файла через ADODB

Если справочник не имеет внешних ссылок и используется исключительно для хранения данных (например, в отчетах), можно прибегнуть к прямому обновлению значений поля 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.

Рекомендации по безопасности

При выполнении любых манипуляций с системными данными, помните о следующих правилах:

Данный подход позволяет успешно решить проблему исчерпания идентификаторов, однако мы настоятельно рекомендуем использовать его только как крайнюю меру, если штатные средства (архивирование данных, выгрузка-загрузка) не дают нужного результата.

← На главную