К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как открыть файл на клиенте в 1С

Как открыть файл на клиенте в 1С: НачатьЗапускПриложения, ФайловаяСистемаКлиент, ОткрытьЗначение. Примеры кода для тонкого и веб-клиента, типовые ошибки.

Задача открыть файл на стороне клиента возникает в 1С постоянно: показать пользователю сохранённую печатную форму, запустить внешнюю программу, открыть PDF-договор или картинку из справочника. Главная сложность в том, что код общего модуля или сервера не имеет доступа к диску пользователя, а методы, работавшие в толстом клиенте, в тонком и веб-клиенте ведут себя иначе.

В управляемом приложении платформа предлагает несколько способов: асинхронные методы объекта ФайловаяСистемаКлиент, универсальное НачатьЗапускПриложения, передачу файла через временное хранилище с последующим открытием, а для простых случаев — ПоказатьЗначение и ПолучитьФайл. Выбор зависит от того, где лежит файл (на сервере, на клиенте, в базе), какой клиент используется и нужно ли дождаться завершения операции.

Ниже разобраны рабочие сценарии с примерами кода, ограничения тонкого и веб-клиента, типовые ошибки и способы проверить, что файл действительно открылся у пользователя.

Где лежит файл: определяем сценарий

Прежде чем писать код, ответьте на три вопроса. Первый: файл уже есть на диске клиентского компьютера или он хранится на сервере / в информационной базе. Второй: какой клиент используется — толстый, тонкий или веб. Третий: нужно ли программе дождаться результата открытия или достаточно «запустить и забыть».

От ответов зависит вся конструкция. Локальный файл открывается одной строкой. Файл из базы требует цепочки: серверная процедура кладёт двоичные данные во временное хранилище, клиент получает файл во временный каталог и только потом открывает его. В веб-клиенте добавляется ограничение: без расширения работы с файлами многие операции недоступны, и его нужно предложить установить.

Файл на диске пользователяПростой сценарий

Достаточно ФайловаяСистемаКлиент.ОткрытьФайл или НачатьЗапускПриложения

Файл в базе или на сервереЦепочка из 2–3 шагов

Нужны ПоместитьВоВременноеХранилище и НачатьПолучениеФайлаССервера

Веб-клиентЕсть ограничения

Проверяйте подключение расширения работы с файлами

Нужен результат операцииАсинхронный вызов

Используйте описание оповещения, синхронные методы недоступны

Открываем локальный файл через НачатьЗапускПриложения

Универсальный способ, работающий во всех клиентах, — метод НачатьЗапускПриложения. Он запускает файл ассоциированным приложением операционной системы: PDF — в просмотрщике, xlsx — в Excel, картинку — в графическом редакторе по умолчанию.

&НаКлиенте

Процедура ОткрытьФайлНажатие(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеЗапускаПриложения", ЭтотОбъект);

НачатьЗапускПриложения(Оповещение, "C:\Документы\Договор.pdf");

КонецПроцедуры

&НаКлиенте

Процедура ПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт

Если КодВозврата <> 0 Тогда

ПоказатьПредупреждение(, "Не удалось открыть файл. Код возврата: " + КодВозврата);

КонецЕсли;

КонецПроцедуры

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

Если путь к файлу содержит пробелы, оборачивать его в кавычки внутри строки обычно не требуется — платформа передаёт путь корректно. А вот при передаче дополнительных параметров командной строки третьим параметром метода кавычки вокруг путей уже обязательны.

Современный способ: ФайловаяСистемаКлиент

Начиная с версии платформы 8.3.22 доступен объект ФайловаяСистемаКлиент с набором асинхронных методов, специально предназначенных для файловых операций на клиенте. Для открытия файла используется ФайловаяСистемаКлиент.ОткрытьФайл() — он делает то же, что и НачатьЗапускПриложения, но семантически точнее и удобнее читается в коде.

&НаКлиенте

Процедура ОткрытьФайлНажатие(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеОткрытияФайла", ЭтотОбъект);

ФайловаяСистемаКлиент.ОткрытьФайл(Оповещение, "C:\Отчеты\Остатки.xlsx");

КонецПроцедуры

У этого же объекта есть полезные соседние методы: ОткрытьПроводник — показать файл в папке, ОткрытьНавигационнуюСсылку — открыть URL в браузере. Если конфигурация должна работать на версиях платформы ниже 8.3.22, используйте НачатьЗапускПриложения — он поддерживается значительно дольше.

Открываем файл из базы или с сервера

Типовая ситуация: файл хранится в реквизите справочника (тип «ХранилищеЗначения») или лежит в каталоге на сервере 1С. Напрямую открыть его на клиенте нельзя — клиент не имеет доступа к серверной файловой системе. Нужна цепочка из трёх шагов.

Порядок действий
  1. 1
    На сервере получите двоичные данные файла и поместите их во временное хранилище (ПоместитьВоВременноеХранилище), верните адрес на клиент
  2. 2
    На клиенте вызовите НачатьПолучениеФайлаССервера с указанием адреса хранилища и локального пути во временном каталоге
  3. 3
    В обработчике завершения вызовите ФайловаяСистемаКлиент.ОткрытьФайл или НачатьЗапускПриложения для полученного файла
  4. 4
    Проверьте, что файл открылся у пользователя, и при необходимости удалите временную копию
&НаСервере

Функция ПолучитьАдресФайла(ДокументСсылка)

ДвоичныеДанные = ДокументСсылка.Файл.Получить(); // ХранилищеЗначения

Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

КонецФункции

&НаКлиенте

Процедура ОткрытьФайлИзБазы(Команда)

Адрес = ПолучитьАдресФайла(Объект.Ссылка);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");

Оповещение = Новый ОписаниеОповещения("ПослеПолученияФайла", ЭтотОбъект, ИмяВременногоФайла);

НачатьПолучениеФайлаССервера(Оповещение, Адрес, ИмяВременногоФайла);

КонецПроцедуры

&НаКлиенте

Процедура ПослеПолученияФайла(ПолученныйФайл, ИмяВременногоФайла) Экспорт

Если ПолученныйФайл = Неопределено Тогда

ПоказатьПредупреждение(, "Не удалось получить файл с сервера.");

Возврат;

КонецЕсли;

НачатьЗапускПриложения(, ИмяВременногоФайла);

КонецПроцедуры

Расширение временного файла должно совпадать с реальным типом документа — по расширению Windows выбирает ассоциированное приложение. Если исходное имя файла хранится в базе, лучше брать расширение из него.

Открытие значений и навигационных ссылок без файла

Не всегда нужен именно файл. Если цель — показать пользователю табличный документ, картинку или объект базы, есть более простые пути, не требующие записи на диск.

Табличный документ открывается методом Показать() прямо на клиенте — так выводятся печатные формы без сохранения в файл. Картинку из базы можно показать через ПоказатьЗначение, если поместить её в реквизит формы. Для открытия страницы в браузере используйте ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку или ПерейтиПоНавигационнойСсылке.

&НаКлиенте

Процедура ПоказатьПечатнуюФорму(Команда)

ТабДок = СформироватьПечатнуюФормуНаСервере(Объект.Ссылка);

ТабДок.Показать("Счёт на оплату");

КонецПроцедуры

Сравнение вариантов

ФайловаяСистемаКлиент.ОткрытьФайл

Современный способ для локальных файлов; требует платформу 8.3.22 и новее

НачатьЗапускПриложения

Универсальный, работает на старых платформах и во всех клиентах; нужен обработчик оповещения

ТабличныйДокумент.Показать

Для печатных форм без создания файла; не подходит для PDF и сторонних форматов

ПерейтиПоНавигационнойСсылке

Для URL и ссылок на объекты базы; файлы на диске не открывает

Особенности веб-клиента и безопасность

В веб-клиенте файловые операции ограничены браузерной песочницей. Для работы с локальной файловой системой пользователю предлагается установить расширение работы с файлами — без него НачатьПолучениеФайлаССервера и ряд других методов вызовут диалог установки или ошибку. Проверить подключение расширения можно методом ПодключитьРасширениеРаботыСФайлами.

Вторая особенность — в веб-клиенте «открыть файл» часто означает «скачать файл»: браузер сохранит его в папку загрузок, и дальше пользователь открывает его сам. Полностью автоматический запуск ассоциированного приложения из браузера может блокироваться настройками безопасности.

Типичные ошибки и как их избежать

Большинство проблем при открытии файлов на клиенте связано с путями и с моделью клиент-серверного взаимодействия. Разберём самые частые.

Типичные ошибки
01
Обращение к диску клиента из серверной процедуры — сервер видит только свою файловую систему, файл «не находится»
02
Использование синхронного ЗапуститьПриложение в управляемом приложении — ошибка в тонком и веб-клиенте
03
Открытие файла сразу после ПоместитьВоВременноеХранилище без получения на клиент — файл остаётся на сервере
04
Неверное расширение временного файла — Windows открывает его не той программой или не открывает вовсе
05
Игнорирование кода возврата в обработчике оповещения — пользователь не узнает, что файл не открылся

Отдельно стоит упомянуть русские буквы и пробелы в путях: на современных версиях платформы проблем обычно нет, но при передаче пути внешней программе через параметры командной строки экранируйте его кавычками. И всегда сообщайте пользователю результат операции — молчаливый код, который «не сработал», порождает ложные обращения в поддержку.

Контрольные точки

Как проверить результат

Обработчик оповещения вызван
Норма

Код возврата 0, файл открылся в ассоциированной программе

Тревожный признак

Код возврата отличен от 0 или оповещение не вызвано

Файл получен с сервера
Норма

В обработчике ПолученныйФайл заполнен, размер больше нуля

Тревожный признак

ПолученныйФайл = Неопределено

Веб-клиент
Норма

Расширение работы с файлами подключено, файл скачан или открыт

Тревожный признак

Диалог установки расширения появляется повторно

FAQ

Как открыть файл на клиенте без описания оповещения?

Никак в рамках рекомендуемой модели: все методы запуска и файловых операций в управляемом приложении асинхронные и требуют описание оповещения. Допустимо передать Неопределено вместо оповещения, если результат операции не нужен, — файл откроется, но об ошибке вы не узнаете.

Почему НачатьЗапускПриложения не открывает файл в веб-клиенте?

Браузер ограничивает доступ к локальной системе. Убедитесь, что у пользователя установлено и подключено расширение работы с файлами, и что браузер не блокирует автоматическое открытие скачанных файлов. Часто надёжнее оформить операцию как скачивание файла.

Как открыть файл с сервера 1С, не сохраняя его у пользователя?

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

Чем отличается НачатьЗапускПриложения от ФайловаяСистемаКлиент.ОткрытьФайл?

Функционально для открытия документов они эквивалентны — оба запускают файл ассоциированным приложением. Разница в версиях: ФайловаяСистемаКлиент доступна с платформы 8.3.22, а НачатьЗапускПриложения работает на значительно более старых версиях.

Можно ли открыть файл на сервере, а показать пользователю только содержимое?

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

Как открыть папку с файлом, а не сам файл?

Используйте ФайловаяСистемаКлиент.ОткрытьПроводник() с указанием пути — откроется окно проводника. На старых платформах тот же эффект даёт НачатьЗапускПриложения с путём к каталогу вместо файла.

Итог

Что важно запомнить

Локальный файл открывайте через ФайловаяСистемаКлиент.ОткрытьФайл (8.3.22+) или универсальный НачатьЗапускПриложения. Файл из базы сначала получите на клиент через временное хранилище. Все методы асинхронные — обрабатывайте результат в оповещении, а в веб-клиенте проверяйте расширение работы с файлами.