При организации интеграции конфигурации 1С с внешними базами данных (например, СУБД сайта на MySQL, PostgreSQL или MS SQL Server) разработчики часто используют штатный механизм «Внешние источники данных». Нередко возникает ситуация: разработчик создает роли, выставляет пользователю полные права на сам внешний источник и на все входящие в него таблицы, однако при попытке программного подключения система аварийно завершает работу с исключением: «У пользователя недостаточно прав на выполнение операции с внешним источником данных».
Проанализируем строку кода, на которой обычно происходит данный сбой:
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 Driver};SERVER=mysite.local;DATABASE=site_db;UID=user;PWD=pass;";
ВнешниеИсточникиДанных.Сайт.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
Выясним причину такого поведения платформы 1С:Предприятие и подробно разберем все способы решения данной проблемы.
Разберем внутреннюю логику работы платформы. Метод УстановитьОбщиеПараметрыСоединения() выполняет глобальное действие: он перезаписывает параметры подключения к внешней базе для всей информационной базы целиком, затрагивая всех пользователей и сеансы. Соответственно, обычных прав на чтение, просмотр или изменение строк в таблицах внешнего источника категорически недостаточно.
Для вызова этого метода платформа 1С требует наличия специального административного права:
Если у рядового пользователя есть права только на манипуляцию данными таблиц (чтение, добавление, изменение), попытка изменить глобальные настройки подключения немедленно блокируется платформой в целях безопасности.
Посмотрим на практическое решение, к которому пришел автор обсуждения. Если процедура обмена данными с сайтом должна запускаться обычными пользователями, у которых нет и не должно быть административных полномочий, наиболее быстрым и надежным решением является вынос служебного кода инициализации подключения в привилегированный общий модуль.
Разберем этот процесс по шагам:
ИнтеграцияС СайтомСерверПрив).Посмотрим на пример реализации серверной процедуры:
// В общем модуле ИнтеграцияС СайтомСерверПрив
Процедура ИнициализироватьПодключениеКСайту() Экспорт
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 Driver};SERVER=mysite.local;DATABASE=site_db;UID=user;PWD=pass;";
// В привилегированном модуле проверка прав отключается:
ВнешниеИсточникиДанных.Сайт.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.Сайт.УстановитьСоединение();
КонецПроцедуры
Так как привилегированный модуль исполняется на сервере без контроля прав текущего пользователя информационной базы, метод УстановитьОбщиеПараметрыСоединения() выполнится успешно, даже если у текущего сеанса минимальные права.
Рассмотрим штатный архитектурный подход, который часто упускают из виду. В платформе 1С:Предприятие вовсе не обязательно программно устанавливать общие параметры подключения при каждом сеансе или перед каждым обменом. Достаточно один раз зафиксировать их через пользовательский интерфейс администратора.
Разберем последовательность действий:
После этой разовой операции платформа сохранит параметры в системных таблицах информационной базы. В коде конфигурации больше не понадобится вызывать УстановитьОбщиеПараметрыСоединения(). Пользователю будет достаточно обратиться к таблице внешнего источника через запрос или вызвать метод ВнешниеИсточникиДанных.Сайт.УстановитьСоединение(), что снимет проблему нехватки административных прав.
Если специфика проекта требует регулярного изменения параметров именно программно, разберем настройку прав роли в конфигураторе.
Это действие предоставит пользователю возможность вызывать методы управления параметрами данного источника без необходимости выдавать ему общие полные права администратора базы 1С.
Проанализируем альтернативный программный метод. Если каждому пользователю или сеансу требуется подключаться со своими учетными данными СУБД, вместо общих параметров следует использовать параметры соединения сеанса:
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 Driver};SERVER=mysite.local;DATABASE=site_db;UID=user;PWD=pass;";
ВнешниеИсточникиДанных.Сайт.УстановитьПараметрыСоединенияСеанса(ПараметрыСоединения);
Платформа использует строгую иерархию параметров: сначала применяются параметры текущего сеанса (УстановитьПараметрыСоединенияСеанса), затем персональные настройки пользователя (УстановитьПараметрыСоединенияПользователя), и только при их отсутствии — общие настройки базы (УстановитьОбщиеПараметрыСоединения). Установка параметров для конкретного сеанса не затрагивает глобальную конфигурацию всей базы и требует меньше привилегий.
При переносе кода работы с внешними источниками данных на сервер (включая фоновые задания и привилегированные модули) важно учитывать системные требования:
USR1CV8), а не от имени пользователя, сидящего за клиентским компьютером.