Как настроить выгрузку данных из 1С в базу данных MySQL через ODBC?

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

Интеграция 1С с внешними базами данных, такими как MySQL или MariaDB, является классической задачей при построении систем отчетности, веб-витрин или обмена данными между различными корпоративными приложениями. В данной статье мы подробно разберем, как организовать процесс выгрузки данных, рассмотрим типичные ошибки начинающих разработчиков и выясним, как обеспечить стабильную работу соединения через COM-объект ADODB.Connection.

Шаг 1. Настройка окружения и выбор драйвера ODBC

Прежде чем приступать к написанию кода в 1С, необходимо убедиться, что в операционной системе установлен соответствующий драйвер ODBC. Это промежуточное звено, которое позволяет 1С «общаться» с сервером MySQL. Основная сложность здесь заключается в разрядности приложений.

Важный нюанс: разрядность драйвера должна совпадать с разрядностью приложения, которое инициирует соединение. Если вы используете 32-битный клиент 1С (толстый или тонкий клиент), вам необходимо установить MySQL ODBC Driver x86. Если же код выполняется на стороне 64-битного сервера 1С, потребуется 64-битная версия драйвера. Проанализируем типичную строку подключения:

DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=btu;USER=root;PASSWORD=my_password;

Если при попытке соединения вы получаете ошибку «Источник данных не найден и не указан драйвер, используемый по умолчанию», значит, либо драйвер не установлен, либо в строке подключения указано неверное имя (например, вы установили Unicode Driver, а в коде прописали ANSI Driver). Проверить точное имя установленного драйвера можно в «Администраторе источников данных ODBC» на вкладке «Драйверы».

Шаг 2. Установка соединения из 1С

Для работы с внешними базами данных в 1С чаще всего используется технология ADO (ActiveX Data Objects). Разберем процесс инициализации соединения. Нам потребуется создать объект ADODB.Connection и вызвать метод Open. Рекомендуется всегда использовать конструкцию Попытка...Исключение, чтобы информативно обрабатывать ошибки доступа.


// Определяем строку подключения
СтрокаПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=127.0.0.1;DATABASE=my_db;USER=admin;PASSWORD=pass;";
Соединение = Новый COMОбъект("ADODB.Connection");

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

Шаг 3. Получение данных в 1С и подготовка SQL-запроса

Типичная ошибка новичков заключается в попытке использовать встроенный язык запросов 1С напрямую в методах ADO. Помните: внутренние запросы 1С понимает только платформа 1С, а серверу MySQL нужно отправлять команды на чистом SQL. Процесс выгрузки обычно состоит из двух этапов: выборка данных из документов или справочников 1С и последующая итерационная вставка этих данных в MySQL.

Рассмотрим пример подготовки данных. Допустим, нам нужно выгрузить путевые листы. Сначала выполним обычный запрос в 1С:


Запрос1С = Новый Запрос;
Запрос1С.Текст = 
    "ВЫБРАТЬ
    |   ПутевойЛист.Дата КАК Дата,
    |   ПутевойЛист.Номер КАК Номер,
    |   ПутевойЛист.ТранспортноеСредство.Наименование КАК Авто
    |ИЗ
    |   Документ.ПутевойЛист КАК ПутевойЛист
    |ГДЕ
    |   ПутевойЛист.Дата >= &НачалоПериода";

Запрос1С.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Результат = Запрос1С.Выполнить();
Выборка = Результат.Выбрать();

Шаг 4. Выполнение INSERT в цикле

Теперь, когда у нас есть выборка 1С, мы должны сформировать текст SQL-запроса INSERT для каждой строки. Выясним причину, по которой параметры вида :Параметр или &Параметр не работают в простом методе Execute. MySQL-драйвер через ADO ожидает либо готовую строку с подставленными значениями, либо использование специального объекта ADODB.Command.

Самый простой (хотя и требующий осторожности с типами данных) способ — динамическое формирование строки. Проанализируем, как правильно передавать даты и строки:


Пока Выборка.Следующий() Цикл
    // Форматируем дату для MySQL (YYYY-MM-DD HH:MM:SS)
    ТекстДаты = Формат(Выборка.Дата, "ДФ=yyyy-MM-dd HH:mm:ss");
    
    // Формируем SQL запрос
    ТекстЗапросаMySQL = "INSERT INTO table_waybill (doc_date, doc_number, car_name) 
                        |VALUES ('" + ТекстДаты + "', '" + Выборка.Номер + "', '" + Выборка.Авто + "')";
    
    Попытка
        Соединение.Execute(ТекстЗапросаMySQL);
    Исключение
        Сообщить("Ошибка при записи строки: " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Важно: При передаче строковых данных обязательно учитывайте наличие кавычек внутри самих строк. Если в наименовании автомобиля будет кавычка, SQL-запрос «сломается». Для надежности используйте функцию замены: СтрЗаменить(Выборка.Авто, "'", "''").

Шаг 5. Фильтрация данных и получение последних записей

Часто возникает задача выгружать не все данные, а только новые или за последний день. Рассмотрим, как эффективно получить срез последних данных в 1С для выгрузки. Для этого в запросе 1С можно использовать соединение с виртуальной таблицей или подзапрос с функцией МАКСИМУМ.


// Пример запроса для получения документов только за последнюю дату в системе
Запрос.Текст = 
    "ВЫБРАТЬ
    |   МАКСИМУМ(ПутевойЛист.Дата) КАК МаксДата
    |ПОМЕСТИТЬ ВТ_Дата
    |ИЗ
    |   Документ.ПутевойЛист КАК ПутевойЛист;
    |
    |ВЫБРАТЬ
    |   Т2.*
    |ИЗ
    |   ВТ_Дата КАК Т1
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПутевойЛист КАК Т2
    |ПО Т1.МаксДата = Т2.Дата";

Шаг 6. Проверка на уникальность

Чтобы избежать дублирования данных в MySQL при повторных запусках выгрузки, можно использовать несколько стратегий. Рассмотрим их подробнее:

  1. Primary Key на стороне MySQL: Создайте в таблице уникальный индекс по полю, которое однозначно идентифицирует документ 1С (например, GUID документа). В этом случае при попытке вставить дубль MySQL вернет ошибку, которую можно проигнорировать.
  2. Использование оператора INSERT IGNORE: Если вы используете MySQL, команда INSERT IGNORE INTO... позволит просто пропускать записи, которые нарушают уникальность ключа, не прерывая выполнение цикла.
  3. Команда REPLACE INTO: Эта команда работает как «удалить старое, вставить новое». Если запись с таким ключом уже существует, она будет перезаписана актуальными данными из 1С.
  4. Проверка через SELECT: Перед вставкой выполнять SELECT COUNT(*) FROM table WHERE id = .... Однако этот метод значительно замедляет работу, так как требует двух обращений к базе на каждую запись.

Шаг 7. Завершение работы

После завершения цикла выгрузки крайне важно корректно закрыть соединение. Это освободит ресурсы на сервере MySQL и предотвратит зависание сессий.


Соединение.Close();
Соединение = Неопределено;
Сообщить("Выгрузка успешно завершена.");

Итоговые рекомендации: для повышения скорости выгрузки больших объемов данных (тысячи строк) рекомендуется использовать транзакции. Выполните команду Соединение.Execute("START TRANSACTION"); перед началом цикла и Соединение.Execute("COMMIT"); после его завершения. Это позволит базе данных MySQL обработать весь пакет данных за один раз, что в десятки раз быстрее одиночных вставок.

← На главную