При переходе сервера 1С:Предприятие на операционную систему Linux (в частности, Ubuntu) администраторы часто сталкиваются с тем, что серверный код 1С перестает «видеть» привычные сетевые ресурсы Windows. Попытка обратиться к каталогу вида \\extlan\obmen или //extlan/obmen вызывает ошибку о том, что каталог не найден, хотя через графический проводник Ubuntu (под учетной записью администратора) папка успешно открывается.
В этой статье мы подробно разберем, почему возникает эта проблема, как устроена работа с сетевыми ресурсами в ОС Linux, и пошагово настроим стабильное и безопасное монтирование сетевых папок для сервера 1С.
Когда вы открываете сетевую папку через графический интерфейс Ubuntu, операционная система «на лету» монтирует её в виртуальную файловую систему текущего пользователя (обычно через протокол GVFS). Этот ресурс доступен только вашей текущей сессии.
Сервер 1С:Предприятие работает как фоновая служба (демон) от имени специального системного пользователя usr1cv8 (группа grp1cv8). Этот пользователь не имеет графической сессии, не знает о ваших временных подключениях в проводнике и по умолчанию не имеет никаких прав на внешние сетевые ресурсы. Чтобы сервер 1С мог читать и записывать файлы в сетевую папку Windows, эту папку необходимо жестко и постоянно примонтировать на уровне всей операционной системы Linux с явным указанием прав для пользователя usr1cv8.
Разберем весь процесс настройки по шагам.
Для работы с сетевыми ресурсами Windows (протокол SMB/CIFS) в Linux необходим специальный пакет. Установим его через терминал. Выполним команду:
sudo apt-get update
sudo apt-get install cifs-utils
Этот пакет позволит монтировать удаленные сетевые каталоги Windows точно так же, как если бы это были локальные папки на жестком диске вашего сервера.
В Linux все устройства и сетевые ресурсы должны быть «привязаны» к определенной локальной папке. Создадим директорию, через которую сервер 1С будет обращаться к сетевому диску. Обычно для этого используется каталог /mnt или /media. Создадим папку /mnt/obmen:
sudo mkdir -p /mnt/obmen
Пока мы не примонтировали диск, эта папка пуста. После монтирования в ней появится содержимое сетевого ресурса \\extlan\obmen.
Для подключения к Windows-шаре требуются логин и пароль. Указывать их в конфигурационных файлах в открытом виде крайне небезопасно. Создадим скрытый файл, в котором будут храниться только данные авторизации, и ограничим к нему доступ.
Создадим файл в каталоге суперпользователя root:
sudo nano /root/.smbcredentials
Внутри файла напишем следующие строки (замените данные на ваши реальные параметры сети):
username=windows_user_name
password=windows_password
domain=workgroup
Если в вашей сети нет домена Windows, в поле domain укажите имя вашей рабочей группы (по умолчанию WORKGROUP).
Сохраним файл (в редакторе nano для этого нужно нажать Ctrl+O, затем Enter, и для выхода — Ctrl+X).
Теперь защитим этот файл от чтения другими пользователями системы, оставив права только для root:
sudo chmod 600 /root/.smbcredentials
Это самый важный шаг, который часто упускают из виду. Нам нужно узнать идентификаторы (UID и GID) пользователя, под которым запускается сервер 1С. В большинстве дистрибутивов это пользователь usr1cv8.
Выясним числовые ID пользователя и группы, выполнив команду:
id usr1cv8
В выводе команды мы увидим что-то вроде: uid=999(usr1cv8) gid=1001(grp1cv8).... Нам понадобятся именно эти цифры (в вашем случае они могут отличаться, например, 999 или 1005).
Чтобы сетевой диск автоматически подключался при старте сервера Ubuntu, пропишем его в файл конфигурации монтирования `/etc/fstab`.
Откроем файл на редактирование:
sudo nano /etc/fstab
Добавим в самый конец файла одну строку. Обратите внимание, что параметры пишутся без пробелов, через запятую:
//extlan/obmen /mnt/obmen cifs credentials=/root/.smbcredentials,uid=usr1cv8,gid=grp1cv8,file_mode=0770,dir_mode=0770,iocharset=utf8,_netdev,x-systemd.automount 0 0
Проанализируем параметры, которые мы указали в этой строке, чтобы понимать, за что отвечает каждый из них:
/, а не обратные \).uid=999,gid=1001).После сохранения изменений в `/etc/fstab` выполним команду, которая применит настройки без перезагрузки сервера:
sudo systemctl daemon-reload
sudo mount -a
Проверим, успешность операции. Перейдем в каталог и посмотрим список файлов:
ls -la /mnt/obmen
Если вы увидели файлы, находящиеся на сетевом диске \\extlan\obmen, и их владельцем числится usr1cv8 — настройка выполнена идеально!
Если при выполнении команды mount -a вы получаете ошибку подключения (например, Host is down или Mount error(112): Host is down), скорее всего, ваше сетевое хранилище (старый NAS или старая версия Windows) использует устаревшую версию протокола SMBv1 или SMBv2, в то время как современная Ubuntu по умолчанию требует SMBv3.
В этом случае в строку `/etc/fstab` в параметры монтирования нужно явно добавить версию протокола. Например, для поддержки старых хранилищ добавьте параметр vers=1.0 или vers=2.0:
//extlan/obmen /mnt/obmen cifs credentials=/root/.smbcredentials,uid=usr1cv8,gid=grp1cv8,file_mode=0770,dir_mode=0770,iocharset=utf8,vers=1.0,_netdev,x-systemd.automount 0 0
Теперь рассмотрим ситуацию, упомянутую в обсуждении форума: как организовать совместную работу пользователей Windows-клиентов и сервера 1С на Linux?
Windows-клиенты работают с путями в формате UNC (например, \\extlan\obmen\dogovor.pdf). Сервер 1С, запущенный на Linux, этот путь прочесть не сможет, так как для него этот файл физически находится по пути /mnt/obmen/dogovor.pdf.
Для решения этой проблемы в коде конфигурации 1С необходимо реализовать функцию трансляции путей. Рассмотрим пример такой функции, которую можно разместить в общем модуле, выполняющемся на сервере:
Функция ПреобразоватьПутьДляСервера(Знач ИсходныйПуть) Экспорт
// Если код выполняется на клиенте под Windows, возвращаем путь без изменений
#Если Клиент Тогда
Возврат ИсходныйПуть;
#КонецЕсли
// Если код выполняется на сервере Linux
СистемнаяИнфо = Новый СистемнаяИнформация;
Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Linux_x86
Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
// Задаем правила соответствия сетевых ресурсов локальным точкам монтирования
СетевойШаблон = "\\extlan\obmen\";
ТочкаМонтирования = "/mnt/obmen/";
// Приводим слэши к единому виду для поиска совпадений
ИсходныйПуть = СтрЗаменить(ИсходныйПуть, "/", "\");
Если Найти(ВРег(ИсходныйПуть), ВРег(СетевойШаблон)) > 0 Тогда
// Заменяем Windows-путь на путь монтирования Linux
Результат = СтрЗаменить(ВРег(ИсходныйПуть), ВРег(СетевойШаблон), ТочкаМонтирования);
// Меняем оставшиеся обратные слэши на прямые
Результат = СтрЗаменить(Результат, "\", "/");
Возврат Результат;
КонецЕсли;
КонецЕсли;
Возврат ИсходныйПуть;
КонецФункции
При использовании этого подхода пользователи на своих рабочих местах под управлением ОС Windows могут спокойно выбирать файлы через стандартные диалоги выбора файлов 1С, сохраняя пути вида \\extlan\obmen\каталог\файл.xml в базу данных. В момент, когда серверу 1С (работающему под Ubuntu) потребуется прочитать этот файл (например, при регламентном задании обмена), он пропустит путь через функцию ПреобразоватьПутьДляСервера() и корректно обратится к файлу по адресу /mnt/obmen/каталог/файл.xml.
Проанализировав данное решение, мы видим, что перенос сервера 1С на Linux требует изменения подхода к администрированию ресурсов, однако связка системных инструментов монтирования Linux и гибкого кода 1С позволяет настроить бесшовную и стабильную работу пользователей в гетерогенной сети.