При эксплуатации серверной части 1С на операционных системах семейства Linux (в частности, CentOS) системные администраторы часто сталкиваются с трудностями при организации обмена данными. Основные проблемы возникают в двух плоскостях: во-первых, это разница в обработке путей к файлам (UNC-пути против локальных точек монтирования), и во-вторых — жесткое разграничение прав доступа в Linux, которое мешает пользователям Windows просматривать и редактировать созданные сервером файлы.
В этой статье мы подробно разберем, почему фоновые задания 1С ведут себя иначе, чем клиентские сессии, и как правильно настроить сервер Samba для беспрепятственного обмена данными.
Разберем типичную ситуацию: когда программист запускает обработку вручную через тонкий или толстый клиент на Windows, 1С обращается к ресурсу по пути вида \\centos1c\exchange1c. В этом случае работа с файловой системой идет от лица клиентского приложения. Однако, когда та же самая обработка запускается как фоновое задание, она выполняется непосредственно процессом сервера 1С на стороне Linux.
Проанализируем причину, по которой фоновое задание не «видит» сетевой путь. Сервер 1С, работающий под управлением Linux, не умеет нативно резолвить Windows-пути формата UNC (через обратные слеши). Для операционной системы Linux любая сетевая папка должна быть представлена как часть локального дерева каталогов. Поэтому, если в коде 1С прописан путь \\server\share, фоновое задание на Linux-сервере выдаст ошибку доступа или сообщит, что каталог не найден.
Решение: Для корректной работы фоновых заданий необходимо использовать абсолютный путь в файловой системе Linux, например, /mnt/exchange1c. Если же данные должны физически располагаться на другом Windows-сервере, эту шару нужно предварительно примонтировать в CentOS с помощью команды mount -t cifs, чтобы для сервера 1С она выглядела как локальная папка.
Когда сервер 1С создает файл в каталоге обмена, он делает это от имени пользователя usr1cv82 (или usr1cv8 в более новых версиях). По умолчанию в Linux устанавливается маска прав 640 или 660, что означает: владелец и группа могут читать/писать, а все остальные — нет. При просмотре этой папки через Samba с компьютера на Windows пользователи часто сталкиваются с тем, что они видят файлы, но не могут их открыть или удалить.
Рассмотрим самый быстрый и эффективный способ решения этой проблемы через настройки Samba. Вместо того чтобы пытаться изменить системный umask для сервиса 1С (что не всегда помогает), мы можем заставить Samba игнорировать реального владельца файла при обращении через сеть.
Для этого отредактируем файл /etc/samba/smb.conf и добавим параметры force user и force group. Это позволит всем операциям, инициированным через данную сетевую шару, выполняться от имени указанного пользователя (например, root или специально созданного администратора обмена).
Пример настройки секции в smb.conf:
[exchange1c]
path = /mnt/exchange1c
browsable = yes
writable = yes
guest ok = yes
read only = no
force user = root
force group = root
Проанализируем, что дают эти настройки. Параметры force user = root и force group = root гарантируют, что любой файл, созданный или измененный через эту шару пользователем Windows, будет принадлежать root. И наоборот: даже если сервер 1С создал файл с ограниченными правами, Samba «подменит» контекст доступа, позволяя пользователям Windows работать с файлом без ошибок.
Важное примечание по безопасности: Использование root в качестве force user является крайней мерой и потенциальной «дырой» в безопасности. В промышленной эксплуатации рекомендуется создать отдельного системного пользователя и включить его в ту же группу, в которой состоит usr1cv8.
Если вы не хотите использовать «принудительного пользователя» в Samba, можно воспользоваться механизмом расширенных прав доступа в Linux. Это позволит автоматически назначать нужные права любому новому файлу, который создает сервер 1С в папке обмена.
Разберем шаги по настройке ACL:
Выполним следующую команду в консоли сервера:
setfacl -d -m g:grp1cv82:rwx /mnt/exchange1c
setfacl -d -m o::rwx /mnt/exchange1c
Здесь флаг -d (default) означает, что указанные права будут автоматически наследоваться всеми подпапками и файлами, которые появятся в /mnt/exchange1c в будущем. Это элегантный способ решить проблему прав 640/660 без изменения настроек самого сервера 1С.
Выясним еще одну причину возникновения проблемы: стандартный umask процесса. В CentOS 6, где используется классическая система инициализации (init-скрипты), настройки профиля пользователя .bash_profile часто игнорируются, так как служба 1С запускается не интерактивно.
Для корректной установки прав на создаваемые файлы рассмотрим редактирование скрипта запуска службы /etc/init.d/srv1cv8. В начало скрипта (после строки заголовка) можно добавить команду umask 000. Это заставит сервер 1С создавать файлы с правами 666 (доступно всем на чтение и запись).
Если же вы используете более современную версию ОС с systemd, настройка выполняется в unit-файле службы (обычно /lib/systemd/system/srv1cv83.service) добавлением строки:
[Service]
UMask=0000
В некоторых случаях использование Samba для обмена между базами 1С может быть избыточным или нестабильным (например, из-за сетевых блокировок oplocks). Рассмотрим альтернативный подход, который упоминался в обсуждении.
Посмотрим на преимущества использования Web-сервисов или HTTP-сервисов. Вместо того чтобы «выбрасывать» файл в общую папку и ждать, пока другая база его подберет, можно настроить прямую передачу данных. Одна база (на Linux) вызывает метод Web-сервиса другой базы (на Windows) и передает данные в виде двоичного потока (объект ДвоичныеДанные). В этом случае вопрос о правах доступа к файловой системе ОС Linux вообще снимается, так как обмен идет на уровне протокола HTTP.
Если же необходимо использовать именно FTP, убедитесь, что в коде 1С используется объект СоединениеFTP. При работе через FTP-клиент 1С права на файлы в локальной папке сервера также важны, но они регулируются настройками самого FTP-сервера (например, vsftpd), где также есть свои параметры local_umask.
Для успешной организации обмена данными в связке Linux-Windows придерживайтесь следующих правил:
/home/1c/exchange) в коде 1С, предназначенном для фоновых заданий на Linux.force user и force group, чтобы избежать конфликтов прав.smb.conf, добавив oplocks = no и locking = no в секцию шары.