Чтение и запись данных MySQL из 1С:Предприятия 8.3 через ODBC

· 10 мин

Содержание

Подключить 1С к MySQL можно двумя способами: через внешний источник данных в конфигураторе (ветка Внешние источники данных) или из кода через COM-объект ADODB.Connection. В обоих случаях между ними стоит ODBC-драйвер MySQL Connector/ODBC. Хранить саму информационную базу 1С в MySQL нельзя: платформа 8.3 работает с файловым вариантом, Microsoft SQL Server, PostgreSQL, IBM Db2 и Oracle Database.

Типичная ситуация: сайт на CMS пишет заказы в MySQL, а бухгалтерии нужно видеть их в 1С без выгрузок в Excel. Настройка подключения 1С:Предприятия к базе MySQL занимает час, если заранее понимать три вещи: под каким пользователем ходит 1С, какой разрядности процесс открывает соединение и в какой кодировке лежат данные.

Подготовка сервера MySQL: пользователь, права, сетевой доступ

Начните с отдельного пользователя MySQL для 1С. Не давайте 1С учётку root и не используйте логин, под которым работает сайт.

Пример для пользователя, который только читает базу shop и подключается из локальной сети 192.168.1.0/24:

CREATE USER 'onec_reader'@'192.168.1.%' IDENTIFIED BY 'СложныйПароль_2x9';
GRANT SELECT ON shop.* TO 'onec_reader'@'192.168.1.%';
FLUSH PRIVILEGES;

Если 1С должна записывать статусы заказов обратно, выдайте права точечно, на конкретную таблицу:

GRANT SELECT, UPDATE ON shop.orders TO 'onec_reader'@'192.168.1.%';

Что проверить на стороне сервера

  • 🌐 Адрес прослушивания. В Ubuntu параметр bind-address лежит в /etc/mysql/mysql.conf.d/mysqld.cnf. Значение 127.0.0.1 пускает только локальные подключения. Поставьте IP сетевого интерфейса или 0.0.0.0 и перезапустите службу MySQL.
  • 🔥 Брандмауэр. Откройте порт 3306 только для адреса сервера 1С, а не для всего интернета.
  • 🔐 Плагин аутентификации. В MySQL 8 по умолчанию caching_sha2_password. Старые драйверы ODBC 5.x его не понимают. Решение — поставить драйвер 8.x, а не понижать защиту пользователя.
  • 🔤 Кодировка. Проверьте кодировку таблиц: SHOW CREATE TABLE orders;. Для кириллицы нужна utf8mb4 (или хотя бы utf8). Таблицы в latin1 с русским текстом дадут «кракозябры» в любом клиенте.

Перезапуск службы MySQL обрывает подключения сайта и других программ. Делайте это в тихое время и предупредите тех, кто отвечает за сайт.

Проверьте доступ ещё до 1С. С компьютера, где будет работать 1С, выполните mysql -h 192.168.1.20 -u onec_reader -p shop или подключитесь любым клиентом вроде HeidiSQL. Если не пускает здесь, 1С тоже не пустит.

Установка ODBC-драйвера MySQL нужной разрядности

Драйвер называется MySQL Connector/ODBC, его скачивают с официального сайта MySQL. В комплекте две версии: Unicode и ANSI. Для 1С берите Unicode — с ней не бывает проблем с кириллицей.

Где ставить драйвер

Главное правило: драйвер ставится туда, где выполняется код, открывающий соединение, и той же разрядности, что и этот процесс.

Вариант базыКто открывает соединениеГде нужен драйвер
ФайловаяКлиентское приложение 1С на рабочем местеНа каждом компьютере пользователя, разрядность как у клиента 1С
Клиент-сервернаяРабочий процесс rphost на сервере 1СНа сервере 1С, разрядность как у сервера 1С (обычно 64 бит)
Клиент-серверная, код &НаКлиенте через COMКлиент 1СНа компьютерах пользователей

Разрядность клиента 1С видна в каталоге установки: C:\Program Files\1cv8 — 64-битная платформа, C:\Program Files (x86)\1cv8 — 32-битная.

Администратор источников ODBC

В Windows два администратора ODBC, и это главный источник путаницы:

  • 64-битный: C:\Windows\System32\odbcad32.exe;
  • 32-битный: C:\Windows\SysWOW64\odbcad32.exe.

Драйвер и DSN, созданные в одном, не видны в другом. На вкладке «Драйверы» найдите точное имя драйвера, например MySQL ODBC 8.0 Unicode Driver. Имя меняется с версией коннектора, а в строку соединения его нужно вписать буква в букву.

DSN или строка без DSN

Есть два варианта указать подключение:

  1. Системный DSN. Создаётся на вкладке «Системный DSN». Пользовательский DSN не подходит для сервера 1С: служба работает под своей учётной записью (обычно USR1CV8) и чужих пользовательских DSN не видит.
  2. Строка без DSN. Все параметры прямо в строке соединения. Удобнее при переносе базы: настройка живёт в 1С, а не в Windows.

Строка без DSN для MySQL:

Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.20;Port=3306;Database=shop;User=onec_reader;Password=СложныйПароль_2x9;CHARSET=utf8mb4;

На сервере 1С под Linux схема та же, только вместо администратора ODBC работает unixODBC: драйвер регистрируется в /etc/odbcinst.ini, а имя из квадратных скобок этого файла подставляется в Driver={...}.

Внешний источник данных: настройка подключения в конфигурации 1С

Внешний источник данных — штатный объект конфигурации. Таблицы MySQL становятся видны в запросах 1С почти как справочники и регистры. Для типовой конфигурации добавляйте его в расширение, чтобы не снимать конфигурацию с поддержки.

Шаги в конфигураторе

  1. Откройте конфигуратор, затем Конфигурация → Расширения конфигурации и создайте расширение или откройте существующее.
  2. В дереве расширения найдите ветку Внешние источники данных, добавьте новый источник, например СайтMySQL.
  3. В источнике раскройте ветку Таблицы и в контекстном меню выберите добавление таблиц из внешнего источника. Конфигуратор спросит строку соединения, логин и пароль, подключится и покажет список таблиц и представлений MySQL.
  4. Отметьте нужные таблицы и поля. Конфигуратор сам подберёт типы: INT → Число, VARCHAR → Строка, DATETIME → Дата.
  5. В свойствах таблицы проверьте тип данных (объектные или необъектные) и поле ключа. Для записи нужна таблица с ключом — обычно это первичный ключ id.
  6. Сохраните расширение и обновите конфигурацию базы данных.

Подключайте не сами таблицы сайта, а заранее созданные в MySQL представления (CREATE VIEW). Тогда структуру сайта можно менять, не трогая 1С, а в представлении уже отфильтрованы и приведены к нужному виду только нужные поля.

Параметры соединения в режиме 1С:Предприятие

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

В форме источника укажите:

  • СУБД — MySQL;
  • строку соединения ODBC (ту же, что выше, без логина и пароля);
  • стандартную аутентификацию, имя пользователя и пароль MySQL.

Параметры можно задать общие для всех пользователей или отдельно для конкретного пользователя 1С.

Работа с данными MySQL через встроенный язык

Запрос к внешнему источнику

После подключения таблицы MySQL доступны в языке запросов:

&НаСервере
Процедура ЗагрузитьНовыеЗаказыНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Заказы.id КАК Номер,
    |    Заказы.customer_email КАК Почта,
    |    Заказы.total КАК Сумма,
    |    Заказы.created_at КАК Дата
    |ИЗ
    |    ВнешнийИсточникДанных.СайтMySQL.Таблица.orders КАК Заказы
    |ГДЕ
    |    Заказы.created_at >= &НачалоПериода";
    Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()) - 7 * 86400);

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(СтрШаблон("Заказ %1 от %2 на сумму %3",
            Формат(Выборка.Номер, "ЧГ=0"), Выборка.Дата, Выборка.Сумма));
    КонецЦикла;

КонецПроцедуры

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

Установка соединения из кода

Чтобы не настраивать источник руками в каждой базе, параметры можно задать программно, например при первом запуске обработки:

Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СУБД = "MySQL";
Параметры.СтрокаСоединения = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.20;Port=3306;Database=shop;CHARSET=utf8mb4;";
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "onec_reader";
Параметры.Пароль = "СложныйПароль_2x9";

ВнешниеИсточникиДанных.СайтMySQL.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.СайтMySQL.УстановитьСоединение();

Не храните пароль MySQL открытым текстом в модуле. Передавайте его через безопасное хранилище или константу с ограниченным доступом, а в коде держите только чтение этого значения.

Прямой доступ через ADO

Если менять конфигурацию нельзя совсем (например, нужна разовая внешняя обработка .epf), работайте через COM-объект ADO. Способ доступен только на Windows. В клиент-серверной базе код с &НаСервере выполняется на сервере 1С, и драйвер нужен там.

&НаСервере
Процедура ПрочитатьТоварыНаСервере()

    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString =
        "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.20;Port=3306;"
        + "Database=shop;User=onec_reader;Password=СложныйПароль_2x9;CHARSET=utf8mb4;";
    Соединение.Open();

    Набор = Новый COMОбъект("ADODB.Recordset");
    Набор.Open("SELECT sku, name, price FROM products WHERE active = 1", Соединение);

    Пока Не Набор.EOF Цикл
        Артикул = Набор.Fields("sku").Value;
        Наименование = Набор.Fields("name").Value;
        Цена = Набор.Fields("price").Value;
        Сообщить(СтрШаблон("%1 — %2: %3", Артикул, Наименование, Цена));
        Набор.MoveNext();
    КонецЦикла;

    Набор.Close();
    Соединение.Close();

КонецПроцедуры

Чем отличаются способы:

СпособКогда выбиратьОграничения
Внешний источник данныхПостоянная интеграция, отчёты, СКД по данным MySQLНужно расширение или изменение конфигурации
ADO через COMРазовая обработка, произвольный SQL, в том числе UPDATEТолько Windows, SQL пишется вручную, ошибки ловятся через Попытка
Обмен через файлы или HTTP-сервисСайт на внешнем хостинге, прямой доступ к порту 3306 закрытНужен посредник на стороне сайта

Для записи через ADO используйте Соединение.Execute("UPDATE ..."), но значения из 1С не склеивайте в SQL-строку напрямую: апостроф в наименовании сломает запрос. Экранируйте строки или используйте объект ADODB.Command с параметрами.

Ошибки подключения к MySQL и как их устранить

Диагностика: выберите симптом

Если в файловой базе подключение работает, а после перевода на сервер 1С перестало — почти всегда причина в том, что драйвер стоит на рабочем месте, а не на сервере, или DSN пользовательский.

Скорость обмена между 1С и MySQL

Медленный обмен обычно связан не с драйвером, а с тем, как построены запросы.

  • 📉 Не читайте построчно в цикле. Запрос к MySQL на каждый товар из 5 000 — это 5 000 обращений по сети. Один запрос с отбором по списку или по периоду быстрее в десятки раз.
  • 🎯 Выбирайте только нужные поля. SELECT * тянет описания товаров и картинки в BLOB-полях, которые 1С не нужны.
  • 🗂 Индексы на полях отбора. Если отбираете по updated_at, на нём должен быть индекс в MySQL. Проверьте план через EXPLAIN SELECT ....
  • ⏱ Инкрементальная загрузка. Храните в 1С дату последней успешной загрузки и забирайте только записи, изменённые после неё. Полная перезагрузка каталога раз в сутки — достаточно.
  • 📦 Порции. Большие таблицы читайте по диапазонам ключа: WHERE id > 120000 ORDER BY id LIMIT 1000, запоминая последний id. Это надёжнее, чем LIMIT ... OFFSET, который замедляется на дальних страницах.
  • 🔁 Фоновое выполнение. Регулярную загрузку оформите регламентным заданием, а не кнопкой в форме: пользователь не ждёт, а обмен идёт по расписанию, например раз в 15 минут.
  • 🧩 Одно соединение на сеанс обмена. В ADO откройте соединение один раз перед циклом и закройте после, а не на каждую операцию.

Если сайт на внешнем хостинге и порт 3306 открыть нельзя, не пробрасывайте его в интернет. Безопаснее SSH-туннель или HTTP-сервис на стороне сайта, который отдаёт данные в JSON.

Частые вопросы

Можно ли перевести информационную базу 1С на MySQL?
Нет. Платформа 1С:Предприятие 8.3 не поддерживает MySQL как СУБД информационной базы. Для клиент-серверного варианта используют PostgreSQL или Microsoft SQL Server, реже IBM Db2 и Oracle Database.
Подойдёт ли MariaDB вместо MySQL?
Обычно да: MariaDB совместима с MySQL по протоколу, и MySQL Connector/ODBC к ней подключается. У MariaDB есть и собственный ODBC-коннектор, его тоже можно использовать.
Нужен ли отдельный драйвер на каждом компьютере?
Только для файловой базы или кода, выполняемого на клиенте. В клиент-серверной базе серверный код ходит в MySQL с сервера 1С, и драйвер нужен только там.
Можно ли построить отчёт СКД прямо по таблице MySQL?
Да, таблица внешнего источника данных доступна в конструкторе запроса схемы компоновки так же, как объекты 1С. Не забывайте про ограничение: соединять её с таблицами 1С в одном запросе нельзя.
Что делать, если пароль MySQL сменили?
Обновите параметры в Управление внешними источниками данных или перезапустите код, устанавливающий параметры соединения. Структуру в конфигураторе перезагружать не нужно.