Решение задач 1С:Предприятие 8 на примерах

Как подключиться к базе 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.

Как получить в запросе начальные и конечные остатки на каждый день, месяц или другой период

Обычные формы, Управляемые формы, Запросы

Виртуальная таблица ОстаткиИОбороты не возвращает строки за дни без движений. Показываем запрос с таблицей дат, который даёт начальный и конечный остаток на каждый день периода.

Как в 1С изменить размер изображения

Обычные формы

Уменьшаем фотографию до 2048 пикселей по большей стороне с сохранением пропорций: подключаем внешнюю компоненту GraphicsNET и сохраняем результат в JPG.

Как настроить отправку писем из 1С через Gmail

Обычные формы

Настраиваем отправку писем из 1С через Gmail: профиль SMTP, создание сообщения с вложением и отправка объектом ИнтернетПочта, а также что изменилось в требованиях Google.

Как раскрасить ячейку или область табличного документа в зависимости от условия

Обычные формы

Программно оформляем ячейку табличного документа по условию: выводим область макета, получаем её координаты и меняем цвет фона нужной ячейки через метод Область().