При интеграции 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С часто устанавливается под специально созданной локальной учетной записью (например, USR1CV82 или USR1CV8). Эта учетная запись имеет ограниченные права в операционной системе и, как правило, не имеет доступа к сетевым ресурсам (UNC-путям типа \\Server\Folder).
Рассмотрим шаги по решению этой проблемы:
services.msc) на сервере, где установлен 1С..mdb.Важно помнить, что если файл находится на другой машине в доменной сети, то учетная запись LocalSystem может не иметь прав на сетевой ресурс. В таком случае лучшим решением будет использование доменной учетной записи с правами "Изменение" на целевую папку.
Проанализируем техническую особенность работы Microsoft Access. При открытии базы данных через провайдер Microsoft.ACE.OLEDB, система пытается создать файл блокировок (с расширением .ldb для старых версий или .laccdb для новых) в той же директории, где находится основной файл.
Это критически важный момент: даже если у пользователя есть права на чтение самого файла .mdb, но нет прав на создание и удаление файлов в этой папке, драйвер выдаст ошибку об эксклюзивном доступе. Убедитесь, что для учетной записи сервера 1С на уровне NTFS установлены права не ниже "Modify" (Изменение) на всю папку, в которой лежат данные весов.
Если мы хотим минимизировать конфликты с основной программой, которая записывает вес, нам следует явно указать режим совместного доступа в строке соединения ADO. Разберем использование параметра Mode.
Добавьте в СтрокаПодключения следующие параметры:
Mode=Share Deny None; — этот параметр указывает, что мы не хотим накладывать никаких ограничений на чтение или запись для других пользователей.Mode=Read; — если нам нужно только забирать данные, используйте режим "Только чтение". Это снижает вероятность того, что 1С заблокирует файл для программы весов.Обновленный пример строки подключения:
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + ПутьКФайлу + ";" +
"Mode=Share Deny None;";
Посмотрим на ситуацию со стороны системной архитектуры. Сервер 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С никогда не заблокирует работу весов, так как обращение происходит к копии данных, а не к "живой" базе.
Подведем итог: чаще всего ошибка доступа к Access из-под сервера 1С лечится настройкой прав учетной записи службы "Агент сервера 1С:Предприятия". Убедитесь, что служба работает под пользователем, имеющим полные права на сетевой каталог, и что в папке разрешено создание файлов блокировок .ldb. Проверка разрядности драйверов и использование параметров Mode в строке подключения сделают вашу интеграцию максимально надежной.