При попытке загрузить адресный классификатор (КЛАДР) в конфигурацию «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 либо не содержала данной функции, либо открывала таблицы исключительно на чтение, из-за чего импорт там проходил успешно.
Наиболее быстрое решение без вмешательства в программный код конфигурации — перенос файлов классификатора в отдельный подкаталог. Рассмотрим подробнее, почему путь вида C:\TMP\ вызывает сбой:
Каталог + "\" + ИмяФайла. Если пользователь указывает путь с завершающей косой чертой (C:\TMP\), результирующий путь принимает вид C:\TMP\\KLADR.DBF. Внутренние механизмы XBase могут аварийно завершать попытку открытия файла по такому некорректному пути.TEMP и TMP для каждого пользовательского сеанса. Обращение к папке с системным именем в корне диска C:\ может перехватываться механизмом виртуализации сеансов (VirtualStore) или блокироваться политиками UAC.Чтобы решить проблему, создадим отдельную изолированную папку, например C:\TMP\base или D:\KLADR, переместим туда распакованные файлы классификатора и при выборе каталога в 1С укажем новый путь без завершающего слэша.
Если конфигурация снята с поддержки или находится на поддержке с возможностью изменения, проанализируем и исправим код функции ЕстьДоступКФайлу. Для чтения классификатора права на запись в исходные файлы DBF не требуются, поэтому открывать их на запись избыточно.
Передадим третий параметр ТолькоЧтение = Истина в конструктор XBase:
Функция ЕстьДоступКФайлу(ПолноеИмяФайла)
// Открываем таблицу DBF только для чтения
ТаблицаФайла = Новый XBase(ПолноеИмяФайла, , Истина);
ЕстьДоступ = ТаблицаФайла.Открыта();
ТаблицаФайла.ЗакрытьФайл();
Возврат ЕстьДоступ;
КонецФункции
В таком режиме платформа не будет запрашивать монопольный доступ и блокировку файла, что исключит ложные срабатывания проверки.
Использование XBase исключительно для проверки доступности файла не всегда надежно, так как таблицы doma.dbf и street.dbf имеют значительный размер и могут долго считываться при первичном обращении. Гораздо эффективнее и быстрее проверить физическое наличие и доступность файла через специализированный объект платформы Файл:
Функция ЕстьДоступКФайлу(ПолноеИмяФайла)
ПроверяемыйФайл = Новый Файл(ПолноеИмяФайла);
Возврат ПроверяемыйФайл.Существует();
КонецФункции
Такой подход полностью исключает проблемы с блокировками дескрипторов файлов на уровне драйвера баз данных XBase.
Если перенос каталога и изменение кода не дали результата, разберем системные факторы блокировки:
doma.dbf). В этот момент попытка открыть файл из 1С блокируется. Добавим каталог с классификатором в список исключений сканирования антивируса на время импорта.KLADR.DBF, STREET.DBF, DOMA.DBF и SOCRBASE.DBF в свойствах Windows не установлен флаг «Только для чтения» (Read-Only), а также снята блокировка скачанных из интернета файлов (кнопка «Разблокировать» в свойствах файла).