В практике интеграции 1С с внешними системами часто возникает задача прямого получения данных из базы сайта, которая обычно работает под управлением MySQL. Самым распространенным способом решения этой задачи является использование механизма ADO (ActiveX Data Objects) через COMОбъект. Однако на этом пути программисты часто сталкиваются с каскадом ошибок: от неправильных строк подключения до сетевых блокировок. В этой статье мы подробно разберем, как правильно настроить соединение, какие драйверы использовать и что проверить, если сервер «отказывает в доступе».
Для начала проанализируем базовый механизм. Чтобы 1С смогла «поговорить» с MySQL, нам нужен посредник — ODBC-драйвер. Со стороны 1С мы создаем объект ADODB.Connection, передаем ему строку подключения, в которой указан этот драйвер, и параметры сервера (адрес, база, логин, пароль).
Рассмотрим стандартный шаблон инициализации соединения (похожий принцип используется при выполнении запросов через COM-подключение к другим базам), который часто используют разработчики:
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "Driver={MySQL ODBC 5.3 Unicode Driver};Server=" + Сервер + ";Database=" + БазаДанных + ";UID=" + Пользователь + ";PWD=" + Пароль + ";Option=3;";
Соединение.ConnectionString = СтрокаСоединения;
Попытка
Соединение.Open();
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;
Обратим внимание на важный нюанс: в строке подключения мы используем Driver={MySQL ODBC 5.3 Unicode Driver}. Если в системе установлен драйвер другой версии (например, 8.0), имя в фигурных скобках должно быть изменено соответствующим образом. Если имя драйвера указано неверно, система выдаст ошибку о том, что источник данных не найден.
Выясним одну из самых коварных причин, по которой 1С не может подключиться к MySQL, даже если драйвер установлен. Это несоответствие разрядности. 1С:Предприятие чаще всего работает в 32-битной среде (особенно это касается тонких и толстых клиентов). Если вы скачали и установили 64-битный драйвер MySQL ODBC на 64-битную Windows, 32-битная 1С его просто «не увидит».
Проанализируем шаги для исправления этой ситуации:
C:\Windows\SysWOW64\odbcad32.exe.Посмотрим на типичные ошибки, которые возникают при вызове метода Open(). Если вы получаете сообщение [DBNETLIB][ConnectionOpen]SQL Server не существует, это означает, что вы используете провайдер Provider=SQLOLEDB, который предназначен для Microsoft SQL Server, а не для MySQL. Для MySQL мы всегда используем либо Provider=MSDASQL (с указанием Driver в строке), либо вообще опускаем параметр Provider, если используем прямую строку DSN-less подключения.
Если же возникает ошибка Can't connect to MySQL server on 'localhost' (10061) или Access denied for user, значит, проблема вышла за пределы кода 1С и переместилась на уровень настроек сервера. Разберем, что нужно проверить на стороне MySQL:
my.cnf или my.ini). Если параметр bind-address = 127.0.0.1, сервер будет принимать только локальные подключения. Для удаленной работы установите 0.0.0.0.'admin'@'localhost', он не сможет зайти под этим же паролем с IP-адреса вашей компании. Необходимо создать пользователя 'admin'@'%' или указать конкретный внешний IP.Часто после успешного подключения разработчик обнаруживает «кракозябры» вместо русских букв. Это происходит из-за несовпадения кодировок 1С, драйвера и таблиц базы. Проанализируем, как обеспечить корректную передачу данных. Сразу после открытия соединения рекомендуется принудительно установить кодировку сессии:
Соединение.Open();
// Устанавливаем кодировку для текущего сеанса
Соединение.Execute("SET NAMES cp1251");
Также обратите внимание на параметр Option=3 в строке соединения. Это битовая маска, которая сообщает драйверу, как себя вести. Значение 3 (1+2) включает поддержку динамических курсоров и передачу метаданных имен колонок, что крайне важно для корректной работы Recordset в 1С.
Рассмотрим полный цикл: подключение, выполнение запроса и перебор результатов (для комплексной автоматизации удобнее использовать подсистему выгрузки данных во внешнюю базу SQL). Это наиболее надежный способ работы с заказами с сайта:
ЗапросSQL = "SELECT id, customer_name, order_total FROM orders WHERE status = 'new'";
Recordset = Новый COMОбъект("ADODB.Recordset");
Попытка
Recordset.Open(ЗапросSQL, Соединение, 3, 1); // 3 - adOpenStatic, 1 - adLockReadOnly
Пока Recordset.EOF = 0 Цикл
НомерЗаказа = Recordset.Fields("id").Value;
Клиент = Recordset.Fields("customer_name").Value;
Сумма = Recordset.Fields("order_total").Value;
Сообщить("Заказ №" + НомерЗаказа + " от " + Клиент + " на сумму " + Сумма);
Recordset.MoveNext();
КонецЦикла;
Recordset.Close();
Исключение
Сообщить("Ошибка при чтении данных: " + ОписаниеОшибки());
КонецПопытки;
Если ваша конфигурация работает на платформе 8.3, мы рекомендуем рассмотреть современный подход — Внешние источники данных. Вместо написания кода на ADO, вы можете добавить таблицы MySQL прямо в дерево метаданных конфигурации. Это дает ряд преимуществ:
Для реализации этого метода вам также потребуется установленный ODBC-драйвер соответствующей разрядности (на сервере 1С, если код выполняется в фоновом задании, или на клиенте, если в интерактивном режиме).
Если соединение упорно не устанавливается, проанализируем ситуацию методом исключения. Попробуйте подключиться к базе через любую стороннюю утилиту (например, DBeaver или расширение MySQL для VS Code) с того же компьютера, где запущена 1С. Если сторонний софт подключается, значит, проблема в строке соединения или разрядности драйвера в 1С. Если не подключается и он — проблема в сетевых доступах или настройках самого MySQL сервера.
Используя эти рекомендации, мы сможем построить надежный и быстрый обмен данными между 1С и MySQL, избежав большинства стандартных ошибок новичков.