Разработка и Конфигурация · 11 мин
Как открыть файл на клиенте в 1С
Как открыть файл на клиенте в 1С: НачатьЗапускПриложения, ФайловаяСистемаКлиент, ОткрытьЗначение. Примеры кода для тонкого и веб-клиента, типовые ошибки.
Задача открыть файл на стороне клиента возникает в 1С постоянно: показать пользователю сохранённую печатную форму, запустить внешнюю программу, открыть PDF-договор или картинку из справочника. Главная сложность в том, что код общего модуля или сервера не имеет доступа к диску пользователя, а методы, работавшие в толстом клиенте, в тонком и веб-клиенте ведут себя иначе.
В управляемом приложении платформа предлагает несколько способов: асинхронные методы объекта ФайловаяСистемаКлиент, универсальное НачатьЗапускПриложения, передачу файла через временное хранилище с последующим открытием, а для простых случаев — ПоказатьЗначение и ПолучитьФайл. Выбор зависит от того, где лежит файл (на сервере, на клиенте, в базе), какой клиент используется и нужно ли дождаться завершения операции.
Ниже разобраны рабочие сценарии с примерами кода, ограничения тонкого и веб-клиента, типовые ошибки и способы проверить, что файл действительно открылся у пользователя.
Где лежит файл: определяем сценарий
Прежде чем писать код, ответьте на три вопроса. Первый: файл уже есть на диске клиентского компьютера или он хранится на сервере / в информационной базе. Второй: какой клиент используется — толстый, тонкий или веб. Третий: нужно ли программе дождаться результата открытия или достаточно «запустить и забыть».
От ответов зависит вся конструкция. Локальный файл открывается одной строкой. Файл из базы требует цепочки: серверная процедура кладёт двоичные данные во временное хранилище, клиент получает файл во временный каталог и только потом открывает его. В веб-клиенте добавляется ограничение: без расширения работы с файлами многие операции недоступны, и его нужно предложить установить.
Достаточно ФайловаяСистемаКлиент.ОткрытьФайл или НачатьЗапускПриложения
Нужны ПоместитьВоВременноеХранилище и НачатьПолучениеФайлаССервера
Проверяйте подключение расширения работы с файлами
Используйте описание оповещения, синхронные методы недоступны
Открываем локальный файл через НачатьЗапускПриложения
Универсальный способ, работающий во всех клиентах, — метод НачатьЗапускПриложения. Он запускает файл ассоциированным приложением операционной системы: PDF — в просмотрщике, xlsx — в Excel, картинку — в графическом редакторе по умолчанию.
&НаКлиенте
Процедура ОткрытьФайлНажатие(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаПриложения", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, "C:\Документы\Договор.pdf");
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт
Если КодВозврата <> 0 Тогда
ПоказатьПредупреждение(, "Не удалось открыть файл. Код возврата: " + КодВозврата);
КонецЕсли;
КонецПроцедуры
Обратите внимание: метод асинхронный. Синхронный аналог ЗапуститьПриложение в управляемом приложении по умолчанию недоступен, если в конфигурации не включён режим использования синхронных вызовов — а делать это ради одной операции не рекомендуется, так как синхронный режим не поддерживается в веб-клиенте и считается устаревшим.
Если путь к файлу содержит пробелы, оборачивать его в кавычки внутри строки обычно не требуется — платформа передаёт путь корректно. А вот при передаче дополнительных параметров командной строки третьим параметром метода кавычки вокруг путей уже обязательны.
Современный способ: ФайловаяСистемаКлиент
Начиная с версии платформы 8.3.22 доступен объект ФайловаяСистемаКлиент с набором асинхронных методов, специально предназначенных для файловых операций на клиенте. Для открытия файла используется ФайловаяСистемаКлиент.ОткрытьФайл() — он делает то же, что и НачатьЗапускПриложения, но семантически точнее и удобнее читается в коде.
&НаКлиенте
Процедура ОткрытьФайлНажатие(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеОткрытияФайла", ЭтотОбъект);
ФайловаяСистемаКлиент.ОткрытьФайл(Оповещение, "C:\Отчеты\Остатки.xlsx");
КонецПроцедуры
У этого же объекта есть полезные соседние методы: ОткрытьПроводник — показать файл в папке, ОткрытьНавигационнуюСсылку — открыть URL в браузере. Если конфигурация должна работать на версиях платформы ниже 8.3.22, используйте НачатьЗапускПриложения — он поддерживается значительно дольше.
Открываем файл из базы или с сервера
Типовая ситуация: файл хранится в реквизите справочника (тип «ХранилищеЗначения») или лежит в каталоге на сервере 1С. Напрямую открыть его на клиенте нельзя — клиент не имеет доступа к серверной файловой системе. Нужна цепочка из трёх шагов.
- 1На сервере получите двоичные данные файла и поместите их во временное хранилище (ПоместитьВоВременноеХранилище), верните адрес на клиент
- 2На клиенте вызовите НачатьПолучениеФайлаССервера с указанием адреса хранилища и локального пути во временном каталоге
- 3В обработчике завершения вызовите ФайловаяСистемаКлиент.ОткрытьФайл или НачатьЗапускПриложения для полученного файла
- 4Проверьте, что файл открылся у пользователя, и при необходимости удалите временную копию
&НаСервере
Функция ПолучитьАдресФайла(ДокументСсылка)
ДвоичныеДанные = ДокументСсылка.Файл.Получить(); // ХранилищеЗначения
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ОткрытьФайлИзБазы(Команда)
Адрес = ПолучитьАдресФайла(Объект.Ссылка);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
Оповещение = Новый ОписаниеОповещения("ПослеПолученияФайла", ЭтотОбъект, ИмяВременногоФайла);
НачатьПолучениеФайлаССервера(Оповещение, Адрес, ИмяВременногоФайла);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолученияФайла(ПолученныйФайл, ИмяВременногоФайла) Экспорт
Если ПолученныйФайл = Неопределено Тогда
ПоказатьПредупреждение(, "Не удалось получить файл с сервера.");
Возврат;
КонецЕсли;
НачатьЗапускПриложения(, ИмяВременногоФайла);
КонецПроцедуры
Расширение временного файла должно совпадать с реальным типом документа — по расширению Windows выбирает ассоциированное приложение. Если исходное имя файла хранится в базе, лучше брать расширение из него.
Открытие значений и навигационных ссылок без файла
Не всегда нужен именно файл. Если цель — показать пользователю табличный документ, картинку или объект базы, есть более простые пути, не требующие записи на диск.
Табличный документ открывается методом Показать() прямо на клиенте — так выводятся печатные формы без сохранения в файл. Картинку из базы можно показать через ПоказатьЗначение, если поместить её в реквизит формы. Для открытия страницы в браузере используйте ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку или ПерейтиПоНавигационнойСсылке.
&НаКлиенте
Процедура ПоказатьПечатнуюФорму(Команда)
ТабДок = СформироватьПечатнуюФормуНаСервере(Объект.Ссылка);
ТабДок.Показать("Счёт на оплату");
КонецПроцедуры
Сравнение вариантов
Современный способ для локальных файлов; требует платформу 8.3.22 и новее
Универсальный, работает на старых платформах и во всех клиентах; нужен обработчик оповещения
Для печатных форм без создания файла; не подходит для PDF и сторонних форматов
Для URL и ссылок на объекты базы; файлы на диске не открывает
Особенности веб-клиента и безопасность
В веб-клиенте файловые операции ограничены браузерной песочницей. Для работы с локальной файловой системой пользователю предлагается установить расширение работы с файлами — без него НачатьПолучениеФайлаССервера и ряд других методов вызовут диалог установки или ошибку. Проверить подключение расширения можно методом ПодключитьРасширениеРаботыСФайлами.
Вторая особенность — в веб-клиенте «открыть файл» часто означает «скачать файл»: браузер сохранит его в папку загрузок, и дальше пользователь открывает его сам. Полностью автоматический запуск ассоциированного приложения из браузера может блокироваться настройками безопасности.
Типичные ошибки и как их избежать
Большинство проблем при открытии файлов на клиенте связано с путями и с моделью клиент-серверного взаимодействия. Разберём самые частые.
Отдельно стоит упомянуть русские буквы и пробелы в путях: на современных версиях платформы проблем обычно нет, но при передаче пути внешней программе через параметры командной строки экранируйте его кавычками. И всегда сообщайте пользователю результат операции — молчаливый код, который «не сработал», порождает ложные обращения в поддержку.
Как проверить результат
Код возврата 0, файл открылся в ассоциированной программе
Код возврата отличен от 0 или оповещение не вызвано
В обработчике ПолученныйФайл заполнен, размер больше нуля
ПолученныйФайл = Неопределено
Расширение работы с файлами подключено, файл скачан или открыт
Диалог установки расширения появляется повторно
FAQ
Как открыть файл на клиенте без описания оповещения?
Никак в рамках рекомендуемой модели: все методы запуска и файловых операций в управляемом приложении асинхронные и требуют описание оповещения. Допустимо передать Неопределено вместо оповещения, если результат операции не нужен, — файл откроется, но об ошибке вы не узнаете.
Почему НачатьЗапускПриложения не открывает файл в веб-клиенте?
Браузер ограничивает доступ к локальной системе. Убедитесь, что у пользователя установлено и подключено расширение работы с файлами, и что браузер не блокирует автоматическое открытие скачанных файлов. Часто надёжнее оформить операцию как скачивание файла.
Как открыть файл с сервера 1С, не сохраняя его у пользователя?
Полностью без сохранения — никак: чтобы внешняя программа открыла файл, он должен физически существовать на клиенте. Стандартный подход — получить файл во временный каталог через НачатьПолучениеФайлаССервера и открыть его оттуда. Временные файлы операционная система периодически очищает сама.
Чем отличается НачатьЗапускПриложения от ФайловаяСистемаКлиент.ОткрытьФайл?
Функционально для открытия документов они эквивалентны — оба запускают файл ассоциированным приложением. Разница в версиях: ФайловаяСистемаКлиент доступна с платформы 8.3.22, а НачатьЗапускПриложения работает на значительно более старых версиях.
Можно ли открыть файл на сервере, а показать пользователю только содержимое?
Да, если содержимое представимо в 1С: например, табличный документ, текст или картинку можно прочитать на сервере, передать на клиент и показать средствами формы без запуска внешних программ. Для PDF такой вариант без сторонних компонентов недоступен.
Как открыть папку с файлом, а не сам файл?
Используйте ФайловаяСистемаКлиент.ОткрытьПроводник() с указанием пути — откроется окно проводника. На старых платформах тот же эффект даёт НачатьЗапускПриложения с путём к каталогу вместо файла.
Что важно запомнить
Локальный файл открывайте через ФайловаяСистемаКлиент.ОткрытьФайл (8.3.22+) или универсальный НачатьЗапускПриложения. Файл из базы сначала получите на клиент через временное хранилище. Все методы асинхронные — обрабатывайте результат в оповещении, а в веб-клиенте проверяйте расширение работы с файлами.