Как подключиться к базе MySQL из 1С через ODBC
Подключение к MySQL нужно, когда 1С обменивается остатками, ценами или заказами с базой сайта. В статье — три варианта подключения через ODBC и ADODB.Connection и примеры запросов SELECT и INSERT из кода 1С.
Варианты подключения и примеры кода
Обмен данными между базами 1С и MySQL можно реализовать при помощи драйвера ODBC. Скачать его можно перейдя по ссылке https://dev.mysql.com/downloads/connector/odbc. Скачать и установить требуется сразу 2 драйвера - и 32-битный и 64-битный, независимо от вашей ОС. Потому что часто бывают непонятные ситуации, когда не удается наладить подключение, используя только один драйвер. В этой статье рассмотрим 3 варианта подключения из 1С к MySQL, используя данный драйвер. В моих примерах я использую версию ODBC 5.3.6.
1) Через созданный DSN и полностью настроенный - с указанием пароля, юзера, БД и др.
Создание и настройка DSN производится в окне Администратора источника данных ODBC на вкладках "Пользовательский DSN" и "Системный DSN". Нажимаем кнопку "Добавить", выбираем наш установленный драйвер, заполняем поля:
Data Source Name - имя DSN;
TCP/IP Server - сервер MySQL (адрес сайта, если подключение ведется к БД сайта);
Port - по умолчанию 3306;
User - имя пользователя БД MySQL;
Password - пароль пользователя БД MySQL;
Database - база данных MySQL.
В 1С прописываем функцию подключения:
Функция ПодключениеКСайту()
Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DSN=ИмяDSN;"; //указываем значение из поля Data Source Name в окне настроек DSN Попытка
Connection.Open(СтрокаПодключения);
Возврат Connection;
Исключение
Сообщить("Не удалось подключится к сайту!");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции2) Через созданный DSN, у которого указано только имя (Data Source Name)Создаем DSN в окне Администратора источника данных ODBC на вкладках "Пользовательский DSN" и "Системный DSN", но указываем только имя DSN. Все остальные поля будем заполнять программно.
В 1С прописываем функцию подключения:
Функция ПодключениеКСайту()
Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DSN=ИмяDSN;"; //указываем значение из поля Data Source Name в окне настроек DSN Connection = Новый COMОбъект("ADODB.Connection");
ДСН = "ИмяDSN"; //указываем значение из поля Data Source Name в окне настроек DSN
СРВ = "ИмяСервера"; // сервер MySQL (адрес сайта, если подключение ведется к БД сайта)
УИД = "ИмяПользователя"; // имя пользователя БД MySQL
ПВД = "Пароль"; // пароль пользователя БД MySQL
БД = "ИмяБД"; // пароль пользователя БД MySQL СтрокаПодключения = "DSN=" + ДСН + ";Server=" + СРВ + ";Database=" + БД + ";UID=" + УИД + ";PWD=" + ПВД;
Connection.ConnectionString = СтрокаПодключения;
Попытка
Connection.Open();
Возврат Connection;
Исключение
Сообщить("Не удалось подключится к сайту!");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции3) Без созданного DSN, создаем его полностью программноВ 1С прописываем функцию подключения:
Функция ПодключениеКСайту()
Connection = Новый COMОбъект("ADODB.Connection");
Провайдер = "MSDASQL.1"; // имя провайдера ODBC, чаще всего указывается именно такой
Драйвер = "MySQL ODBC 5.3 ANSI Driver"; // Имя драйвера ODBC
СРВ = "ИмяСервера";
БД = "ИмяБД";
УИД = "ИмяПользователя";
ПВД = "Пароль";
СтрокаПодключения = "Provider=" + Провайдер + ";DRIVER=" + Драйвер + ";Server=" + СРВ + ";Database=" + БД + ";UID=" + УИД + ";PWD=" + ПВД + ";"; Попытка
Connection.Open(СтрокаПодключения);
Возврат Connection;
Исключение
Сообщить("Не удалось подключится к сайту!");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункцииТеперь рассмотрим несколько примеров как получать и передавать данные используя подключение через ODBC.1) Получим остатки товаров из таблицы goods_item_depozit из БД MySQL на сайте.
Процедура ЗагрузитьОстаткиИзСайта()
Connection = ПодключениеКСайту(); // одна из трех вышеописанных функций
Если Connection = Неопределено Тогда
Возврат;
КонецЕсли;
RecordSet = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection; ЗапросОстатковНаСайте =
"SELECT
|`goods_item_depozit`.`goods_name` AS `goods_name`,
|`goods_item_depozit`.`depozit_name` AS `depozit_name`,
|`goods_item_depozit`.`remained` AS `remained`
|FROM `goods_item_depozit`"; RecordSet.Open(ЗапросОстатковНаСайте, Connection);
Пока RecordSet.EOF() = 0 Цикл
НаименованиеТовара = RecordSet.Fields("goods_name").Value;
НаименованиеСклада = RecordSet.Fields("depozit_name").Value;
Остаток = RecordSet.Fields("remained").Value;
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
КонецПроцедуры2) Запишем остатки товара в таблицу goods_item_depozit из БД MySQL на сайте.Процедура ВыгрузитьОстаткиНаСайт()
Connection = ПодключениеКСайту(); // одна из трех вышеописанных функций
Если Connection = Неопределено Тогда
Возврат;
КонецЕсли;
RecordSet = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
НаименованиеТовара = "НаименованиеТовара";
НаименованиеСклада = "НаименованиеСклада";
Остаток = Формат(Остаток,"ЧГ=0"); // обязательно убираем группировку для числа ЗапросДобавленияОстатков =
"INSERT
|INTO `goods_item_depozit`
|SET
|`goods_name`='" + НаименованиеТовара + "',
|`depozit_name`='" + НаименованиеСклада + "',
|`remained`='" + Остаток + "'"; Command.CommandText = ЗапросДобавленияОстатков;
Command.CommandType = 1;
Попытка
RecordSet = Command.Execute();
Исключение
Сообщить ("Не удалось экспортировать остатки товара: " + НаименованиеТовара);
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Актуальность для новых версий
Подход через ODBC и ADODB работает и на платформе 8.3, но только на Windows, так как использует COM-объекты. Актуальные версии MySQL Connector/ODBC — 8.x и новее, поэтому в строке подключения указывайте точное имя установленного драйвера, например «MySQL ODBC 8.0 Unicode Driver». Разрядность драйвера должна совпадать с разрядностью процесса 1С, в котором выполняется код: клиента для клиентского кода или сервера 1С для серверного.
Частые вопросы
Какой драйвер ODBC ставить — 32- или 64-битный?
Тот, что совпадает по разрядности с процессом 1С, выполняющим подключение. На практике проще установить оба, чтобы подключение работало и из клиента, и с сервера.
Можно ли подключиться к MySQL без создания DSN?
Да. В строке подключения указываются провайдер MSDASQL, имя драйвера, сервер, база, пользователь и пароль — DSN в администраторе ODBC при этом не нужен.
Почему при записи числа в MySQL возникает ошибка?
1С по умолчанию форматирует числа с разделителями групп разрядов. Перед подстановкой в SQL-запрос уберите группировку функцией Формат с параметром ЧГ=0.
Как прочитать результат SELECT в 1С?
Через объект ADODB.Recordset: открыть его запросом, обходить в цикле до EOF и читать значения полей через Fields("имя").Value.