Работа с внешними файлами формата DBF в среде 1С часто сопряжена с использованием объекта XBase. Одной из самых неприятных и трудноуловимых проблем является ошибка "CODEBASE ERROR Error #: -20 creating file temporary working file". Эта ошибка возникает в момент создания или обновления индексного файла .cdx. Проанализируем причины возникновения этой ситуации и разберем по шагам способы её решения.
Ошибка с кодом -20 в движке CodeBase, который 1С использует для работы с DBF, расшифровывается как "Creating File Error". Это низкоуровневая ошибка операционной системы, означающая, что программа попыталась создать файл, но получила отказ. Рассмотрим подробнее, что именно может блокировать этот процесс:
.tmp.Особенность ошибки заключается в упоминании "temporary working file". При создании индекса движок CodeBase создает не сразу итоговый .cdx, а один или несколько временных файлов для сортировки данных. Если этот процесс прерывается, мы видим ошибку -20.
Часто программисты допускают ошибку, удаляя и пересоздавая индексный файл при каждой операции записи. Рассмотрим пример кода, который может приводить к сбоям на быстрых машинах:
// Сформируем пути к файлам
ФайлДБФ = "C:\Data\mybase.dbf";
ФайлИндекса = "C:\Data\mybase.cdx";
АнкетаДБФ = Новый XBase;
АнкетаДБФ.Кодировка = КодировкаXBase.ANSI;
// Открываем файл
АнкетаДБФ.ОткрытьФайл(ФайлДБФ);
// Попытка принудительного удаления старого индекса
ФайлНаДиске = Новый Файл(ФайлИндекса);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ФайлИндекса);
КонецЕсли;
// Определение индексов
АнкетаДБФ.Индексы.Добавить("INDEX_KD", "STR(KodKli)+DTOS(NachPer)", Ложь);
// Критический момент: создание индексного файла
Попытка
АнкетаДБФ.СоздатьИндексныйФайл(ФайлИндекса);
Исключение
Сообщить("Ошибка создания индекса: " + ОписаниеОшибки());
КонецПопытки;
Проблема здесь заключается в том, что операционная система может не успеть физически освободить дескриптор файла после УдалитьФайлы, а 1С уже дает команду на создание нового. Выясним, как это оптимизировать.
Главный совет — не удаляйте CDX-файл без необходимости. Объект XBase спроектирован так, что если вы открываете .dbf вместе с .cdx, индекс обновляется автоматически при добавлении каждой новой записи. Рассмотрим правильную последовательность действий:
.dbf сразу с индексным файлом.АнкетаДБФ.Записать(), и индекс обновится сам.Если же вам абсолютно необходимо пересоздать индекс (например, при повреждении), добавьте небольшую паузу между удалением старого файла и созданием нового. В 1С это можно сделать с помощью команды КомандаСистемы("timeout /t 1") или через WScript.Shell.
Поскольку ошибка явно указывает на "temporary working file", нам нужно проверить, куда именно 1С пытается их записать. По умолчанию это папка профиля пользователя %USERPROFILE%\AppData\Local\Temp. Выясним причину сбоя в этой папке:
T1.tmp приводит к конфликту имен.TEMP.TEMP и TMP в корень диска, например, в C:\Temp.Проанализируем ситуацию, когда ошибка возникает только на определенных компьютерах. Часто виновником становится антивирус. Как только 1С создает временный файл, антивирус тут же "хватает" его для проверки. В этот момент 1С пытается продолжить запись в него и получает отказ от ОС.
Что нужно сделать:
.dbf, .cdx и .tmp в исключения антивируса.1cv8.exe в список доверенных.Если причина не очевидна, воспользуемся инструментом Process Explorer. Рассмотрим алгоритм поиска:
Запустите программу, нажмите Ctrl+F и введите имя вашего .cdx файла или название папки Temp. Вы увидите, какой процесс в данный момент удерживает файл. Если это не 1cv8.exe, а, например, SearchIndexer.exe (служба индексирования Windows), значит, папку с базой нужно исключить из поиска Windows.
В ходе обсуждения часто всплывает аргумент о том, что данные выносятся в DBF для "экономии места" в файловой базе 1С. Важно понимать: ограничение в 4 Гб в файловой версии 1С 8.1/8.2/8.3 относится не к размеру всей базы (файла 1Cv8.1CD), а к размеру одной конкретной таблицы внутри этого файла.
Рекомендация: Если ваша база не превышает 10-20 Гб в целом, и ни одна таблица не приближается к 4 Гб, использование внешних DBF-файлов только создает лишние точки отказа (такие как ошибка -20). Рассмотрите возможность возврата данных в стандартные объекты конфигурации (Справочники или Регистры сведений). Это обеспечит транзакционность и избавит от проблем с кодировками и индексами CodeBase.
Таким образом, для устранения ошибки Error -20 мы рекомендуем сначала отказаться от циклического пересоздания индексов, затем проверить права на временные папки и настроить исключения антивируса. Эти действия решают проблему в 95% случаев.