Как исправить ошибку эксклюзивного доступа или отсутствия прав при подключении к базе MS Access (.mdb) из 1С?

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

При интеграции 1С с внешним оборудованием, например весами, часто возникает необходимость считывать данные напрямую из файлов баз данных Microsoft Access (форматы .mdb или .accdb). Однако при попытке программного подключения на стороне сервера 1С разработчики нередко сталкиваются с критической ошибкой: "The Microsoft Access database engine cannot open or write to the file... It is already opened exclusively by another user, or you need permission to view and write its data."

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

Анализ исходной ситуации и программного кода

Рассмотрим типовой сценарий: данные с весов записываются сторонним ПО в файл VMScale.mdb, расположенный на сетевом ресурсе. Нам необходимо считать последнюю запись из таблицы WEIGHTLIVE. Для этого в 1С используется технология ADO (ActiveX Data Objects). Типичный код подключения выглядит следующим образом:


ПутьКФайлу = "\\192.168.1.100\Public\VMScale.mdb";
СтрокаПодключения = "
    |Provider=Microsoft.ACE.OLEDB.12.0;
    |Data Source=" + ПутьКФайлу + ";";

ADODBПодключение = Новый COMОбъект("ADODB.Connection");

Попытка
    ADODBПодключение.Open(СтрокаПодключения);
    
    ADODBЗапрос = Новый COMОбъект("ADODB.Command");
    ADODBЗапрос.ActiveConnection = ADODBПодключение;
    ADODBЗапрос.CommandType = 1; // adCmdText
    
    ADODBЗапрос.CommandText = 
    "SELECT TOP 1
    |    DATETIME,
    |    WEIGHT
    |FROM
    |    WEIGHTLIVE
    |ORDER BY
    |    DATETIME DESC";
    
    ADODBНаборЗаписей = ADODBЗапрос.Execute();
    // Обработка результата...
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

Проанализируем ключевой момент: если этот код успешно отрабатывает в режиме &НаКлиенте, но выдает ошибку прав доступа в режиме &НаСервере, значит, корень проблемы кроется не в самом коде, а в контексте исполнения и правах учетной записи, под которой запущена служба "Агент сервера 1С:Предприятия".

Причина №1: Права учетной записи службы 1С

Выясним причину конфликта прав. По умолчанию сервер 1С часто устанавливается под специально созданной локальной учетной записью (например, USR1CV82 или USR1CV8). Эта учетная запись имеет ограниченные права в операционной системе и, как правило, не имеет доступа к сетевым ресурсам (UNC-путям типа \\Server\Folder).

Рассмотрим шаги по решению этой проблемы:

  1. Откройте оснастку "Службы" (services.msc) на сервере, где установлен 1С.
  2. Найдите службу "Агент сервера 1С:Предприятия".
  3. Перейдите в свойства службы на закладку "Вход в систему".
  4. Если там указана локальная учетная запись, попробуйте изменить её на "С системной учетной записью" (LocalSystem) и разрешить взаимодействие с рабочим столом, либо укажите данные доменного пользователя, который имеет гарантированный доступ к сетевой папке с файлом .mdb.
  5. После изменения настроек обязательно перезапустите службу сервера 1С.

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

Причина №2: Механизм блокировок Access (.ldb файлы)

Проанализируем техническую особенность работы Microsoft Access. При открытии базы данных через провайдер Microsoft.ACE.OLEDB, система пытается создать файл блокировок (с расширением .ldb для старых версий или .laccdb для новых) в той же директории, где находится основной файл.

Это критически важный момент: даже если у пользователя есть права на чтение самого файла .mdb, но нет прав на создание и удаление файлов в этой папке, драйвер выдаст ошибку об эксклюзивном доступе. Убедитесь, что для учетной записи сервера 1С на уровне NTFS установлены права не ниже "Modify" (Изменение) на всю папку, в которой лежат данные весов.

Причина №3: Параметры строки подключения

Если мы хотим минимизировать конфликты с основной программой, которая записывает вес, нам следует явно указать режим совместного доступа в строке соединения ADO. Разберем использование параметра Mode.

Добавьте в СтрокаПодключения следующие параметры:

Обновленный пример строки подключения:


СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                    "Data Source=" + ПутьКФайлу + ";" +
                    "Mode=Share Deny None;";

Причина №4: Разрядность драйверов (x86 vs x64)

Посмотрим на ситуацию со стороны системной архитектуры. Сервер 1С в большинстве современных систем является 64-разрядным. Для корректной работы COMОбъект("ADODB.Connection") на сервере должен быть установлен компонент Microsoft Access Database Engine соответствующей разрядности (x64).

Если на сервере установлен 32-битный Microsoft Office, то 64-битный процесс 1С не сможет инициализировать провайдер Microsoft.ACE.OLEDB.12.0. В этом случае ошибка может маскироваться под проблемы с правами доступа. Рекомендуется установить 64-битную версию драйверов "Microsoft Access Database Engine Redistributable" с сайта Microsoft.

Альтернативный метод: Промежуточное копирование

В ситуациях, когда права настроить невозможно (например, из-за жестких политик безопасности), или программа весов открывает файл в действительно монопольном режиме, рекомендуется использовать метод теневого копирования.

Рассмотрим алгоритм действий:

  1. Используем средства платформы 1С для копирования файла из сетевого ресурса во временную локальную папку сервера: КопироватьФайл(СетевойПуть, ЛокальныйПуть);.
  2. Подключаемся через ADO к локальной копии файла.
  3. Считываем данные и удаляем временный файл.

Этот метод гарантирует, что 1С никогда не заблокирует работу весов, так как обращение происходит к копии данных, а не к "живой" базе.

Заключение

Подведем итог: чаще всего ошибка доступа к Access из-под сервера 1С лечится настройкой прав учетной записи службы "Агент сервера 1С:Предприятия". Убедитесь, что служба работает под пользователем, имеющим полные права на сетевой каталог, и что в папке разрешено создание файлов блокировок .ldb. Проверка разрядности драйверов и использование параметров Mode в строке подключения сделают вашу интеграцию максимально надежной.

← На главную