Как записать данные из 1С в базу MySQL на сервере Linux без использования COM-соединения

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

При переходе с Windows на Linux многие разработчики 1С сталкиваются с серьезным техническим вызовом: невозможностью использовать привычные технологии COMОбъект для интеграции с внешними базами данных, такими как MySQL или MariaDB. Поскольку на Linux-системах технология COM отсутствует, нам приходится искать альтернативные, кроссплатформенные способы взаимодействия. В этой статье мы подробно разберем несколько проверенных методов записи данных, начиная от простых консольных команд и заканчивая современными архитектурными решениями.

Метод 1: Использование системных команд и CLI-клиента MySQL

Этот способ является наиболее простым в реализации и не требует глубокой настройки сервера. Его суть заключается в вызове штатной консольной утилиты mysql через встроенную функцию 1С КомандаСистемы или ЗапуститьПриложение. Разберем этот процесс по шагам.

Для начала нам необходимо подготовить текстовый файл, содержащий SQL-запросы, которые мы хотим выполнить. Это безопаснее и надежнее, чем пытаться передать длинный и сложный запрос напрямую в строке команды, где могут возникнуть проблемы с экранированием кавычек.

Шаг 1: Формирование файла запроса

Рассмотрим пример формирования запроса INSERT. В коде 1С мы создаем объект ТекстовыйДокумент и записываем в него нужные нам команды.


ТекстЗапроса = "INSERT INTO `test_table` (region, fio, date_created) VALUES ('" + Регион + "', '" + ФИО + "', NOW());";
ФайлКоманд = ПолучитьИмяВременногоФайла("sql");

ЗаписьТекста = Новый ЗаписьТекста(ФайлКоманд, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку(ТекстЗапроса);
ЗаписьТекста.Закрыть();

Шаг 2: Выполнение команды в ОС

После того как файл создан, мы вызываем клиент mysql, передавая ему этот файл в качестве входных данных. Проанализируем структуру команды:


// Формируем строку запуска
// -u: пользователь, -h: адрес сервера, -p: пароль, имя_базы
ПутьККлиенту = "/usr/bin/mysql"; // Путь может отличаться в зависимости от дистрибутива
СтрокаЗапуска = СтрШаблон("%1 -u %2 -h %3 -p'%4' %5 < %6", 
    ПутьККлиенту, "db_user", "127.0.0.1", "strong_password", "my_database", ФайлКоманд);

// Выполняем команду
ЗапуститьПриложение(СтрокаЗапуска, , Истина); 

// Не забываем удалить временный файл
УдалитьФайлы(ФайлКоманд);

Важное замечание по безопасности: Передача пароля непосредственно в строке запуска (-p'password') в Linux считается небезопасной, так как пароль может быть виден в списке активных процессов. Для более защищенного соединения рекомендуется использовать файл конфигурации .my.cnf в домашнем каталоге пользователя usr1cv8, под которым работает сервер 1С.

Метод 2: Внешние источники данных и unixODBC

Если требуется постоянная и высокопроизводительная работа с внешней базой, лучшим решением будет использование механизма Внешних источников данных (ВИД) платформы 1С. Однако на Linux это требует предварительной настройки менеджера драйверов unixODBC.

Рассмотрим последовательность действий для настройки связки 1С + MySQL на Linux:

  1. Установка драйвера: Рекомендуется использовать MariaDB Connector/ODBC, так как он более стабилен в среде Linux и полностью совместим с протоколом MySQL.
  2. Настройка конфигов: Нам необходимо отредактировать файлы /etc/odbcinst.ini (описание драйвера) и /etc/odbc.ini (описание конкретного подключения DSN).
  3. Кодировки: Это критический момент. Чтобы избежать ошибок при записи кириллицы, в настройках DSN обязательно укажите параметр Charset=utf8mb4.

Пример настройки /etc/odbc.ini:


[MySQL_DSN]
Description = Connection to MySQL
Driver      = MariaDB
Server      = localhost
User        = root
Password    = your_password
Database    = test_db
Port        = 3306
Charset     = utf8mb4

После настройки в 1С можно будет работать с таблицами MySQL почти так же, как с обычными справочниками или документами, используя объект ВнешниеИсточникиДанных. Выясним причину возможных ошибок: если платформа выдает ошибку при записи, убедитесь, что разрядность установленного драйвера (64-bit) совпадает с разрядностью сервера 1С.

Метод 3: Использование Python как промежуточного слоя

Проанализируем ситуацию, когда прямые методы не подходят из-за сложностей с драйверами. На большинстве Linux-серверов предустановлен Python. Мы можем написать небольшой скрипт-прослойку, который будет получать данные от 1С (например, в формате JSON) и записывать их в базу через нативную библиотеку mysql-connector-python.

Реализация:

  1. 1С выгружает данные в data.json.
  2. 1С вызывает команду: ЗапуститьПриложение("python3 myscript.py data.json").
  3. Скрипт Python читает файл и выполняет транзакцию в MySQL.

Этот метод хорош тем, что Python-драйверы не зависят от системных ODBC-менеджеров и работают чрезвычайно стабильно.

Метод 4: HTTP-сервисы и REST API

Рассмотрим наиболее современный и архитектурно правильный подход. Вместо того чтобы давать серверу 1С прямой доступ к базе данных MySQL, мы создаем промежуточный микросервис (на PHP, Python или Go). 1С взаимодействует с этим сервисом по протоколу HTTP.

Преимущества этого метода:

Пример кода в 1С для отправки данных:


Соединение = Новый HTTPСоединение("api.myserver.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/record_data");
Запрос.УстановитьТелоИзСтроки(ДанныеВФорматеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
    ЗаписьЖурналаРегистрации("Ошибка интеграции", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Нюансы прав доступа в Linux

Разберем важный момент, о котором часто забывают. Сервер 1С (процесс rphost) в Linux обычно запускается от имени системного пользователя usr1cv8. Посмотрим, какие права ему необходимы:

  1. Права на файлы: У пользователя должен быть доступ на чтение и выполнение бинарника /usr/bin/mysql.
  2. Права на чтение конфигов: Доступ к /etc/odbc.ini и /etc/odbcinst.ini.
  3. Сетевой доступ: Если MySQL находится на другом сервере, убедитесь, что брандмауэр (iptables/nftables) разрешает исходящие соединения для процесса 1С.
  4. Временные файлы: Если вы используете Метод 1, убедитесь, что папка для временных файлов доступна для записи пользователю usr1cv8.

Подведем итог: Для разовых и простых задач записи данных отлично подойдет использование КомандаСистемы с передачей SQL-файла. Если же планируется интенсивный обмен данными, стоит потратить время на настройку unixODBC для внешних источников данных или реализовать обмен через HTTPСоединение, что обеспечит максимальную надежность и кроссплатформенность вашего решения.

← На главную