При интеграции 1С со сторонними СУБД (например, MySQL, PostgreSQL или MS SQL) через механизм Внешние источники данных разработчики часто сталкиваются с ситуацией, когда метод УстановитьОбщиеПараметрыСоединения() возвращает ошибку о недостаточности прав, если у пользователя не установлена роль «Администрирование». При этом попытка обойти ограничение через УстановитьПривилегированныйРежим(Истина) в клиент-серверном варианте либо не дает эффекта, либо приводит к ошибке диспетчера ODBC SQLSTATE: IM002. Разберем по шагам, почему возникают эти проблемы и как правильно организовать подключение к внешнему источнику данных.
Проанализируем механику работы платформы 1С:Предприятие с параметрами внешних источников:
УстановитьОбщиеПараметрыСоединения() сохраняет параметры подключения на уровне всей информационной базы для всех пользователей. По этой причине платформа на системном уровне требует наличия административных прав. Обычным пользователям для чтения и изменения таблиц внешнего источника достаточно стандартных прав на сам объект внешнего источника данных и входящие в него таблицы.БезопасныйРежим = Истина. В безопасном режиме вызов метода УстановитьПривилегированныйРежим(Истина) игнорируется, и привилегии не повышаются.Рассмотрим вариант решения, когда подключение необходимо инициализировать программно от лица непривилегированного пользователя. Для этого логику установки параметров и соединения необходимо вынести в общий модуль со свойствами Сервер и Привилегированный.
Посмотрим на пример реализации серверной функции в привилегированном общем модуле:
Функция УстановитьПараметрыИПодключиться(ПараметрыПодключения, ТекстОшибки) Экспорт
УстановитьПривилегированныйРежим(Истина);
ПараметрыСоединения = ВнешниеИсточникиДанных.Opencart.ПолучитьОбщиеПараметрыСоединения();
ПараметрыСоединения.АутентификацияСтандартная = Истина;
ПараметрыСоединения.ИмяПользователя = ПараметрыПодключения.ИмяПользователя;
ПараметрыСоединения.Пароль = ПараметрыПодключения.Пароль;
ПараметрыСоединения.СУБД = "MySQL";
// Формируем строку подключения без лишних пробелов и переносов строк
ПараметрыСоединения.СтрокаСоединения = СтрШаблон(
"DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=%1;DATABASE=%2;PORT=%3;",
ПараметрыПодключения.Сервер,
ПараметрыПодключения.БазаДанных,
ПараметрыПодключения.Порт
);
Попытка
ВнешниеИсточникиДанных.Opencart.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.Opencart.УстановитьСоединение();
Возврат Истина;
Исключение
ТекстОшибки = ОписаниеОшибки();
Возврат Ложь;
КонецПопытки;
КонецФункции
Важно: Если вызов функции осуществляется из дополнительной внешней обработки, подключаемой через стандартную подсистему БСП, убедитесь, что при регистрации обработки в справочнике отключен безопасный режим, иначе привилегированный режим внутри модуля выполнен не будет.
В большинстве сценариев нет необходимости каждый раз программно вызывать УстановитьОбщиеПараметрыСоединения(). Достаточно один раз настроить подключение под учетной записью администратора:
После выноса кода на сервер часто возникает ошибка: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию (SQLSTATE: IM002). Разберем основные причины ее возникновения в SQL-версии 1С:
rphost. Если сервер 1С:Предприятие 64-битный, на сервере операционной системы обязательно должен быть установлен 64-битный драйвер ODBC. 32-битный драйвер серверный процесс 1С не увидит.DRIVER={...} строки соединения имя должно в точности совпадать с именем драйвера в системном диспетчере ODBC (odbcad32.exe). Например, вместо абстрактного DRIVER={MySQL ODBC 5.1 Driver} необходимо указывать точное системное имя, такое как DRIVER={MySQL ODBC 8.0 Unicode Driver} или DRIVER={MySQL ODBC 5.1 Unicode Driver}.| 1С добавляет невидимые символы перевода строки и пробелы, которые ломают разбор строки диспетчером ODBC. Рекомендуется склеивать строку в одну линию или использовать функцию СтрШаблон().USR1CV8) и не имеет доступа к пользовательским DSN конкретного администратора Windows.