1С и MySQL: драйвер ODBC, ADO-соединение и внешний источник данных

· 10 мин

Содержание

Подключиться к 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

  1. Скачайте Connector/ODBC с сайта MySQL (раздел Downloads → Connector/ODBC). Для MySQL 8.x берите драйвер версии 8.0 или новее.
  2. Установите нужную разрядность. Если на машине работают и 32-, и 64-битные программы 1С, ставьте обе версии — они не конфликтуют.
  3. Для работы драйверу нужен Microsoft Visual C++ Redistributable. Установщик обычно сообщает, если его нет.
  4. Проверьте результат: откройте администратор 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

  1. Откройте администратор ODBC нужной разрядности.
  2. Перейдите на вкладку «Системный DSN». Не «Пользовательский»: служба сервера 1С работает под своей учётной записью и пользовательские DSN другого человека не видит.
  3. Нажмите «Добавить», выберите MySQL ODBC 8.0 Unicode Driver.
  4. Заполните поля: имя источника (например, mysql_shop), адрес сервера, порт 3306, пользователь, пароль, база данных.
  5. Нажмите Test — должно появиться сообщение об успешном соединении.
  6. В дополнительных параметрах (кнопка 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С, их можно выводить в динамический список и отчёт на СКД.

Создание в Конфигураторе

  1. Откройте конфигурацию (или расширение), ветку «Общие» → «Внешние источники данных».
  2. Добавьте источник, например MySQLShop.
  3. В источнике перейдите к таблицам и загрузите их описание из внешней базы: Конфигуратор запросит строку соединения ODBC, прочитает список таблиц и создаст поля с типами.
  4. Отметьте только нужные таблицы. Проверьте, что у каждой таблицы заполнены ключевые поля — без ключа динамический список с таблицей работать не будет.
  5. Обновите конфигурацию базы данных.

Настройка соединения в режиме 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). Смотрите на то, что идёт дальше в скобках.

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

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

Медленный обмен почти всегда упирается не в драйвер, а в объём данных и в то, как 1С их записывает.

  1. Выбирайте только нужные колонки. SELECT * по таблице с текстовыми полями тянет мегабайты лишнего.
  2. Фильтруйте на стороне MySQL. Условие в WHERE по индексированному полю отработает быстрее, чем перебор всей выборки в 1С.
  3. Забирайте только изменения. Храните в 1С дату или идентификатор последней загруженной записи и запрашивайте WHERE updated_at > ?. Для этого на поле updated_at в MySQL нужен индекс.
  4. Делите большие выборки. Читайте порциями по 5–10 тысяч строк: ORDER BY id LIMIT 5000 с условием id > последний_id. Так не упрётесь в память рабочего процесса и в тайм-ауты.
  5. Одно соединение на весь обмен. Открывать и закрывать соединение на каждую строку — самый частый тормоз в самописных обработках.
  6. Пишите в MySQL пакетами. Один INSERT на 500 строк (VALUES (...), (...), ...) в одной транзакции быстрее 500 отдельных команд в разы.
  7. Не держите транзакцию 1С открытой во время чтения из MySQL. Сначала загрузите данные в таблицу значений, потом записывайте объекты 1С — так короче блокировки в базе 1С.
  8. Переведите регулярный обмен в регламентное задание. Оно выполняется на сервере 1С, не зависит от открытого клиента и пишет ошибки в журнал регистрации.

💡 Для отчётов, которые читают MySQL на лету через внешний источник данных, следите за запросами на стороне MySQL: включите slow_query_log и посмотрите, какие запросы платформа реально отправляет. Часто достаточно добавить один индекс.

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

Можно ли подключиться к MySQL из 1С без ODBC?
Напрямую — нет: платформа работает с внешними базами через ODBC. Обходной путь — HTTP-сервис на стороне MySQL-приложения (например, PHP-скрипт сайта), к которому 1С обращается через HTTPСоединение.
Работает ли подключение к MySQL из 1С во фреш или облаке?
Как правило, нет: в облачных сервисах код выполняется в безопасном режиме, а установить свой драйвер ODBC на сервер провайдера нельзя. В таком случае обмен строят через HTTP-сервисы или файлы.
Подойдёт ли эта инструкция для MariaDB?
Да. MariaDB совместима с протоколом MySQL, и Connector/ODBC к ней подключается. У MariaDB есть и собственный драйвер MariaDB Connector/ODBC — тогда в строке соединения указывают его имя.
Как подключиться к MySQL на хостинге сайта?
Хостинг должен разрешать внешние подключения к базе. Обычно в панели хостинга добавляют IP-адрес сервера 1С в список разрешённых. Если внешний доступ закрыт, используйте SSH-туннель или выгрузку через HTTP.
Нужна ли отдельная лицензия 1С для обмена с MySQL?
Нет. Подключение через ODBC не требует дополнительных лицензий 1С. Лицензия расходуется только на сеанс пользователя или сервера, как обычно.