Обмен данными через XML-файлы — стандартная задача для многих интеграций. Однако при переносе сервера 1С с Windows на Linux системные администраторы и разработчики часто сталкиваются с тем, что привычные методы работы с сетевыми папками или FTP-серверами перестают функционировать "из коробки". В этой статье мы подробно разберем, как правильно настроить среду Linux для бесперебойной работы 1С с внешними данными, проанализируем типичные ошибки и выберем наиболее стабильные методы реализации обмена.
Разберем первопричину большинства проблем: в ОС Linux сервер 1С (процесс rphost) запускается от имени специального системного пользователя, обычно это usr1cv8. Проанализируем ситуацию: если разработчик запускает обработку "на клиенте" под Windows, она работает под его учетной записью. Но как только код выполняется "на сервере" (например, в регламентном задании), 1С пытается обратиться к ресурсам от имени usr1cv8.
Выясним причину, почему 1С-ники часто говорят "FTP или SMB не работает". Чаще всего проблема не в платформе 1С, а в отсутствии прав у пользователя usr1cv8 на чтение/запись в конкретные директории или в неправильной конфигурации сетевых протоколов внутри Linux-окружения. Рассмотрим шаги по исправлению этой ситуации.
Проанализируем самый надежный с точки зрения администрирования способ — представление внешнего ресурса (SMB-шары или FTP) как локальной папки. Рассмотрим процесс монтирования SMB-ресурса. Для этого нам потребуется утилита cifs-utils.
Важно помнить, что 1С на Linux критична к правам доступа на уровне ядра ОС. При монтировании в /etc/fstab необходимо явно указывать владельца. Рассмотрим пример строки конфигурации:
//192.168.1.100/exchange /mnt/1c_exchange cifs user=smbuser,password=smbpass,rw,uid=usr1cv8,gid=grp1cv8,file_mode=0770,dir_mode=0770 0 0
Разберем параметры подробнее: uid и gid должны соответствовать идентификаторам пользователя, под которым работает сервер 1С. Параметры file_mode и dir_mode со значениями 0770 гарантируют, что сервер сможет не только читать, но и удалять обработанные XML-файлы или создавать файлы-флаги. После такого монтирования для 1С-разработчика путь будет выглядеть как обычный локальный путь: /mnt/1c_exchange/data.xml.
Если монтирование в ОС по каким-то причинам невозможно, проанализируем работу через встроенные средства 1С. Объект FTPСоединение в Linux-версии платформы использует библиотеку libcurl. Посмотрим на пример кода, который должен корректно отрабатывать на сервере:
ПараметрыФТП = Новый FTPСоединение("ftp.example.com", 21, "Логин", "Пароль", , Истина);
// Шестой параметр Истина включает ПассивныйРежим
Попытка
ПараметрыФТП.Получить("/remote/file.xml", "/tmp/local_file.xml");
// Далее выполняем чтение файла через ЧтениеXML
Исключение
ЗаписьЖурналаРегистрации("ОбменФайлами", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки());
КонецПопытки;
Обратим внимание на критический момент: в Linux-среде пассивный режим является обязательным в 99% случаев из-за особенностей работы цепочек iptables и nftables. Если 1С-ники утверждают, что "соединение устанавливается, но список файлов не получается", значит, проблема именно в активном режиме FTP, который блокируется фаерволом.
Проанализируем альтернативу, которая становится все более популярной. Если на другой стороне обмена стоит веб-сервер, обмен через HTTPСоединение будет работать стабильнее, чем через FTP или SMB. Рассмотрим преимущества:
Для реализации такого обмена администратору достаточно развернуть на сервере-источнике Nginx или Apache с модулем WebDAV. Для 1С это будет выглядеть как обычный HTTP-запрос. Посмотрим на пример выгрузки:
Соединение = Новый HTTPСоединение("myserver.ru");
Запрос = Новый HTTPЗапрос("/exchange/upload.php");
Запрос.УстановитьТелоИзИмениФайла("/tmp/data_to_send.xml");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Выясним причину еще одной частой ошибки: "Файл не найден", хотя он точно лежит в папке. В Linux файловая система чувствительна к регистру (Case-sensitive). Если в XML-файле прописано имя Data.xml, а на диске лежит data.xml, 1С его не увидит.
Также проанализируем проблему кодировки. Windows-системы часто формируют XML в кодировке Windows-1251. При разборе такого файла на Linux-сервере важно убедиться, что в первой строке XML-файла корректно указан encoding="windows-1251". В противном случае парсер libxml2, используемый в 1С под Linux, выдаст ошибку валидации. Посмотрим, как принудительно прочитать файл с правильной кодировкой:
ЧтениеXML = Новый ЧтениеXML;
ПараметрыЧтения = Новый ПараметрыЧтенияXML(,,, "Windows-1251");
ЧтениеXML.ОткрытьФайл(ПутьКФайлу, ПараметрыЧтения);
Если обмен все равно не работает, а логи 1С не дают конкретики, воспользуемся инструментами Linux. Рассмотрим использование strace для отладки прав доступа. Мы можем "прицепиться" к процессу rphost и увидеть, какой системный вызов возвращает ошибку:
# Находим PID процессов 1С
ps aux | grep rphost
# Следим за системными вызовами открытия файлов
strace -fp [PID] -e trace=open,access,connect
Если мы увидим ошибку EACCES (Permission denied), значит, проблема в правах usr1cv8 на пути к файлу. Если ENOENT (No such file or directory) — проверяем регистр символов в именах папок.
Также проверим состояние SELinux (если используется дистрибутив типа CentOS или RHEL). Часто именно SELinux блокирует сетевые соединения для процессов 1С. Разберем команду для проверки:
sestatus
# Если статус 'enforcing', попробуйте временно перевести в 'permissive' для теста
setenforce 0
Подводя итог, отметим: для Linux-среды наиболее стабильным и "прозрачным" решением является монтирование внешних шар средствами ОС с явным указанием прав пользователя usr1cv8. Это позволяет разработчикам использовать стандартные механизмы ЧтениеXML и ЗаписьXML без необходимости глубокой переработки кода под особенности сетевых протоколов Linux.