Разберем распространенную ситуацию, с которой сталкиваются разработчики при интеграции 1С с внешними базами данных. Часто бывает так, что после настройки подключения к СУБД (например, MySQL) данные успешно читаются в типовой Консоли запросов, но при попытке выполнить аналогичный запрос через программный код внешней обработки возникает критическая ошибка.
Проанализируем типичный текст такой ошибки:
Ошибка выполнения запроса: Ошибка внешней базы данных: ошибка при выполнении запроса: Ошибка ODBC. SQLSTATE: HY000 Номер ошибки: 1044 Описание: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.29-log]Access denied for user 'user_name'@'server_name' to database 'DBname'
На первый взгляд кажется, что введены неправильные логин или пароль, однако это не совсем так. Рассмотрим подробнее основные причины такого поведения и по шагам решим проблему.
Выясним причину, почему Консоль запросов отрабатывает корректно, а обработка — нет. Дело в том, что Консоль запросов использует общие настройки подключения, которые уже инициализированы платформой. Внешняя же обработка требует явной установки параметров подключения и открытия соединения для конкретного пользователя или сеанса перед выполнением запроса.
Посмотрим на пример кода, который необходимо выполнять перед обращением к внешнему источнику:
Параметры = ВнешниеИсточникиДанных.ИмяВашегоИсточника.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "ИмяПользователяБД";
Параметры.Пароль = "ПарольПользователяБД";
Параметры.СтрокаСоединения = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=АдресСервера;DATABASE=ИмяБазы;Port=3306";
Параметры.СУБД = "MySQL";
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьПараметрыСоединенияСеанса(Параметры);
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьСоединение();
Обратим внимание на важный нюанс при заполнении свойств объекта Параметры. Во многих случаях разработчики указывают логин и пароль одновременно и в свойствах (Параметры.ИмяПользователя и Параметры.Пароль), и в самой строке подключения (через параметры UID и PWD). При работе с ODBC-драйверами MySQL это может привести к конфликтам авторизации. Рекомендуем оставлять авторизационные данные только в одном месте: либо в свойствах объекта параметров соединения, либо исключительно внутри строки соединения.
Проанализируем архитектурную особенность. Код из модуля объекта внешней обработки, в котором вызывается метод Выполнить() для объекта Запрос, отрабатывает на стороне сервера 1С:Предприятия. Консоль запросов может выполнять соединение из другого контекста (например, клиентского).
Если в тексте ошибки фигурирует Access denied for user 'user_name'@'server_name', это означает, что MySQL отклонил попытку доступа именно с хоста (IP-адреса) сервера 1С. Убедитесь, что сервер 1С и Консоль запросов стучатся с одного и того же IP-адреса. Если нет — переходим к настройке прав на стороне СУБД.
Ошибка с кодом 1044 отличается от ошибки 1045. Код 1044 говорит о том, что связка логина и пароля подошла, но пользователю не выданы права на использование конкретной базы данных при подключении с указанного IP-адреса (в нашем случае — IP-адреса сервера 1С).
Для решения этой проблемы подключимся к MySQL под учетной записью root и выполним команду выдачи привилегий:
GRANT ALL PRIVILEGES ON ИмяБазыДанных.* TO 'ИмяПользователяБД'@'IP_адрес_сервера_1С';
FLUSH PRIVILEGES;
Эта команда разрешит пользователю выполнять операции с базой именно с того IP-адреса, где физически работает служба Сервера 1С.
Рассмотрим еще один важный механизм платформы 8.3 — безопасный режим. По умолчанию все внешние обработки открываются в безопасном режиме. Он накладывает жесткие ограничения: может блокировать работу с COM-объектами, файловой системой и внешними сетевыми ресурсами (в том числе выполнение ODBC запросов).
Чтобы исключить эту причину, выполним следующие шаги:
Поскольку запрос из внешней обработки выполняется на стороне сервера 1С, соответствующий драйвер (в нашем примере MySQL ODBC 5.3(w) Driver) должен быть установлен именно на сервере, где запущена служба 1С:Предприятия.
Особое внимание уделим разрядности: разрядность ODBC драйвера должна строго совпадать с разрядностью службы сервера 1С (x86 или x64), а не с разрядностью самой операционной системы Windows/Linux. Если сервер 1С установлен 64-битный, то и ODBC-драйвер для MySQL нужно скачивать и устанавливать 64-битный.
Соблюдение всех описанных шагов — корректная инициализация соединения в коде, отсутствие дублирования реквизитов, настройка прав на стороне MySQL, проверка безопасного режима и корректная установка драйвера — гарантированно решит проблему с ошибкой доступа 1044 и позволит успешно получать данные из внешнего источника во внешней обработке.