При переходе с операционной системы Windows на Linux разработчики 1С часто сталкиваются с тем, что привычные механизмы работы с сетевыми ресурсами перестают функционировать. Одной из наиболее распространенных задач является открытие файла (например, PDF-инструкции или скан-копии счета), который хранится в сетевой папке. В Windows для этого достаточно вызвать команду ЗапуститьПриложение с указанием пути в формате UNC. Однако в среде Linux концепция сетевых путей реализована иначе. Разберем подробно, почему возникают сложности и как реализовать эту задачу эффективно.
В Windows оболочка explorer.exe умеет «на лету» обрабатывать пути вида \\server\folder\file.pdf. Она сама инициирует подключение по протоколу SMB и передает файл нужному приложению. В Linux команда xdg-open, которая обычно вызывается методом ЗапуститьПриложение, является лишь посредником. Она пытается передать строку приложению, которое ассоциировано с расширением файла. Большинство просмотровщиков PDF в Linux не поддерживают протокол smb:// напрямую, если они не интегрированы с виртуальной файловой системой рабочего стола. В таких случаях выручает Работа с PDF файлами в 1С без внешних компонентов.
Проанализируем основные способы решения этой задачи, начиная от наиболее надежных и заканчивая программными методами обхода ограничений.
Это самый надежный и прозрачный для 1С способ. Если мы примонтируем сетевую папку в дерево каталогов Linux, система будет воспринимать файлы в ней как локальные. Рассмотрим, как это сделать.
/mnt/win_share./etc/fstab пропишем строку для подключения ресурса через протокол CIFS:
//server/folder /mnt/win_share cifs user=domain_user,pass=password,dom=DOMAIN,iocharset=utf8 0 0
ПутьКФайлу = "/mnt/win_share/file.pdf";
ЗапуститьПриложение(ПутьКФайлу);
Преимущество: С точки зрения 1С, нет никакой разницы между файлом на диске и файлом в сети. Все стандартные методы (Файл.Существует(), КопироватьФайл()) будут работать корректно.
Если в вашей системе используется графическая оболочка (Gnome, XFCE, Cinnamon), сетевые папки часто монтируются автоматически средствами пользователя. Выясним, как найти путь к такому файлу.
Когда пользователь заходит на сетевой ресурс через файловый менеджер, система создает «прослойку» в специальной директории run/user/. Путь в 1С будет выглядеть следующим образом:
ID_Пользователя = "1000"; // Можно получить через скрипт или системные переменные
ПутьКФайлу = "/run/user/" + ID_Пользователя + "/gvfs/smb-share:server=server,share=folder/file.pdf";
ЗапуститьПриложение(ПутьКФайлу);
Однако этот способ менее стабилен, так как монтирование происходит только после того, как пользователь вручную откроет сетевую папку в интерфейсе ОС.
В современных дистрибутивах Linux на замену xdg-open пришла более мощная утилита gio. Она умеет самостоятельно обрабатывать URI-адреса, включая smb://. Посмотрим на пример кода:
КомандаЗапуска = "gio open smb://server/folder/file.pdf";
ЗапуститьПриложение(КомандаЗапуска);
Важный момент: чтобы это сработало, в системе должны быть установлены пакеты поддержки GVFS и SMB-клиент. Если gio настроен правильно, он сам запросит пароль у пользователя (или использует сохраненный в «Связке ключей») и откроет файл в ассоциированном приложении.
Если прямой доступ настроить не удается (например, из-за сложных правил безопасности или отсутствия прав на монтирование), разберем программный метод обхода. Мы можем сначала скопировать файл из сети на локальный диск компьютера, а затем открыть его.
Для копирования из SMB-ресурса в Linux удобно использовать утилиту smbclient. Рассмотрим пример функции:
// Пример на клиенте
ПутьЛокальный = КаталогВременныхФайлов() + "temp_file.pdf";
Команда = "smbclient ""//server/share"" -c ""get folder/file.pdf " + ПутьЛокальный + """ -U user%password";
ЗапуститьПриложение(Команда,, Истина); // Ждем завершения копирования
Если ЭтоФайл(ПутьЛокальный) Тогда
ЗапуститьПриложение(ПутьЛокальный);
КонецЕсли;
Внимание: При использовании smbclient часто возникает ошибка с кодом возврата 1. Это может быть связано с тем, что программа ожидает интерактивного ввода или подтверждения. Всегда указывайте полные пути к утилитам (например, /usr/bin/smbclient) и проверяйте права пользователя, под которым запущен процесс 1С.
Проанализируем ситуацию, описанную в сообщениях форума, где команда успешно выполняется в терминале, но не работает из 1С. Здесь критически важно понимать, где выполняется код.
ЗапуститьПриложение для открытия файлов.usr1cv8 (или аналогичного). У этого пользователя обычно нет прав на доступ к сетевым ресурсам домена, нет графической оболочки и нет доступа к билетам Kerberos текущего пользователя.Если вы пытаетесь открыть сетевой файл, нажав кнопку в форме, убедитесь, что процедура имеет директиву &НаКлиенте. Попытка вызвать ЗапуститьПриложение на сервере под Linux для открытия графического окна (например, Adobe Acrobat) гарантированно завершится ошибкой, так как у серверного процесса нет связи с X-сервером (дисплеем пользователя).
Если ваша сеть построена на Active Directory, важно, чтобы Linux-клиент правильно идентифицировал пользователя. Если 1С запрашивает логин/пароль при входе, хотя в Windows настроена автоматическая аутентификация, это верный признак проблем с Kerberos. Для исправления ситуации проанализируем следующие шаги:
/etc/krb5.conf и корректность указания Realims (домена). Домен всегда пишется ЗАГЛАВНЫМИ буквами.libgssapi-krb5-2.user@DOMAIN.RU.Соблюдение этих правил позволит 1С и операционной системе использовать единый «билет» доступа, что значительно упростит работу с сетевыми файлами по протоколу SMB без постоянного ввода паролей.