Почему не создается файл индекса CDX и как исправить ошибку CODEBASE ERROR Error -20

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Работа с внешними файлами формата DBF в среде 1С часто сопряжена с использованием объекта XBase. Одной из самых неприятных и трудноуловимых проблем является ошибка "CODEBASE ERROR Error #: -20 creating file temporary working file". Эта ошибка возникает в момент создания или обновления индексного файла .cdx. Проанализируем причины возникновения этой ситуации и разберем по шагам способы её решения.

Разберем природу ошибки -20

Ошибка с кодом -20 в движке CodeBase, который 1С использует для работы с DBF, расшифровывается как "Creating File Error". Это низкоуровневая ошибка операционной системы, означающая, что программа попыталась создать файл, но получила отказ. Рассмотрим подробнее, что именно может блокировать этот процесс:

  1. Недопустимое имя файла или пути: Путь к файлу слишком длинный (более 255 символов) или содержит спецсимволы.
  2. Файл уже открыт: Другой процесс (или другой экземпляр 1С) удерживает дескриптор файла.
  3. Отсутствие прав: У пользователя операционной системы недостаточно прав на создание или удаление файлов в целевом каталоге.
  4. Проблемы с дисковым пространством или квотами: Место на диске есть, но для конкретного пользователя установлены ограничения.
  5. Вмешательство антивируса: Защитное ПО блокирует создание временных файлов с расширением .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С уже дает команду на создание нового. Выясним, как это оптимизировать.

Решение 1: Оптимизация работы с индексами

Главный совет — не удаляйте CDX-файл без необходимости. Объект XBase спроектирован так, что если вы открываете .dbf вместе с .cdx, индекс обновляется автоматически при добавлении каждой новой записи. Рассмотрим правильную последовательность действий:

  1. Открывайте файл .dbf сразу с индексным файлом.
  2. Если индексный файл существует, не нужно его пересоздавать.
  3. Используйте метод АнкетаДБФ.Записать(), и индекс обновится сам.

Если же вам абсолютно необходимо пересоздать индекс (например, при повреждении), добавьте небольшую паузу между удалением старого файла и созданием нового. В 1С это можно сделать с помощью команды КомандаСистемы("timeout /t 1") или через WScript.Shell.

Решение 2: Настройка временных папок (TEMP)

Поскольку ошибка явно указывает на "temporary working file", нам нужно проверить, куда именно 1С пытается их записать. По умолчанию это папка профиля пользователя %USERPROFILE%\AppData\Local\Temp. Выясним причину сбоя в этой папке:

Решение 3: Борьба с блокировками (Антивирус и SMB)

Проанализируем ситуацию, когда ошибка возникает только на определенных компьютерах. Часто виновником становится антивирус. Как только 1С создает временный файл, антивирус тут же "хватает" его для проверки. В этот момент 1С пытается продолжить запись в него и получает отказ от ОС.

Что нужно сделать:

  1. Добавьте расширения .dbf, .cdx и .tmp в исключения антивируса.
  2. Добавьте сам процесс 1cv8.exe в список доверенных.
  3. Если база лежит на сетевом диске, попробуйте отключить механизм SMB Leasing. В Windows 7/10 этот механизм кэширует состояние файлов, что часто мешает корректной работе файловых СУБД.

Решение 4: Использование Process Explorer для диагностики

Если причина не очевидна, воспользуемся инструментом Process Explorer. Рассмотрим алгоритм поиска:

Запустите программу, нажмите Ctrl+F и введите имя вашего .cdx файла или название папки Temp. Вы увидите, какой процесс в данный момент удерживает файл. Если это не 1cv8.exe, а, например, SearchIndexer.exe (служба индексирования Windows), значит, папку с базой нужно исключить из поиска Windows.

Архитектурный совет: лимиты таблиц 1С

В ходе обсуждения часто всплывает аргумент о том, что данные выносятся в DBF для "экономии места" в файловой базе 1С. Важно понимать: ограничение в 4 Гб в файловой версии 1С 8.1/8.2/8.3 относится не к размеру всей базы (файла 1Cv8.1CD), а к размеру одной конкретной таблицы внутри этого файла.

Рекомендация: Если ваша база не превышает 10-20 Гб в целом, и ни одна таблица не приближается к 4 Гб, использование внешних DBF-файлов только создает лишние точки отказа (такие как ошибка -20). Рассмотрите возможность возврата данных в стандартные объекты конфигурации (Справочники или Регистры сведений). Это обеспечит транзакционность и избавит от проблем с кодировками и индексами CodeBase.

Таким образом, для устранения ошибки Error -20 мы рекомендуем сначала отказаться от циклического пересоздания индексов, затем проверить права на временные папки и настроить исключения антивируса. Эти действия решают проблему в 95% случаев.

← На главную