Как исправить ошибку «Отсутствует доступ к файлам классификатора» при загрузке КЛАДР в 1С:ЗУП 2.5?

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

При попытке загрузить адресный классификатор (КЛАДР) в конфигурацию «1С:Зарплата и Управление Персоналом 2.5» пользователи и администраторы нередко сталкиваются с ошибкой следующего вида:

«Отсутствует доступ к файлам классификатора: C:\TMP\KLADR.DBF, C:\TMP\street.dbf, C:\TMP\doma.dbf. Проверьте, что у пользователя есть права на запись в каталог с файлами и у файлов не установлен атрибут "Только для чтения"».

Ситуация выглядит парадоксально, когда в параллельно установленной конфигурации (например, «1С:Бухгалтерия предприятия 2.0») под тем же пользователем операционной системы и с теми же файлами загрузка проходит без нареканий. Разберем по шагам, почему возникает эта ошибка, как работает встроенная проверка платформы и какими способами можно устранить проблему.

Анализ механизма проверки доступности файлов классификатора

Выясним причину такого поведения конфигурации. В обработке загрузки классификатора в ЗУП 2.5 разработчики добавили предварительную проверку наличия доступа к файлам баз данных перед началом самого импорта. Код вызова проверки выглядит следующим образом:


Если Не ЕстьДоступКФайлу(ФайлАдресногоКлассификатора) Тогда
    СписокНеДоступныхФайлов.Добавить(ФайлАдресногоКлассификатора);
КонецЕсли;

Сама функция проверки реализована через создание объекта работы с таблицами формата DBF:


Функция ЕстьДоступКФайлу(ПолноеИмяФайла)
    ТаблицаФайла = Новый XBase(ПолноеИмяФайла);
    ЕстьДоступ = ТаблицаФайла.Открыта();
    ТаблицаФайла.ЗакрытьФайл();
    Возврат ЕстьДоступ;
КонецФункции

Посмотрим на особенности инициализации объекта XBase. Конструктор объекта имеет следующий синтаксис: Новый XBase(ИмяФайла, [ИмяИндексногоФайла], [ТолькоЧтение]). По умолчанию третий параметр ТолькоЧтение принимает значение Ложь. Это означает, что платформа 1С пытается открыть файл классификатора в монопольном режиме с запросом прав на чтение и запись.

Если файл заблокирован фоновым процессом, открыт другой программой, расположен в каталоге с особыми политиками безопасности или сам вызов сформирован с некорректным путем, метод ТаблицаФайла.Открыта() возвращает значение Ложь, и обработка прерывает загрузку. В то же время типовая загрузка в БП 2.0 либо не содержала данной функции, либо открывала таблицы исключительно на чтение, из-за чего импорт там проходил успешно.

Решение 1. Изменение каталога расположения файлов (проблема C:\TMP\)

Наиболее быстрое решение без вмешательства в программный код конфигурации — перенос файлов классификатора в отдельный подкаталог. Рассмотрим подробнее, почему путь вида C:\TMP\ вызывает сбой:

  1. Задвоение слэшей в пути к файлу. В ряде релизов типовых обработок склейка пути выполняется конструкцией вида Каталог + "\" + ИмяФайла. Если пользователь указывает путь с завершающей косой чертой (C:\TMP\), результирующий путь принимает вид C:\TMP\\KLADR.DBF. Внутренние механизмы XBase могут аварийно завершать попытку открытия файла по такому некорректному пути.
  2. Изоляция временных папок в серверных ОС. В Windows Server 2008 R2 и новее при работе через Remote Desktop Services (терминальный сервер) включена изоляция каталогов TEMP и TMP для каждого пользовательского сеанса. Обращение к папке с системным именем в корне диска C:\ может перехватываться механизмом виртуализации сеансов (VirtualStore) или блокироваться политиками UAC.

Чтобы решить проблему, создадим отдельную изолированную папку, например C:\TMP\base или D:\KLADR, переместим туда распакованные файлы классификатора и при выборе каталога в 1С укажем новый путь без завершающего слэша.

Решение 2. Корректировка функции проверки в конфигураторе

Если конфигурация снята с поддержки или находится на поддержке с возможностью изменения, проанализируем и исправим код функции ЕстьДоступКФайлу. Для чтения классификатора права на запись в исходные файлы DBF не требуются, поэтому открывать их на запись избыточно.

Передадим третий параметр ТолькоЧтение = Истина в конструктор XBase:


Функция ЕстьДоступКФайлу(ПолноеИмяФайла)
    // Открываем таблицу DBF только для чтения
    ТаблицаФайла = Новый XBase(ПолноеИмяФайла, , Истина);
    ЕстьДоступ = ТаблицаФайла.Открыта();
    ТаблицаФайла.ЗакрытьФайл();
    Возврат ЕстьДоступ;
КонецФункции

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

Решение 3. Замена проверки XBase на системный объект Файл

Использование XBase исключительно для проверки доступности файла не всегда надежно, так как таблицы doma.dbf и street.dbf имеют значительный размер и могут долго считываться при первичном обращении. Гораздо эффективнее и быстрее проверить физическое наличие и доступность файла через специализированный объект платформы Файл:


Функция ЕстьДоступКФайлу(ПолноеИмяФайла)
    ПроверяемыйФайл = Новый Файл(ПолноеИмяФайла);
    Возврат ПроверяемыйФайл.Существует();
КонецФункции

Такой подход полностью исключает проблемы с блокировками дескрипторов файлов на уровне драйвера баз данных XBase.

Решение 4. Настройка антивирусного ПО и прав доступа

Если перенос каталога и изменение кода не дали результата, разберем системные факторы блокировки:

  1. Файловый монитор антивируса. Архивы и базы КЛАДР содержат сотни тысяч записей. При открытии папки антивирусные службы начинают сканирование содержимого больших файлов (doma.dbf). В этот момент попытка открыть файл из 1С блокируется. Добавим каталог с классификатором в список исключений сканирования антивируса на время импорта.
  2. Атрибуты файлов. Убедимся, что после распаковки архива у файлов KLADR.DBF, STREET.DBF, DOMA.DBF и SOCRBASE.DBF в свойствах Windows не установлен флаг «Только для чтения» (Read-Only), а также снята блокировка скачанных из интернета файлов (кнопка «Разблокировать» в свойствах файла).
← На главную