При настройке интеграции 1С:Предприятия с внешними базами данных (например, сайтом на СУБД MySQL) через механизм «Внешние источники данных» или прямое ADO-соединение администраторы часто сталкиваются с крайне неприятной проблемой. Драйвер MySQL ODBC установлен в операционной системе Windows Server, тестовое подключение через сервисный файл .udl успешно устанавливается, однако сама 1С наотрез отказывается видеть этот драйвер, выдавая ошибки о том, что драйвер не найден в системе, или сообщая: «Операция не допускается, если объект закрыт».
В этой статье мы подробно проанализируем причины возникновения данной проблемы, разберем особенности работы 64-разрядных операционных систем Windows Server с 32- и 64-битными приложениями и пошагово настроим стабильное подключение.
Для начала давайте разберемся, почему возникает ситуация, когда файл .udl успешно соединяется с MySQL, а 1С выдает ошибку. Дело в том, что в 64-разрядной версии Windows Server по умолчанию при двойном клике на файл .udl операционная система запускает 64-битную версию утилиты тестирования соединений OLE DB. Если в системе установлен 64-битный драйвер MySQL ODBC, тест проходит успешно.
Однако, если сама платформа 1С (клиентское приложение или серверная служба) запущена в 32-битной разрядности, она физически не способна использовать 64-битные системные библиотеки и драйверы ODBC. Платформа обращается к 32-битному окружению, где нужный драйвер либо отсутствует, либо настроен некорректно. Верно и обратное: если служба «Агент сервера 1С» работает в 64-битном режиме, ей потребуется исключительно 64-битный драйвер, в то время как локальный Конфигуратор на компьютере администратора (который всегда является 32-битным приложением в старых версиях) будет требовать 32-битный драйвер для настройки метаданных.
Перед началом настройки нам необходимо четко определить разрядность используемых компонентов 1С. Обратим внимание на следующие правила:
Важное решение: Чтобы избежать конфликтов разрядностей при разработке и эксплуатации в клиент-серверном варианте, настоятельно рекомендуется установить на сервере оба драйвера — и 32-битный (x86), и 64-битный (x64). При этом крайне важно, чтобы их названия в системе были абсолютно идентичными (например, {MySQL ODBC 5.1 Driver} или {MySQL ODBC 5.1 Unicode Driver}). В таком случае и Конфигуратор, и Сервер 1С смогут инициализировать соединение по одной и той же строке подключения.
В операционной системе Windows x64 присутствуют два независимых диспетчера администратора источников данных ODBC. Если мы откроем его через стандартную «Панель управления», запустится 64-битная версия. Настроенные в ней источники 32-битная 1С просто не увидит.
Выполним настройку источников данных правильно:
C:\Windows\SysWOW64\odbcad32.exe
C:\Windows\System32\odbcad32.exe
После запуска соответствующего диспетчера перейдем на вкладку «Системный DSN» (System DSN). Ни в коем случае не используйте вкладку «Пользовательский DSN»!
Почему это критично: Пользовательский DSN сохраняется в ветке реестра текущего пользователя (Администратора) и абсолютно невидим для службы сервера 1С:Предприятия, которая работает под специальной системной учетной записью (например, USR1C8 или NetworkService). Создание источника в «Системном DSN» делает его доступным для всех служб и пользователей сервера.
Нажмем кнопку «Добавить», выберем установленный драйвер MySQL ODBC (рекомендуется использовать Unicode-версию драйвера для корректной передачи кириллицы) и укажем параметры подключения к вашей базе данных MySQL.
Иногда после установки дистрибутива MySQL Connector/ODBC драйвер не появляется в списке диспетчера ODBC или при попытке соединения выдает системную ошибку. Выясним причину этой проблемы.
Драйверы MySQL жестко зависят от библиотек Microsoft Visual C++ Redistributable. Версия пакета зависит от версии устанавливаемого драйвера (например, для старых версий Connector 5.1 часто требуется MSVC++ 2010 или 2013, для более новых — MSVC++ 2015-2022). Обратим внимание, что разрядность устанавливаемого пакета распространяемых компонентов Visual C++ должна строго соответствовать разрядности устанавливаемого драйвера. Убедитесь, что на сервере установлены пакеты MSVC++ нужной версии как для x86, так и для x64 архитектур.
Если драйверы установлены и настроены в Системном DSN, но 1С на сервере по-прежнему выдает ошибку инициализации, проверим права доступа для учетной записи, под которой запущена служба сервера 1С (по умолчанию это USR1C8):
regedit.HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI (а также к ветке HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI для 32-битных драйверов).USR1C8 (или группы, в которую он входит) есть права на чтение этой ветки.C:\Program Files\MySQL\Connector ODBC... и C:\Program Files (x86)\MySQL\Connector ODBC...). У пользователя USR1C8 должны быть права на чтение и выполнение файлов из этих директорий.Чтобы окончательно убедиться, что 32-битная 1С сможет использовать созданное подключение, мы можем принудительно запустить тестирование файла .udl в 32-битной среде. Для этого выполним в командной строке сервера (cmd) следующую команду:
C:\Windows\syswow64\rundll32.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll",OpenDSLFile "C:\PathToYourFile\connection.udl"
В открывшемся окне перейдем на вкладку «Подключение», выберем созданный Системный DSN или укажем параметры провайдера и нажмем «Проверить подключение». Если тест завершился успешно — 32-битная 1С гарантированно сможет подключиться к MySQL.
Давайте рассмотрим, как правильно написать код для инициализации подключения из 1С с использованием ADODB. Обратите внимание, что название драйвера в фигурных скобках Driver={...} должно символ в символ совпадать с названием драйвера на вкладке «Драйверы» в диспетчере ODBC.
Ниже приведем пример кода для надежного подключения к базе данных MySQL:
// Создаем объект соединения ADO
Соединение = Новый COMОбъект("ADODB.Connection");
// Формируем строку подключения без использования DSN (DSN-less connection)
// Указываем точное имя драйвера, сервер, базу данных, логин, пароль и порт
СтрокаСоединения = "Driver={MySQL ODBC 5.1 Unicode Driver};"
+ "Server=192.168.1.100;"
+ "Port=3306;"
+ "Database=my_web_db;"
+ "User=mysql_user;"
+ "Password=my_strong_password;"
+ "Option=3;"
+ "CharSet=utf8;"; // Явно задаем кодировку для исключения проблем с русскими символами
Попытка
Соединение.Open(СтрокаСоединения);
Сообщить("Успешное подключение к СУБД MySQL!");
Исключение
ТекстОшибки = ОписаниеОшибки();
Сообщить("Не удалось установить соединение по причине: " + ТекстОшибки);
КонецПопытки;
Если вам требуется передавать кириллические данные в кодировке Windows-1251, рекомендуется сразу после успешного открытия соединения принудительно выполнить команду инициализации кодировки в сессии СУБД:
// Установка кодировки сессии для корректной работы с кириллицей
Соединение.Execute("SET NAMES 'cp1251'");
Если у вас возникают сложности с постоянной прописью длинных строк подключения в коде или вы хотите делегировать администрирование параметров подключения системному администратору без изменения конфигурации 1С, мы можем использовать подключение через внешний файл свойств .udl.
Рассмотрим, как правильно реализовать такое подключение в коде 1С:
// Путь к предварительно настроенному файлу параметров соединения
ПутьКУдл = "C:\Connectors\mysql_production.udl";
Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
// Передаем путь к файлу в метод Open вместо явной строки подключения
Соединение.Open("File Name=" + ПутьКУдл);
Сообщить("Соединение через UDL-файл успешно установлено!");
Исключение
Сообщить("Ошибка подключения через файл UDL: " + ОписаниеОшибки());
КонецПопытки;
Использование конструкции "File Name=" + ПутьКУдл позволяет полностью изолировать параметры авторизации от программного кода 1С, повышая общую безопасность информационной системы и упрощая сопровождение базы данных при изменении паролей или адресов серверов СУБД.