Почему возникает ошибка подключения к MySQL из регламентного задания 1С и как ее исправить?

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

При разработке интеграций между 1С и сторонними базами данных СУБД MySQL разработчики часто сталкиваются с непонятным на первый взгляд поведением: код получения данных прекрасно отрабатывает при запуске вручную из сеанса 1С:Предприятие, но выдает ошибку при выполнении того же кода в регламентном или фоновом задании.

Типичный текст ошибки выглядит следующим образом:

Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию

Разберем подробнее причины возникновения этой ошибки, выясним технические нюансы работы серверных процессов 1С и рассмотрим по шагам, как настроить корректное соединение с MySQL.

В чем причина разницы между интерактивным запуском и регламентным заданием?

Главная причина кроется в разрядности (архитектуре) рабочих процессов, которые исполняют ваш код:

  1. Интерактивный запуск (по кнопке на форме): Код исполняется на клиенте в контексте исполняемого файла 1cv8.exe. На большинстве рабочих станций используется 32-битный клиент 1С. Соответственно, при установлении COM-соединения система запрашивает 32-битный ODBC-драйвер, установленный в операционной системе. Если он присутствует, подключение проходит успешно.
  2. Фоновое / регламентное задание: Код выполняется строго на стороне сервера приложений 1С в контексте рабочего процесса rphost.exe. Если на вашем сервере установлен 64-битный сервер 1С:Предприятие, рабочий процесс rphost.exe является 64-битным. 64-битный процесс операционной системы физически не может загрузить 32-битную библиотеку (DLL) драйвера ODBC. В результате Windows сообщяет, что указанный в строке соединения драйвер не найден.

Даже если вы скопировали строку подключения (ConnectionString) один в один, разница в архитектуре исполнителя приводит к сбою.

Шаг 1. Установка правильной разрядности драйвера MySQL ODBC

Для исправления ошибки проанализируем разрядность сервера 1С и установим соответствующий коннектор:

  1. Узнаем разрядность сервера 1С (в большинстве современных внедрений используется 64-битная версия 1C:Enterprise Server x86-64).
  2. Загрузим с официального сайта MySQL соответствующую версию драйвера: MySQL Connector/ODBC (x64).
  3. Установим дистрибутив (например, mysql-connector-odbc-X.X.X-winx64.msi) непосредственно на сервер, где запущен рабочий процесс rphost.exe.

После установки 64-битного драйвера рабочий процесс сервера 1С сможет успешно загрузить необходимый модуль в память.

Шаг 2. Нюансы утилит администрирования ODBC в Windows

Если вы настраиваете подключение не прямой строкой, а через DSN (Data Source Name), обратите внимание на различие утилит конфигурирования в 64-битной Windows:

  1. C:\Windows\System32\odbcad32.exe — настраивает 64-битные DSN. Используйте именно эту утилиту для настройки источников данных для 64-битного сервера 1С!
  2. C:\Windows\SysWOW64\odbcad32.exe — настраивает 32-битные DSN (несмотря на название папки SysWOW64). Они видны только 32-битным приложениям (например, тонкому клиенту x86).

Важный момент при работе с DSN: Для регламентных заданий источник данных обязательно должен создаваться на вкладке Системный DSN (System DSN). DSN, созданный на вкладке "Пользовательский DSN", создается в контексте конкретного пользователя и не будет виден службе сервера 1С (обычно работающей под специальным пользователем usr1cv8).

Шаг 3. Составление правильной строки подключения из кода 1С

Рассмотрим пример правильного формирования строки соединения с базой MySQL через COM-объект ADODB.Connection.

Обратите внимание: название драйвера в параметре DRIVER={...} должно строго, буква в букву, совпадать с именем драйвера в Диспетчере ODBC вашей системы.


Функция ПодключитьсяКMySQL()
    
    // Формируем строку подключения с использованием 64-битного драйвера
    // Рекомендуется использовать Unicode Driver для корректной работы с кириллицей
    ПараметрыПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};"
        + "SERVER=192.168.0.2;"
        + "PORT=3306;"
        + "DATABASE=my_base;"
        + "USER=user_name;"
        + "PASSWORD=secret_password;"
        + "OPTION=3;"
        + "CHARSET=utf8mb4;";

    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = ПараметрыПодключения;
    
    Попытка
        Соединение.Open();
        Возврат Соединение;
    Исключение
        ЗаписьЖурналаРегистрации("Подключение к MySQL", 
            УровеньЖурналаРегистрации.Ошибка, , , 
            ОписаниеОшибки());
        ВызватьИсключение "Не удалось подключиться к СУБД MySQL: " + ОписаниеОшибки();
    КонецПопытки;

КонецФункции

Полезные параметры строки подключения для стабильной работы

Проанализируем дополнительные ключевые параметры, которые предотвратят ошибки кодировки и разрывов связи при выполнении регламентных заданий:

  1. DRIVER={MySQL ODBC 8.0 Unicode Driver} — рекомендуется использовать современную Unicode-версию драйвера вместо устаревших версий вроде MySQL ODBC 3.51 Driver.
  2. CHARSET=utf8mb4; — задает кодировку взаимодействия. Это предотвращает появление "крякозябр" при передаче строковых данных на кириллице.
  3. STMT=SET NAMES utf8mb4; — команда, исполняемая сразу после открытия сессии, гарантирует совпадение кодировок со стороны сервера MySQL.
  4. OPTION=3 — специальный битовый флаг драйвера MySQL ODBC, включающий поддержку полного описания таблиц и корректное связывание полей.

Альтернативные методы интеграции 1С и MySQL

Если администрирование драйверов ODBC на сервере вызывает сложности или инфраструктура постоянно меняется, рассмотрим альтернативные подходы к обмену данными:

  1. Внешние источники данных (ВИД): Штатный механизм платформы 1С:Предприятие. Позволяет подлючать таблицы MySQL напрямую в дерево метаданных и работать с ними с помощью языка запросов 1С (однако на сервере 1С все так же потребуется установленный 64-битный драйвер ODBC).
  2. HTTP / REST API (веб-сервисы): Создание промежуточного сервиса (например, на Python, Node.js или PHP), который работает рядом с MySQL и предоставляет REST API. В этом случае 1С отправляет обычные HTTP-запросы с помощью объекта HTTPСоединение и получает JSON-ответы, что полностью исключает зависимость от сторонних COM-объектов и системных ODBC-драйверов.

Таким образом, для устранения ошибки достаточно установить 64-битный драйвер MySQL Connector/ODBC на сервер приложений 1С и убедиться, что строка подключения указывает правильное имя установленного драйвера.

← На главную