При переходе с Windows на Linux многие разработчики 1С сталкиваются с серьезным техническим вызовом: невозможностью использовать привычные технологии COMОбъект для интеграции с внешними базами данных, такими как MySQL или MariaDB. Поскольку на Linux-системах технология COM отсутствует, нам приходится искать альтернативные, кроссплатформенные способы взаимодействия. В этой статье мы подробно разберем несколько проверенных методов записи данных, начиная от простых консольных команд и заканчивая современными архитектурными решениями.
Этот способ является наиболее простым в реализации и не требует глубокой настройки сервера. Его суть заключается в вызове штатной консольной утилиты 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С.
Если требуется постоянная и высокопроизводительная работа с внешней базой, лучшим решением будет использование механизма Внешних источников данных (ВИД) платформы 1С. Однако на Linux это требует предварительной настройки менеджера драйверов unixODBC.
Рассмотрим последовательность действий для настройки связки 1С + MySQL на Linux:
MariaDB Connector/ODBC, так как он более стабилен в среде Linux и полностью совместим с протоколом MySQL./etc/odbcinst.ini (описание драйвера) и /etc/odbc.ini (описание конкретного подключения 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С.
Проанализируем ситуацию, когда прямые методы не подходят из-за сложностей с драйверами. На большинстве Linux-серверов предустановлен Python. Мы можем написать небольшой скрипт-прослойку, который будет получать данные от 1С (например, в формате JSON) и записывать их в базу через нативную библиотеку mysql-connector-python.
Реализация:
data.json.ЗапуститьПриложение("python3 myscript.py data.json").Этот метод хорош тем, что Python-драйверы не зависят от системных ODBC-менеджеров и работают чрезвычайно стабильно.
Рассмотрим наиболее современный и архитектурно правильный подход. Вместо того чтобы давать серверу 1С прямой доступ к базе данных MySQL, мы создаем промежуточный микросервис (на PHP, Python или Go). 1С взаимодействует с этим сервисом по протоколу HTTP.
Преимущества этого метода:
HTTPСоединение, который работает одинаково и на Windows, и на Linux.Пример кода в 1С для отправки данных:
Соединение = Новый HTTPСоединение("api.myserver.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/record_data");
Запрос.УстановитьТелоИзСтроки(ДанныеВФорматеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Ошибка интеграции", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Разберем важный момент, о котором часто забывают. Сервер 1С (процесс rphost) в Linux обычно запускается от имени системного пользователя usr1cv8. Посмотрим, какие права ему необходимы:
/usr/bin/mysql./etc/odbc.ini и /etc/odbcinst.ini.usr1cv8.Подведем итог: Для разовых и простых задач записи данных отлично подойдет использование КомандаСистемы с передачей SQL-файла. Если же планируется интенсивный обмен данными, стоит потратить время на настройку unixODBC для внешних источников данных или реализовать обмен через HTTPСоединение, что обеспечит максимальную надежность и кроссплатформенность вашего решения.