При работе в клиент-серверном режиме 1С:Предприятие разработчики часто сталкиваются с задачей: файл физически находится на сервере (в папке или базе), но пользователю нужно открыть его в привычном приложении (Excel, Word, просмотрщик PDF) на его локальном компьютере. Давайте детально разберем, как правильно организовать этот процесс, какие существуют подводные камни с правами доступа и какие методы считаются наиболее современными и безопасными.
Прежде всего, проанализируем ситуацию с методом ЗапуститьПриложение. Важно понимать, что если мы вызываем этот метод в процедуре с директивой компиляции &НаКлиенте, то приложение будет запущено в операционной системе пользователя. Если же вызвать его в серверном контексте (что технически возможно, но бессмысленно для визуального отображения), программа попытается запуститься в сессии системной учетной записи на сервере, и пользователь ничего не увидит.
Главное правило: запуск внешних приложений для взаимодействия с пользователем всегда должен происходить на стороне клиента. Однако для этого клиентское приложение должно "увидеть" файл, который изначально лежит на сервере.
Это классический метод, который обсуждался участниками форума. Суть заключается в том, что папка на сервере "расшаривается" (предоставляется общий доступ), и файл открывается по сетевому адресу вида \\ServerName\SharedFolder\file.xlsx.
Разберем по шагам, что для этого требуется:
Пример кода на клиенте:
&НаКлиенте
Процедура ОткрытьФайлПоСетевомуПути(ПутьКФайлу)
// ПутьКФайлу должен быть вида "\\Server\Data\report.pdf"
ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры
Важное ограничение: Если ваша база работает через интернет (тонкий клиент через HTTP или веб-клиент в браузере), этот способ работать не будет, так как браузер не имеет прямого доступа к локальной сети предприятия по протоколу SMB.
Проанализируем более современный и универсальный подход. Он заключается в том, чтобы "перекачать" двоичные данные файла с сервера на клиент, сохранить их во временную папку пользователя и затем открыть. Это избавляет нас от необходимости настраивать сложные права на сетевые папки.
Рассмотрим алгоритм реализации:
1. На сервере: Считываем файл в объект ДвоичныеДанные и помещаем во временное хранилище.
&НаСервере
Функция ПодготовитьФайлКПередаче(ПолныйПутьНаСервере)
ДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьНаСервере);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, Новый УникальныйИдентификатор);
Возврат АдресХранилища;
КонецФункции
2. На клиенте: Получаем данные из хранилища, сохраняем в локальный временный каталог и открываем.
&НаКлиенте
Процедура ПрочитатьИОткрытьФайл()
// Получаем адрес данных на сервере
Адрес = ПодготовитьФайлКПередаче("C:\Files\ServerData.docx");
// Определяем, куда сохранить файл на локальном диске
ИмяФайла = "ЛокальнаяКопия.docx";
ПутьНаКлиенте = ОбщегоНазначенияКлиентСервер.КомбинированныйПуть(КаталогВременныхФайлов(), ИмяФайла);
// Передаем файл с сервера на клиент
Данные = ПолучитьИзВременногоХранилища(Адрес);
Данные.Записать(ПутьНаКлиенте);
// Запускаем приложение
ЗапуститьПриложение(ПутьНаКлиенте);
КонецПроцедуры
Этот метод работает везде: и в локальной сети, и через интернет. Файл открывается из локальной папки КаталогВременныхФайлов(), что гарантирует отсутствие конфликтов доступа, если несколько пользователей захотят открыть один и тот же отчет одновременно.
Если в вашей конфигурации используется БСП, то работу с файлами лучше доверить встроенным механизмам. Программный интерфейс модуля ФайловаяСистемаКлиент берет на себя все проверки безопасности и кроссплатформенность.
Проанализируем пример использования метода ОткрытьФайл():
&НаКлиенте
Процедура ОткрытьЧерезБСП(ПутьКФайлу)
ПараметрыОткрытия = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
ПараметрыОткрытия.ЗапомнитьВыбранноеПриложение = Истина;
ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ПараметрыОткрытия);
КонецПроцедуры
Преимущество БСП в том, что она автоматически обрабатывает ситуации, когда для расширения файла не назначена программа по умолчанию, и предлагает пользователю выбор.
Выясним причину частой ошибки "Файл не найден" при попытке прочитать файл с сервера.
Когда мы используем серверный код (например, Новый ДвоичныеДанные(Путь)), обращение к файловой системе идет от имени учетной записи, под которой запущен сервис 1С:Предприятия (обычно это USR1CV8).
Важно: Даже если вы, как пользователь, видите файл в проводнике на сервере, служба 1С может не иметь прав на чтение этой папки. Убедитесь, что в настройках безопасности Windows для папки с файлами добавлены права "Чтение" для пользователя USR1CV8 или соответствующей доменной учетной записи службы.
Как справедливо заметили в обсуждении на форуме, если открывать файл напрямую по сетевому пути, возникают блокировки. Рассмотрим ситуацию: пользователь А открыл Excel-таблицу. В этот момент операционная система ставит "замок" на файл. Если пользователь Б попытается открыть тот же файл, Excel выдаст предупреждение о том, что файл занят, и предложит открыть его в режиме "Только чтение".
Для решения этой проблемы мы рекомендуем всегда использовать схему с копированием файла во временный каталог (Способ 2). В этом случае каждый пользователь работает со своей локальной копией, и конфликтов на уровне файловой системы не возникает.
Если ваши пользователи работают через браузер, следует помнить о жестких политиках безопасности. Метод ЗапуститьПриложение в браузере может быть заблокирован или требовать установки специального расширения для работы с файловой системой. Наиболее надежный путь для веб-клиента — это использование метода ПолучитьФайл, который инициирует стандартную процедуру скачивания файла браузером, после чего пользователь сам открывает его из панели загрузок.
Подведем итог: выбор метода зависит от вашей инфраструктуры. Для простых задач внутри локальной сети подойдут UNC-пути, но для надежных и масштабируемых решений всегда лучше использовать передачу через двоичные данные и временное хранилище.