Yandex Metrika
sanches.free

MySQL из 1С через ADODB: строка ODBC, параметры процедуры и функции

Зачем это битриксоцентричному читателю

В e‑commerce на 1С‑Битрикс база часто живёт под MySQL, а учёт или обмен может идти из «толстой» 1С на Windows. ADODB здесь — мост между COM и ODBC-драйвером MySQL. Ниже — не копирование документации, а собранный паттерн: открыть соединение, безопасно передать параметры в процедуру и считать скаляр из функции.

Строка подключения

Используйте фактическое имя ODBC-драйвера из «Администратор источников данных ODBC» (odbcad32.exe). Пример строки под 5.x ANSI (подставьте свои реквизиты и версию драйвера):

СтрокаСервера = "10.0.0.12";
Пользователь = "app_user";
Пароль = "********";
ИмяБазы = "shop_db";

СтрокаПодключения =
    "DRIVER={MySQL ODBC 8.0 ANSI Driver};"
    + "SERVER=" + СокрЛП(СтрокаСервера) + ";"
    + "UID=" + СокрЛП(Пользователь) + ";"
    + "PWD=" + СокрЛП(Пароль) + ";"
    + "DATABASE=" + СокрЛП(ИмяБазы) + ";"
    + "PORT=3306;";

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionTimeout = 30;
Соединение.Open(СтрокаПодключения);

Таймауты и кодировку согласуйте с настройками сервера MySQL; для обмена с сайтом обычно важны wait_timeout и размер пакета.

Вызов хранимой процедуры

Для процедуры типа SetField с именованными параметрами создаётся объект ADODB.Command, тип команды 4 (stored procedure), затем параметры через CreateParameter и Parameters.Append. Сигнатура CreateParameter на стороне ADO: имя, тип данных ADO, направление, размер, значение — см. справку MSDN по перечислению DataTypeEnum.

Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandType = 4; // хранимая процедура
Команда.CommandText = "SetField";

П1 = Команда.CreateParameter("_docid", 3, 1, 11, 2); // adInteger, Input
Команда.Parameters.Append(П1);
// ... остальные параметры по схеме процедуры

Команда.Execute();

Соответствие типов MySQL и констант ADO проще держать в маленькой таблице в коде/модуле и не смешивать «на глаз»: для строк чаще adVarChar (200), для больших бинарных полей — adLongVarBinary (205), для целых — adInteger (3).

Функция, возвращающая скаляр, и поток с файлом

Для вызова пользовательской функции в SQL тексте команды указывается SELECT … AS alias, тип команды — текст (например, 1). Файл в параметр удобно передать через ADODB.Stream в бинарном режиме и далее в параметр бинарного типа.

Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; // adTypeBinary
Поток.Open();
Поток.LoadFromFile("C:\\tmp\\document.txt");

Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandTimeout = 60;
Команда.CommandText = "SELECT CreateDocument(?, ?, ?, ?, ?, ?, ?) AS new_id";
Команда.CommandType = 1;

// параметры _idedo, сигнатуры, ключи, имя файла, содержимое — по вашей сигнатуре функции

Набор = Команда.Execute();
Сообщить(Набор.Fields("new_id").Value);

Оборачивайте открытие и выполнение в Попытка … Исключение, логируйте текст ошибки и момент времени — на стороне MySQL одновременно смотрите SHOW ENGINE INNODB STATUS и slow log, если обмен «подвисает».

Эксплуатация и безопасность

Минимизируйте права учётной записи MySQL под 1С (только нужные процедуры/базы). Не зашивайте пароли в хранилище конфигурации без шифрования. Для сценариев с каталогом Битрикс помните про кодировки таблиц (utf8mb4) и согласованность с обменом заказами.

Итог

ADODB в 1С даёт предсказуемый способ дергать подготовленные на стороне MySQL процедуры и функции — полезно для обмена с интернет-магазином и кастомными таблицами рядом с ядром 1С‑Битрикс.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии