Как открыть файл, хранящийся на сервере, на стороне клиента в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в клиент-серверном режиме 1С:Предприятие разработчики часто сталкиваются с задачей: файл физически находится на сервере (в папке или базе), но пользователю нужно открыть его в привычном приложении (Excel, Word, просмотрщик PDF) на его локальном компьютере. Давайте детально разберем, как правильно организовать этот процесс, какие существуют подводные камни с правами доступа и какие методы считаются наиболее современными и безопасными.

Понимание архитектуры: где выполняется код?

Прежде всего, проанализируем ситуацию с методом ЗапуститьПриложение. Важно понимать, что если мы вызываем этот метод в процедуре с директивой компиляции &НаКлиенте, то приложение будет запущено в операционной системе пользователя. Если же вызвать его в серверном контексте (что технически возможно, но бессмысленно для визуального отображения), программа попытается запуститься в сессии системной учетной записи на сервере, и пользователь ничего не увидит.

Главное правило: запуск внешних приложений для взаимодействия с пользователем всегда должен происходить на стороне клиента. Однако для этого клиентское приложение должно "увидеть" файл, который изначально лежит на сервере.

Способ 1. Использование общих сетевых ресурсов (UNC-пути)

Это классический метод, который обсуждался участниками форума. Суть заключается в том, что папка на сервере "расшаривается" (предоставляется общий доступ), и файл открывается по сетевому адресу вида \\ServerName\SharedFolder\file.xlsx.

Разберем по шагам, что для этого требуется:

  1. Настройка сервера: Папка, в которой хранятся файлы, должна быть доступна по сети.
  2. Права доступа: Это самый критичный момент. Нужно разграничивать права. Для чтения файла на клиенте доступ к сетевой папке должен быть у учетной записи Windows того пользователя, который сидит за компьютером.
  3. Код в 1С: На стороне клиента мы просто вызываем запуск.

Пример кода на клиенте:


&НаКлиенте
Процедура ОткрытьФайлПоСетевомуПути(ПутьКФайлу)
    // ПутьКФайлу должен быть вида "\\Server\Data\report.pdf"
    ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры

Важное ограничение: Если ваша база работает через интернет (тонкий клиент через HTTP или веб-клиент в браузере), этот способ работать не будет, так как браузер не имеет прямого доступа к локальной сети предприятия по протоколу SMB.

Способ 2. Использование Временного хранилища (Рекомендуемый метод)

Проанализируем более современный и универсальный подход. Он заключается в том, чтобы "перекачать" двоичные данные файла с сервера на клиент, сохранить их во временную папку пользователя и затем открыть. Это избавляет нас от необходимости настраивать сложные права на сетевые папки.

Рассмотрим алгоритм реализации:

1. На сервере: Считываем файл в объект ДвоичныеДанные и помещаем во временное хранилище.


&НаСервере
Функция ПодготовитьФайлКПередаче(ПолныйПутьНаСервере)
    ДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьНаСервере);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, Новый УникальныйИдентификатор);
    Возврат АдресХранилища;
КонецФункции

2. На клиенте: Получаем данные из хранилища, сохраняем в локальный временный каталог и открываем.


&НаКлиенте
Процедура ПрочитатьИОткрытьФайл()
    // Получаем адрес данных на сервере
    Адрес = ПодготовитьФайлКПередаче("C:\Files\ServerData.docx");
    
    // Определяем, куда сохранить файл на локальном диске
    ИмяФайла = "ЛокальнаяКопия.docx";
    ПутьНаКлиенте = ОбщегоНазначенияКлиентСервер.КомбинированныйПуть(КаталогВременныхФайлов(), ИмяФайла);
    
    // Передаем файл с сервера на клиент
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    Данные.Записать(ПутьНаКлиенте);
    
    // Запускаем приложение
    ЗапуститьПриложение(ПутьНаКлиенте);
КонецПроцедуры

Этот метод работает везде: и в локальной сети, и через интернет. Файл открывается из локальной папки КаталогВременныхФайлов(), что гарантирует отсутствие конфликтов доступа, если несколько пользователей захотят открыть один и тот же отчет одновременно.

Способ 3. Использование Библиотеки стандартных подсистем (БСП)

Если в вашей конфигурации используется БСП, то работу с файлами лучше доверить встроенным механизмам. Программный интерфейс модуля ФайловаяСистемаКлиент берет на себя все проверки безопасности и кроссплатформенность.

Проанализируем пример использования метода ОткрытьФайл():


&НаКлиенте
Процедура ОткрытьЧерезБСП(ПутьКФайлу)
    ПараметрыОткрытия = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
    ПараметрыОткрытия.ЗапомнитьВыбранноеПриложение = Истина;
    ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ПараметрыОткрытия);
КонецПроцедуры

Преимущество БСП в том, что она автоматически обрабатывает ситуации, когда для расширения файла не назначена программа по умолчанию, и предлагает пользователю выбор.

Разграничение прав доступа: "Ловушка USR1CV8"

Выясним причину частой ошибки "Файл не найден" при попытке прочитать файл с сервера. Когда мы используем серверный код (например, Новый ДвоичныеДанные(Путь)), обращение к файловой системе идет от имени учетной записи, под которой запущен сервис 1С:Предприятия (обычно это USR1CV8).

Важно: Даже если вы, как пользователь, видите файл в проводнике на сервере, служба 1С может не иметь прав на чтение этой папки. Убедитесь, что в настройках безопасности Windows для папки с файлами добавлены права "Чтение" для пользователя USR1CV8 или соответствующей доменной учетной записи службы.

Проблема одновременного доступа

Как справедливо заметили в обсуждении на форуме, если открывать файл напрямую по сетевому пути, возникают блокировки. Рассмотрим ситуацию: пользователь А открыл Excel-таблицу. В этот момент операционная система ставит "замок" на файл. Если пользователь Б попытается открыть тот же файл, Excel выдаст предупреждение о том, что файл занят, и предложит открыть его в режиме "Только чтение".

Для решения этой проблемы мы рекомендуем всегда использовать схему с копированием файла во временный каталог (Способ 2). В этом случае каждый пользователь работает со своей локальной копией, и конфликтов на уровне файловой системы не возникает.

Особенности Веб-клиента

Если ваши пользователи работают через браузер, следует помнить о жестких политиках безопасности. Метод ЗапуститьПриложение в браузере может быть заблокирован или требовать установки специального расширения для работы с файловой системой. Наиболее надежный путь для веб-клиента — это использование метода ПолучитьФайл, который инициирует стандартную процедуру скачивания файла браузером, после чего пользователь сам открывает его из панели загрузок.

Подведем итог: выбор метода зависит от вашей инфраструктуры. Для простых задач внутри локальной сети подойдут UNC-пути, но для надежных и масштабируемых решений всегда лучше использовать передачу через двоичные данные и временное хранилище.

← На главную