Как исправить ошибку #-310 в 1С 7.7 при работе с большими базами DBF?

Программист 1С v7.7
← На главную

Ошибка с кодом #-310 в платформе 1С:Предприятие 7.7 является одной из самых неприятных при использовании файлового варианта базы данных (DBF). Она сигнализирует о проблемах в работе движка CodeBase, который не может корректно обработать запись или блокировку в файле. Чаще всего это происходит, когда база разрастается до критических размеров или возникают конфликты на уровне сетевых протоколов Windows.

Разберем пошагово, как продиагностировать причину и какими методами можно «победить» эту ошибку.

Шаг 1: Проверка физических лимитов DBF-файлов

Первым делом нам необходимо выяснить, не подошли ли таблицы базы данных к своим физическим пределам. Для формата DBF в 1С 7.7 существует два критических порога: размер файла более 1 ГБ (или 2 ГБ в зависимости от версии движка) и количество записей более 16 777 215. Особое внимание стоит уделить файлу 1SCONST.DBF, где хранится история всех периодических реквизитов (цены, ставки налогов и т.д.).

Проанализируем состояние всех файлов базы данных с помощью специальной обработки. Создадим форму, разместим на ней таблицу значений Тз и выполним следующий код:


ИмяНачКаталога = КаталогИБ();
Тз.НоваяКолонка("Файл", , , , , 15);
Тз.НоваяКолонка("Размер", "Число", 15, 0, "Размер (байт)", 12);
Тз.НоваяКолонка("Пр", "Число", 5, 1, "Заполнен % (размер)", 8);
Тз.НоваяКолонка("Записей", "Число", 15, 0, "Кол-во записей", 12);
Тз.НоваяКолонка("Пр2", "Число", 5, 1, "Заполнен % (записи)", 8);

Каталог = СокрЛП(ИмяНачКаталога);
Фс.УстТекКаталог(Каталог);
БД = СоздатьОбъект("XBASE");
Файл = Фс.НайтиПервыйФайл("*.dbf");

Пока Фс.СуществуетФайл(Каталог + Файл) = 1 Цикл
    Тз.НоваяСтрока();
    Тз.Файл = Файл;
    РазмерФайла = ""; АтрибутыФайла = "";
    Фс.АтрибутыФайла(Файл, РазмерФайла, АтрибутыФайла);
    
    Тз.Размер = РазмерФайла;
    // Расчет процента от 2 ГБ (2 147 483 648 байт)
    Тз.Пр = РазмерФайла / 21474836.48;
    
    Попытка
        БД.ОткрытьФайл(Каталог + Файл, , 1);
        Тз.Записей = БД.КоличествоЗаписей();
        // Предел количества записей для DBF в 1С 7.7
        Тз.Пр2 = Тз.Записей / 167772.15;
        БД.ЗакрытьФайл();
    Исключение
        Тз.Записей = 0;
        Тз.Пр2 = 0;
    КонецПопытки;
    
    Файл = Фс.НайтиСледующийФайл();
    Если СокрЛП(Файл) = "" Тогда Прервать; КонецЕсли;
КонецЦикла;
Тз.Сортировать("Записей-");

Если в колонке "Заполнен % (записи)" вы видите значения, близкие к 100%, значит, стандартными средствами 1С данные в этот файл записываться больше не будут. В этом случае поможет только свертка базы или удаление старых периодических значений.

Шаг 2: Устранение проблем с блокировками (Kernel37)

Если файлы далеки от лимитов, но ошибка появляется при работе нескольких пользователей (или даже одного в монопольном режиме на современных ОС), проблема кроется в механизме блокировок. Движок CodeBase использует системные вызовы Windows для блокировки участков файлов, которые на протоколах SMB 2.0 и выше могут работать некорректно.

Рассмотрим способы решения этой проблемы:

  1. Использование библиотек-патчей: Существуют модифицированные библиотеки, такие как Kernel37.dll или Kernel33.dll. Они вносят алгоритм задержки между опросами блокировок. Например, для Kernel33.dll рекомендуется задать переменную среды окружения Kernel33 со значением от 10 до 100 миллисекунд.
  2. Правка Seven.dll: В ряде случаев требуется модификация основной библиотеки 1С (Seven.dll) с помощью Hex-редактора для изменения логики работы с блокировками. Это позволяет «обмануть» операционную систему при расчете смещения блокировки для файлов размером более 1 ГБ.
  3. Настройка сетевых протоколов: Если база лежит на сервере, необходимо отключить кэширование метаданных SMB на клиентских машинах. В реестре Windows по адресу HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters следует установить параметры DirectoryCacheLifetime, FileNotFoundCacheLifetime и FileInfoCacheLifetime в значение 0.

Шаг 3: Техническое обслуживание индексов

Иногда ошибка #-310 возникает из-за повреждения индексных файлов (*.cdx). Выясним, помогает ли стандартное переиндексирование. В сложных случаях рекомендуется:

Шаг 4: Оптимизация структуры данных

Если виновником является файл 1SCONST.DBF (периодические реквизиты), и его размер невозможно сократить простой сверткой, проанализируем возможность изменения метаданных. Важный совет: многие программисты рекомендуют переносить наиболее интенсивно меняющиеся периодические реквизиты (например, цены номенклатуры) в Регистры сведений (если это комплексная конфигурация) или просто в обычные справочники. Это позволит разгрузить таблицу констант и избежать ошибки лимита записей в будущем.

Резюме: Чтобы победить ошибку #-310, сначала проверьте количество записей в 1SCONST.DBF. Если записей больше 16 миллионов — поможет только удаление старой истории. Если записей мало — применяйте патчи блокировок и настраивайте параметры кэширования SMB в Windows.

← На главную