При регулярной синхронизации каталогов, остатков, цен и индивидуальных условий продаж по множеству контрагентов стандартные механизмы обмена через XML-файлы могут работать слишком долго. Преобразование больших массивов объектов в XML-структуру и обратный парсинг на стороне сайта создают высокую нагрузку на процессор и диск. Рассмотрим, как организовать прямую запись данных из 1С в базу данных MySQL и какие нюансы архитектуры и безопасности необходимо учитывать.
Подключение через COM-объект ADODB.Connection позволяет напрямую выполнять SQL-запросы к удаленной СУБД MySQL. Это один из самых быстрых способов в реализации, когда требуется выполнять пакетную вставку или обновление строк.
Разберем по шагам создание подключения и пакетную передачу строк:
ADODB.Connection и откроем соединение, указав параметры сервера, базы данных, пользователя и пароль.SET NAMES utf8mb4, чтобы избежать проблем с искажением кириллических символов.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();
Платформа 1С:Предприятие содержит штатный механизм «Внешние источники данных», который позволяет подключить внешнюю реляционную таблицу и работать с ней как со стандартным объектом метаданных (например, через менеджер записи или объектное чтение/запись).
Проанализируем технические особенности этого способа:
PRIMARY KEY). Без него таблица подключится только в режиме «только чтение».Когда требуется загрузить миллионы строк за считанные секунды, самым производительным решением является выгрузка данных из 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(СтрокаКоманды);
УдалитьФайлы(ИмяФайла);
Прямой доступ к базе данных сайта несет существенные риски, поэтому необходимо соблюдать следующие требования:
3306) никогда не должен быть открыт в публичный интернет. Подключение между сервером 1С и сервером сайта должно выполняться строго внутри защищенного туннеля (VPN, WireGuard, IPSec) либо по белому списку статических IP-адресов.site_prices_temp), а затем мгновенно подменять ее через атомарную команду RENAME TABLE site_prices TO site_prices_old, site_prices_temp TO site_prices; DROP TABLE site_prices_old;.ADODB.Connection невозможно. В этом случае следует использовать механизм внешних источников данных через unixODBC либо организовывать взаимодействие через HTTP-сервисы и JSON, что является современным и безопасным стандартом интеграции.