1С и MySQL: драйвер ODBC, ADO-соединение и внешний источник данных
Содержание
Подключиться к
MySQL из 1С 8.3 можно двумя способами. Первый — поставить драйвер MySQL Connector/ODBC и открыть соединение из кода через Новый COMОбъект("ADODB.Connection"). Второй — описать базу MySQL как внешний источник данных в Конфигураторе и читать её таблицы обычным языком запросов 1С.
Оба способа идут через ODBC. Главное условие — разрядность драйвера должна совпадать с разрядностью процесса 1С, который выполняет код: 64-битному серверу 1С нужен 64-битный драйвер, 32-битному клиенту — 32-битный. Почти все ошибки «драйвер не найден» происходят именно отсюда. Всё описанное относится к платформе 8.3 и не зависит от типовой конфигурации.
Что подготовить до настройки: драйвер, разрядность, пользователь MySQL
Где будет выполняться код
Сначала определите, на какой машине откроется соединение. От этого зависит, куда ставить драйвер.
| Режим работы 1С | Где выполняется код &НаСервере | Куда ставить драйвер |
|---|---|---|
| Файловая база, толстый или тонкий клиент | На компьютере пользователя | На каждый компьютер, где запускают обмен |
| Клиент-серверная база | На сервере 1С (рабочий процесс rphost) | На сервер 1С |
| Регламентное задание | На сервере 1С | На сервер 1С |
| Веб-клиент | На сервере 1С или веб-сервере (для файловой) | На сервер |
Разрядность платформы видно в окне Справка → О программе: рядом с номером версии указано 64-bit, если клиент 64-битный. Сервер 1С на Windows почти всегда ставят 64-битным.
Установка MySQL Connector/ODBC
- Скачайте Connector/ODBC с сайта MySQL (раздел Downloads → Connector/ODBC). Для MySQL 8.x берите драйвер версии 8.0 или новее.
- Установите нужную разрядность. Если на машине работают и 32-, и 64-битные программы 1С, ставьте обе версии — они не конфликтуют.
- Для работы драйверу нужен Microsoft Visual C++ Redistributable. Установщик обычно сообщает, если его нет.
- Проверьте результат: откройте администратор ODBC и на вкладке «Драйверы» найдите строки
MySQL ODBC 8.0 Unicode DriverиMySQL ODBC 8.0 ANSI Driver. Точное имя драйвера понадобится в строке соединения.
💡 Берите Unicode-драйвер. С ANSI-вариантом кириллица из базы в кодировке utf8mb4 часто приходит «кракозябрами».
Пользователь на стороне MySQL
Не подключайте 1С под root. Создайте отдельного пользователя с минимальными правами:
CREATE USER 'exchange_1c'@'192.168.1.%' IDENTIFIED BY 'СложныйПароль';
GRANT SELECT ON shop.* TO 'exchange_1c'@'192.168.1.%';
-- если 1С будет записывать данные:
-- GRANT SELECT, INSERT, UPDATE ON shop.* TO 'exchange_1c'@'192.168.1.%';
FLUSH PRIVILEGES;
Часть хоста '192.168.1.%' задаёт, с каких адресов разрешён вход. Если указать 'localhost', сервер 1С с другой машины не подключится.
Ещё две проверки на сервере MySQL:
- 🔌 порт
3306открыт в брандмауэре сервера; - 🌐 параметр
bind-addressвmy.cnf(илиmysqld.cnf) не равен127.0.0.1— иначе MySQL слушает только локальные подключения.
Регистрация источника данных ODBC (DSN) или строка без него
Где найти нужный администратор ODBC
В Windows два администратора ODBC, и это главный источник путаницы:
C:\Windows\System32\odbcad32.exe— 64-битный (несмотря на «32» в имени);C:\Windows\SysWOW64\odbcad32.exe— 32-битный.
В поиске меню «Пуск» они называются «Источники данных ODBC (64-разрядная версия)» и «(32-разрядная версия)». DSN, созданный в одном, не виден программам другой разрядности.
Создание системного DSN
- Откройте администратор ODBC нужной разрядности.
- Перейдите на вкладку «Системный DSN». Не «Пользовательский»: служба сервера 1С работает под своей учётной записью и пользовательские DSN другого человека не видит.
- Нажмите «Добавить», выберите
MySQL ODBC 8.0 Unicode Driver. - Заполните поля: имя источника (например,
mysql_shop), адрес сервера, порт3306, пользователь, пароль, база данных. - Нажмите Test — должно появиться сообщение об успешном соединении.
- В дополнительных параметрах (кнопка Details) задайте кодировку
utf8mb4.
Подключение без DSN
DSN удобен для проверки, но его надо создавать на каждой машине. Строка соединения с именем драйвера работает без регистрации:
Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.20;Port=3306;Database=shop;Uid=exchange_1c;Pwd=СложныйПароль;Charset=utf8mb4;
Если DSN всё же создан, строка короче: DSN=mysql_shop;Uid=exchange_1c;Pwd=СложныйПароль;.
Не храните пароль в тексте модуля. Вынесите параметры соединения в константу или отдельный справочник настроек с ограниченными правами доступа.
Подключение к MySQL из кода 1С через ADO
Самый быстрый путь — объект ADODB.Connection. Он есть в любой Windows и не требует менять конфигурацию: код можно запустить из внешней обработки.
&НаСервере
Функция ПодключитьсяКMySQL()
СтрокаСоединения = "Driver={MySQL ODBC 8.0 Unicode Driver};"
+ "Server=192.168.1.20;Port=3306;Database=shop;"
+ "Uid=exchange_1c;Pwd=СложныйПароль;Charset=utf8mb4;";
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = СтрокаСоединения;
Соединение.ConnectionTimeout = 15;
Соединение.CommandTimeout = 120;
Попытка
Соединение.Open();
Исключение
ЗаписьЖурналаРегистрации("Обмен с MySQL", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат Соединение;
КонецФункции
ConnectionTimeout — сколько секунд ждать соединения, CommandTimeout — сколько ждать выполнения запроса. Без них долгий запрос может упасть по умолчанию через 30 секунд.
Ограничения способа:
- 🪟
COMОбъектработает только на Windows. На сервере 1С под Linux этот код не выполнится — используйте внешний источник данных (следующий раздел) и драйвер через unixODBC. - 🔒 В безопасном режиме и в профиле безопасности без разрешения на COM-объекты создание
ADODB.Connectionзапрещено. Внешние обработки в типовых конфигурациях по умолчанию запускаются в безопасном режиме, поэтому обработку нужно подключать с разрешениями или переносить код в расширение.
Внешний источник данных MySQL в конфигурации
Внешний источник данных — объект метаданных, который описывает таблицы чужой базы. После настройки таблицы MySQL читаются запросом 1С, их можно выводить в динамический список и отчёт на СКД.
Создание в Конфигураторе
- Откройте конфигурацию (или расширение), ветку «Общие» → «Внешние источники данных».
- Добавьте источник, например
MySQLShop. - В источнике перейдите к таблицам и загрузите их описание из внешней базы: Конфигуратор запросит строку соединения ODBC, прочитает список таблиц и создаст поля с типами.
- Отметьте только нужные таблицы. Проверьте, что у каждой таблицы заполнены ключевые поля — без ключа динамический список с таблицей работать не будет.
- Обновите конфигурацию базы данных.
Настройка соединения в режиме 1С:Предприятие
Строка соединения задаётся отдельно от метаданных. Вручную — через Все функции → Стандартные → Управление внешними источниками данных. Из кода — так:
&НаСервере
Процедура НастроитьИсточникMySQL()
Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "Driver={MySQL ODBC 8.0 Unicode Driver};"
+ "Server=192.168.1.20;Port=3306;Database=shop;Charset=utf8mb4;";
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "exchange_1c";
Параметры.Пароль = "СложныйПароль";
Параметры.СУБД = "MySQL";
ВнешниеИсточникиДанных.MySQLShop.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.MySQLShop.УстановитьСоединение();
КонецПроцедуры
После этого таблица читается обычным запросом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.sku КАК Артикул,
| Товары.name КАК Наименование,
| Товары.price КАК Цена
|ИЗ
| ВнешнийИсточникДанных.MySQLShop.Таблица.products КАК Товары
|ГДЕ
| Товары.price > &МинЦена";
Запрос.УстановитьПараметр("МинЦена", 0);
Выборка = Запрос.Выполнить().Выбрать();
| Критерий | ADO из кода | Внешний источник данных |
|---|---|---|
| Нужно менять конфигурацию | Нет | Да (или расширение) |
| Сервер 1С на Linux | Не работает | Работает |
| Язык запросов | SQL диалекта MySQL | Язык запросов 1С |
| Динамический список, СКД | Нет | Да |
| Хранимые процедуры, сложный SQL | Да | Ограниченно |
| Когда выбирать | Разовая загрузка, обработка | Постоянная интеграция, отчёты |
SQL-запросы к MySQL из 1С: чтение, параметры, запись
Чтение результата построчно
Соединение = ПодключитьсяКMySQL();
Если Соединение = Неопределено Тогда
Возврат;
КонецЕсли;
Набор = Новый COMОбъект("ADODB.Recordset");
Набор.Open("SELECT sku, name, price, updated_at FROM products WHERE active = 1", Соединение);
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Пока Не Набор.EOF Цикл
Строка = Таблица.Добавить();
Строка.Артикул = Набор.Fields("sku").Value;
Строка.Наименование = Набор.Fields("name").Value;
Строка.Цена = Набор.Fields("price").Value;
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();
Сначала соберите данные в таблицу значений и закройте соединение, а уже потом пишите в справочники и регистры 1С. Так соединение с MySQL не висит открытым, пока 1С проводит документы.
Параметры вместо склейки строк
Склеивать SQL из значений, которые пришли от пользователя или из файла, опасно: кавычка в наименовании ломает запрос, а в худшем случае даёт SQL-инъекцию. Используйте ADODB.Command с параметрами ?:
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "UPDATE products SET price = ? WHERE sku = ?";
// 5 = adDouble, 200 = adVarChar, 1 = adParamInput
Команда.Parameters.Append(Команда.CreateParameter("price", 5, 1, 8, 1250.50));
Команда.Parameters.Append(Команда.CreateParameter("sku", 200, 1, 50, "A-1001"));
Команда.Execute();
Запись пакетом в транзакции
Если пишете много строк, оберните их в транзакцию ADO. При ошибке ничего не запишется наполовину:
Соединение.BeginTrans();
Попытка
Для Каждого Строка Из ТаблицаЦен Цикл
Команда.Parameters(0).Value = Строка.Цена;
Команда.Parameters(1).Value = Строка.Артикул;
Команда.Execute();
КонецЦикла;
Соединение.CommitTrans();
Исключение
Соединение.RollbackTrans();
ВызватьИсключение;
КонецПопытки;
Транзакции работают только с таблицами InnoDB. На MyISAM откат ничего не вернёт.
Даты и пустые значения
- 📅
NULLиз MySQL приходит в 1С какNULL. Перед записью в реквизит проверяйтеЕсли Значение = NULL Тогда. - 📅 Нулевые даты
0000-00-00в старых базах драйвер может не преобразовать в дату. Надёжнее отдать такие поля из MySQL строкой черезCAST(updated_at AS CHAR)и разобрать в 1С. - 🔢 Тип
DECIMALприходит числом,BIGINT— тоже числом, но для идентификаторов длиннее 15 знаков безопаснее читать их строкой.
Ошибки подключения 1С к MySQL и как их убрать
В 1С текст ошибки ODBC обычно приходит внутри обёртки Ошибка при вызове метода контекста (Open). Смотрите на то, что идёт дальше в скобках.
Test-NetConnection 192.168.1.20 -Port 3306 с сервера 1С.Charset=utf8mb4. Проверьте кодировку самой таблицы командой SHOW CREATE TABLE.wait_timeout или запрос вернул слишком большой пакет (max_allowed_packet). Открывайте соединение непосредственно перед обменом, а большие выборки делите на части.Как ускорить обмен данными между 1С и MySQL
Медленный обмен почти всегда упирается не в драйвер, а в объём данных и в то, как 1С их записывает.
- Выбирайте только нужные колонки.
SELECT *по таблице с текстовыми полями тянет мегабайты лишнего. - Фильтруйте на стороне MySQL. Условие в
WHEREпо индексированному полю отработает быстрее, чем перебор всей выборки в 1С. - Забирайте только изменения. Храните в 1С дату или идентификатор последней загруженной записи и запрашивайте
WHERE updated_at > ?. Для этого на полеupdated_atв MySQL нужен индекс. - Делите большие выборки. Читайте порциями по 5–10 тысяч строк:
ORDER BY id LIMIT 5000с условиемid > последний_id. Так не упрётесь в память рабочего процесса и в тайм-ауты. - Одно соединение на весь обмен. Открывать и закрывать соединение на каждую строку — самый частый тормоз в самописных обработках.
- Пишите в MySQL пакетами. Один
INSERTна 500 строк (VALUES (...), (...), ...) в одной транзакции быстрее 500 отдельных команд в разы. - Не держите транзакцию 1С открытой во время чтения из MySQL. Сначала загрузите данные в таблицу значений, потом записывайте объекты 1С — так короче блокировки в базе 1С.
- Переведите регулярный обмен в регламентное задание. Оно выполняется на сервере 1С, не зависит от открытого клиента и пишет ошибки в журнал регистрации.
💡 Для отчётов, которые читают MySQL на лету через внешний источник данных, следите за запросами на стороне MySQL: включите slow_query_log и посмотрите, какие запросы платформа реально отправляет. Часто достаточно добавить один индекс.
Частые вопросы
Можно ли подключиться к MySQL из 1С без ODBC?
HTTPСоединение.