Чтение и запись данных MySQL из 1С:Предприятия 8.3 через ODBC
Содержание
Подключить 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
Есть два варианта указать подключение:
- Системный DSN. Создаётся на вкладке «Системный DSN». Пользовательский DSN не подходит для сервера 1С: служба работает под своей учётной записью (обычно
USR1CV8) и чужих пользовательских DSN не видит. - Строка без 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С почти как справочники и регистры. Для типовой конфигурации добавляйте его в расширение, чтобы не снимать конфигурацию с поддержки.
Шаги в конфигураторе
- Откройте конфигуратор, затем
Конфигурация → Расширения конфигурациии создайте расширение или откройте существующее. - В дереве расширения найдите ветку
Внешние источники данных, добавьте новый источник, напримерСайтMySQL. - В источнике раскройте ветку
Таблицыи в контекстном меню выберите добавление таблиц из внешнего источника. Конфигуратор спросит строку соединения, логин и пароль, подключится и покажет список таблиц и представлений MySQL. - Отметьте нужные таблицы и поля. Конфигуратор сам подберёт типы:
INT→ Число,VARCHAR→ Строка,DATETIME→ Дата. - В свойствах таблицы проверьте тип данных (объектные или необъектные) и поле ключа. Для записи нужна таблица с ключом — обычно это первичный ключ
id. - Сохраните расширение и обновите конфигурацию базы данных.
Подключайте не сами таблицы сайта, а заранее созданные в 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 и как их устранить
'onec_reader'@'192.168.1.%'.127.0.0.1. Проверьте bind-address и правила брандмауэра на порт 3306.SHOW GRANTS FOR 'onec_reader'@'192.168.1.%';.CHARSET=utf8mb4; в строку соединения. Если таблица в latin1, исправлять нужно саму таблицу.0000-00-00, которых нет в 1С. Замените их в представлении на NULL: CASE WHEN created_at < '1000-01-01' THEN NULL ELSE created_at END.Если в файловой базе подключение работает, а после перевода на сервер 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?
Подойдёт ли MariaDB вместо MySQL?
Нужен ли отдельный драйвер на каждом компьютере?
Можно ли построить отчёт СКД прямо по таблице MySQL?
Что делать, если пароль MySQL сменили?
Управление внешними источниками данных или перезапустите код, устанавливающий параметры соединения. Структуру в конфигураторе перезагружать не нужно.