Почему запрос к внешнему источнику данных (MySQL) работает в консоли, но выдает ошибку во внешней обработке 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Разберем распространенную ситуацию, с которой сталкиваются разработчики при интеграции 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-адреса. Если нет — переходим к настройке прав на стороне СУБД.

Настройка прав (GRANT) на стороне MySQL (Ошибка 1044)

Ошибка с кодом 1044 отличается от ошибки 1045. Код 1044 говорит о том, что связка логина и пароля подошла, но пользователю не выданы права на использование конкретной базы данных при подключении с указанного IP-адреса (в нашем случае — IP-адреса сервера 1С).

Для решения этой проблемы подключимся к MySQL под учетной записью root и выполним команду выдачи привилегий:


GRANT ALL PRIVILEGES ON ИмяБазыДанных.* TO 'ИмяПользователяБД'@'IP_адрес_сервера_1С';
FLUSH PRIVILEGES;

Эта команда разрешит пользователю выполнять операции с базой именно с того IP-адреса, где физически работает служба Сервера 1С.

Влияние безопасного режима

Рассмотрим еще один важный механизм платформы 8.3 — безопасный режим. По умолчанию все внешние обработки открываются в безопасном режиме. Он накладывает жесткие ограничения: может блокировать работу с COM-объектами, файловой системой и внешними сетевыми ресурсами (в том числе выполнение ODBC запросов).

Чтобы исключить эту причину, выполним следующие шаги:

  1. Перейдем в карточку пользователя 1С (в конфигураторе или режиме Предприятия) и снимем флаг «Защита от опасных действий».
  2. Если обработка подключена через подсистему БСП «Дополнительные отчеты и обработки», откроем ее карточку в справочнике и убедимся, что для нее отключен безопасный режим.
  3. Или же программно снимем безопасный режим при открытии обработки, если есть соответствующие права.

Проверка ODBC драйвера на сервере 1С

Поскольку запрос из внешней обработки выполняется на стороне сервера 1С, соответствующий драйвер (в нашем примере MySQL ODBC 5.3(w) Driver) должен быть установлен именно на сервере, где запущена служба 1С:Предприятия.

Особое внимание уделим разрядности: разрядность ODBC драйвера должна строго совпадать с разрядностью службы сервера 1С (x86 или x64), а не с разрядностью самой операционной системы Windows/Linux. Если сервер 1С установлен 64-битный, то и ODBC-драйвер для MySQL нужно скачивать и устанавливать 64-битный.

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

← На главную