Ошибка с кодом #-310 в платформе 1С:Предприятие 7.7 является одной из самых неприятных при использовании файлового варианта базы данных (DBF). Она сигнализирует о проблемах в работе движка CodeBase, который не может корректно обработать запись или блокировку в файле. Чаще всего это происходит, когда база разрастается до критических размеров или возникают конфликты на уровне сетевых протоколов Windows.
Разберем пошагово, как продиагностировать причину и какими методами можно «победить» эту ошибку.
Первым делом нам необходимо выяснить, не подошли ли таблицы базы данных к своим физическим пределам. Для формата 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С данные в этот файл записываться больше не будут. В этом случае поможет только свертка базы или удаление старых периодических значений.
Если файлы далеки от лимитов, но ошибка появляется при работе нескольких пользователей (или даже одного в монопольном режиме на современных ОС), проблема кроется в механизме блокировок. Движок CodeBase использует системные вызовы Windows для блокировки участков файлов, которые на протоколах SMB 2.0 и выше могут работать некорректно.
Рассмотрим способы решения этой проблемы:
Kernel37.dll или Kernel33.dll. Они вносят алгоритм задержки между опросами блокировок. Например, для Kernel33.dll рекомендуется задать переменную среды окружения Kernel33 со значением от 10 до 100 миллисекунд.Seven.dll: В ряде случаев требуется модификация основной библиотеки 1С (Seven.dll) с помощью Hex-редактора для изменения логики работы с блокировками. Это позволяет «обмануть» операционную систему при расчете смещения блокировки для файлов размером более 1 ГБ.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters следует установить параметры DirectoryCacheLifetime, FileNotFoundCacheLifetime и FileInfoCacheLifetime в значение 0.Иногда ошибка #-310 возникает из-за повреждения индексных файлов (*.cdx). Выясним, помогает ли стандартное переиндексирование. В сложных случаях рекомендуется:
.cdx из каталога базы данных вручную.Если виновником является файл 1SCONST.DBF (периодические реквизиты), и его размер невозможно сократить простой сверткой, проанализируем возможность изменения метаданных. Важный совет: многие программисты рекомендуют переносить наиболее интенсивно меняющиеся периодические реквизиты (например, цены номенклатуры) в Регистры сведений (если это комплексная конфигурация) или просто в обычные справочники. Это позволит разгрузить таблицу констант и избежать ошибки лимита записей в будущем.
Резюме: Чтобы победить ошибку #-310, сначала проверьте количество записей в 1SCONST.DBF. Если записей больше 16 миллионов — поможет только удаление старой истории. Если записей мало — применяйте патчи блокировок и настраивайте параметры кэширования SMB в Windows.