Как быстро выгрузить большой объем данных из 1С напрямую в MySQL сайта

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Вариант 1. Прямое подключение через ADODB

Подключение через COM-объект ADODB.Connection позволяет напрямую выполнять SQL-запросы к удаленной СУБД MySQL. Это один из самых быстрых способов в реализации, когда требуется выполнять пакетную вставку или обновление строк.

Разберем по шагам создание подключения и пакетную передачу строк:

  1. Установим на сервере, где выполняется код 1С, драйвер MySQL Connector/ODBC.
  2. Создадим COM-объект ADODB.Connection и откроем соединение, указав параметры сервера, базы данных, пользователя и пароль.
  3. Явно установим кодировку соединения с помощью команды SET NAMES utf8mb4, чтобы избежать проблем с искажением кириллических символов.
  4. Сформируем пакетные SQL-запросы вида INSERT INTO ... VALUES (...) и выполним их в рамках транзакции.

Посмотрим на пример кода пакетной вставки данных:


Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=192.168.1.100;DATABASE=site_db;UID=user_1c;PWD=SecretPassword;OPTION=3;";

Попытка
    Соединение.Open(СтрокаПодключения);
    Соединение.Execute("SET NAMES utf8mb4");
Исключение
    ВызватьИсключение "Не удалось подключиться к MySQL: " + ОписаниеОшибки();
КонецПопытки;

// Открываем транзакцию для ускорения вставки
Соединение.Execute("START TRANSACTION");

ТекстЗапросаSQL = "INSERT INTO site_prices (client_code, item_code, price) VALUES ";
МассивСтрок = Новый Массив;

Для Каждого Стр Из ТаблицаЦен Цикл
    МассивСтрок.Добавить(СтрШаблон("('%1', '%2', %3)", Стр.КодКонтрагента, Стр.Артикул, Стр.Цена));
    
    // Отправляем порциями по 1000 записей
    Если МассивСтрок.Количество() >= 1000 Тогда
        ЗапросПакет = ТекстЗапросаSQL + СтрСоединить(МассивСтрок, ", ") + " ON DUPLICATE KEY UPDATE price = VALUES(price);";
        Соединение.Execute(ЗапросПакет);
        МассивСтрок.Очистить();
    КонецЕсли;
КонецЦикла;

Если МассивСтрок.Количество() > 0 Тогда
    ЗапросПакет = ТекстЗапросаSQL + СтрСоединить(МассивСтрок, ", ") + " ON DUPLICATE KEY UPDATE price = VALUES(price);";
    Соединение.Execute(ЗапросПакет);
КонецЕсли;

Соединение.Execute("COMMIT");
Соединение.Close();

Вариант 2. Использование механизма «Внешние источники данных» (ВИД)

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

Проанализируем технические особенности этого способа:

  1. Разрядность драйверов (Bitness): Разрядность установленного драйвера MySQL Connector/ODBC обязана строго совпадать с разрядностью сервера 1С:Предприятие (32-бит или 64-бит). Несовпадение разрядностей приведет к ошибке инициализации драйвера.
  2. Требование к первичному ключу: Чтобы внешняя таблица была доступна для записи и изменения данных, в MySQL у нее обязательно должен быть определен первичный ключ (PRIMARY KEY). Без него таблица подключится только в режиме «только чтение».
  3. Производительность: Объектная запись через ВИД генерирует отдельные SQL-запросы на каждую строчку. Если объем данных составляет сотни тысяч записей, скорость будет ниже, чем при пакетной вставке через прямой SQL или текстовые дампы.

Вариант 3. Максимальное ускорение через текстовые файлы (LOAD DATA LOCAL INFILE)

Когда требуется загрузить миллионы строк за считанные секунды, самым производительным решением является выгрузка данных из 1С в плоский файл формата CSV/TSV с помощью объекта ЗаписьТекста и последующее выполнение команды массовой загрузки СУБД:


// 1. Формируем файл выгрузки на стороне 1С
ИмяФайла = ПолучитьИмяВременногоФайла("csv");
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

Для Каждого Стр Из ТаблицаЦен Цикл
    СтрокаФайла = Стр.КодКонтрагента + ";" + Стр.Артикул + ";" + Формат(Стр.Цена, "ЧГ=0; ЧДЦ=2; ЧРД=.") + Символы.ПС;
    Запись.Записать(СтрокаФайла);
КонецЦикла;

Запись.Закрыть();

// 2. Выполняем загрузку через ADODB
СтрокаКоманды = "LOAD DATA LOCAL INFILE '" + СтрЗаменить(ИмяФайла, "\", "/") + "' " +
                "INTO TABLE site_prices " +
                "FIELDS TERMINATED BY ';' " +
                "LINES TERMINATED BY '\n' " +
                "(client_code, item_code, price);";

Соединение.Execute(СтрокаКоманды);
УдалитьФайлы(ИмяФайла);

Важные правила безопасности и архитектуры

Прямой доступ к базе данных сайта несет существенные риски, поэтому необходимо соблюдать следующие требования:

  1. Защита сетевого подключения: Порт СУБД MySQL (по умолчанию 3306) никогда не должен быть открыт в публичный интернет. Подключение между сервером 1С и сервером сайта должно выполняться строго внутри защищенного туннеля (VPN, WireGuard, IPSec) либо по белому списку статических IP-адресов.
  2. Использование промежуточных таблиц (Staging): Запись больших массивов напрямую в рабочую таблицу интернет-магазина может вызывать блокировки строк, медленную работу каталога для покупателей или отображение неполных цен в момент перезаписи. Рекомендуется сначала загружать данные во временную таблицу (например, site_prices_temp), а затем мгновенно подменять ее через атомарную команду RENAME TABLE site_prices TO site_prices_old, site_prices_temp TO site_prices; DROP TABLE site_prices_old;.
  3. Учет операционной системы: Если сервер 1С работает под управлением ОС Linux, использование COM-объекта ADODB.Connection невозможно. В этом случае следует использовать механизм внешних источников данных через unixODBC либо организовывать взаимодействие через HTTP-сервисы и JSON, что является современным и безопасным стандартом интеграции.
← На главную