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

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

Как программно открыть файл в 1С

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

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

Главная сложность — асинхронная модель работы с файлами в управляемых формах. Платформа запрещает синхронные вызовы, блокирующие интерфейс, поэтому современный код строится на оповещениях и обещаниях. Устаревшие методы вроде ЗапуститьПриложение() без параметра ожидания до сих пор встречаются в старых конфигурациях, но для новых доработок их применять не следует.

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

Какой способ выбрать: обзор методов

Выбор метода зависит от трёх факторов: версии платформы, типа клиента и того, где физически находится файл — на диске клиента, на сервере или во временном хранилище. Универсального решения на все случаи нет, поэтому полезно понимать весь набор инструментов.

МетодВерсия платформыТонкий/толстый клиентВеб-клиентОсобенности
ФайловаяСистема.ОткрытьФайл()8.3.22+ДаДаРекомендуемый, асинхронный
НачатьЗапускПриложения()8.3.хДаОграниченноНужно описание оповещения
ЗапуститьПриложение()всеДаНетУстаревший синхронный вызов
ПолучитьФайл()всеДаДаДля файлов из хранилища
WScript.Shell (COM)всеТолько WindowsНетНестандартный обходной путь

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

Открытие файла через ФайловаяСистема.ОткрытьФайл()

Метод ФайловаяСистема.ОткрытьФайл() появился в платформе 8.3.22 и является рекомендуемым способом. Он асинхронный, не требует расширения работы с файлами для открытия уже существующего файла и сам определяет приложение, ассоциированное с расширением.

Минимальный пример вызова:

ФайловаяСистема.ОткрытьФайл("C:\Отчеты\ОтчетПоПродажам.xlsx");

Вариант с обработкой результата через описание оповещения:

&НаКлиенте

Процедура ОткрытьОтчет(Команда)

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

ФайловаяСистема.ОткрытьФайл(ПутьКФайлу, Оповещение);

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

&НаКлиенте

Процедура ПослеОткрытияФайла(ДополнительныеПараметры) Экспорт

// Файл передан операционной системе

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

Метод также позволяет открыть файл на редактирование и отследить завершение редактирования, что удобно для сценария «пользователь правит файл — изменения возвращаются в базу». Для этого используется связка с НачатьПомещениеФайлаИзВременногоХранилища или обработкой оповещения о завершении редактирования.

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

Для платформ младше 8.3.22 основной асинхронный метод — НачатьЗапускПриложения(). Он запускает командную строку операционной системы, поэтому для открытия файла ассоциированным приложением в Windows используется конструкция с cmd /c start или прямой вызов программы с параметром.

&НаКлиенте

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

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

СтрокаКоманды = "cmd /c start """" """ + ПутьКФайлу + """";

НачатьЗапускПриложения(Оповещение, СтрокаКоманды);

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Обратите внимание на двойные кавычки после start — это заголовок окна, который cmd требует первым параметром. Если его опустить, путь с пробелами будет интерпретирован неправильно, и файл не откроется. Это одна из самых частых причин «молчаливых» сбоев.

Если нужно открыть файл конкретной программой, укажите путь к исполняемому файлу явно:

НачатьЗапускПриложения(Оповещение, """C:\Program Files\...\AcroRd32.exe"" """ + ПутьКФайлу + """");

Открытие файла из временного хранилища

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

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

&НаСервере

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

ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ДокументСсылка.ПрисоединенныйФайл);

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

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

&НаКлиенте

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

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

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

НачатьПолучениеФайлаИзВременногоХранилища(

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

Адрес, ИмяВременногоФайла, Ложь);

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

&НаКлиенте

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

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

ФайловаяСистема.ОткрытьФайл(ПолученныйФайл.ПолноеИмя);

КонецЕсли;

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

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

Порядок действий для файла с сервера
  1. 1
    На сервере получите двоичные данные файла и поместите их во временное хранилище с привязкой к УникальныйИдентификатор формы
  2. 2
    Верните адрес хранилища в клиентскую процедуру
  3. 3
    На клиенте получите файл из хранилища во временный каталог
  4. 4
    Откройте файл через ФайловаяСистема.ОткрытьФайл
  5. 5
    Проверьте, что файл открылся в ассоциированном приложении

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

В веб-клиенте действуют ограничения браузерной песочницы: прямой доступ к произвольным путям файловой системы запрещён. Открыть файл по локальному пути вроде C:\Документы\file.pdf из веб-клиента нельзя — код должен работать только с файлами, которые пользователь явно выбрал через диалог, или с файлами, полученными из хранилища.

Для веб-клиента типовой сценарий выглядит так: файл с сервера передаётся через временное хранилище, браузер скачивает его в каталог загрузок, после чего пользователь открывает файл вручную либо браузер открывает его автоматически, если так настроен. Метод ПолучитьФайл() с параметром интерактивности управляет показом диалога сохранения.

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

&НаКлиенте

Процедура ПодключитьРасширениеИОткрыть()

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

НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);

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

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

Альтернативные способы: Shell, браузер, внешние компоненты

Через COM-объект WScript.Shell можно запустить файл способом, близким к двойному щелчку в проводнике. Способ работает только в Windows и только там, где разрешено создание COM-объектов (тонкий и толстый клиент, не веб):

Shell = Новый COMОбъект("WScript.Shell");

Shell.Run("""" + ПутьКФайлу + """");

Для открытия файла в браузере (например, HTML-отчёта) удобен метод ЗапуститьПриложение() с URL или ПерейтиПоНавигационнойСсылке(), если файл опубликован на веб-сервере. Навигационная ссылка вида file:///... в большинстве браузеров заблокирована, поэтому для веб-клиента этот путь не подходит.

Изображения и текстовые файлы иногда удобнее не открывать во внешней программе, а показать прямо в форме 1С: картинку — через поле картинки, текст — через текстовый документ или поле HTML-документа. Это снимает зависимость от установленного на компьютере пользователя ПО.

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

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

Рекомендуемый метод для платформы 8.3.22+. Асинхронный, работает в тонком и веб-клиенте, сам находит ассоциированное приложение

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

Для платформ младше 8.3.22 или когда нужен запуск конкретной программы с параметрами. Требует аккуратной работы с кавычками

WScript.Shell

Только Windows, только клиенты с разрешёнными COM. Подходит как запасной вариант в старых доработках

Показ в форме 1С

Для картинок, текста и HTML. Не зависит от внешних программ, но требует доработки интерфейса

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

После внедрения кода проверьте сценарий минимум в трёх условиях: файл существует по указанному пути, файл отсутствует (обработка ошибки), путь содержит пробелы и кириллицу. Именно кириллические пути и пробелы чаще всего ломают строковые команды запуска.

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

Для отладки полезно временно выводить итоговую строку команды через Сообщить() и выполнять её вручную в командной строке Windows — так сразу видно, корректно ли она собрана.

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

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

Открывается ли файл двойным щелчком в проводнике
Норма

Файл открывается в нужной программе — ассоциация настроена, код 1С сработает

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

Windows спрашивает, чем открыть файл — сначала настройте ассоциацию в ОС

Код возврата НачатьЗапускПриложения
Норма

0 — команда выполнена

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

Ненулевой код — проверяйте путь и кавычки в строке команды

Путь к файлу
Норма

Путь полный, файл существует, нет неэкранированных пробелов

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

Относительный путь или файл на сервере при вызове с клиента

Часто задаваемые вопросы

Как открыть файл и дождаться закрытия программы?

Используйте НачатьЗапускПриложения с параметром ДождатьсяЗавершения = Истина — оповещение сработает после завершения процесса. Для сценария «открыть на редактирование и забрать обратно» удобнее механизм редактирования файла из хранилища в связке с ФайловаяСистема.ОткрытьФайл, который отслеживает окончание редактирования.

Почему код работает на одном компьютере и не работает на другом?

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

Можно ли открыть файл в веб-клиенте без скачивания?

Нет, браузерная модель безопасности не позволяет 1С запустить локальное приложение напрямую. Файл передаётся через временное хранилище и скачивается браузером, после чего открывается средствами ОС. Альтернатива — показать содержимое прямо в форме (картинка, HTML, текст).

Как открыть файл на сервере 1С под Linux?

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

Что делать, если путь к файлу содержит кириллицу и пробелы?

Заключайте путь в двойные кавычки при формировании строки команды, а для cmd /c start добавляйте пустые кавычки заголовка первым параметром. Метод ФайловаяСистема.ОткрытьФайл принимает путь напрямую и таких проблем не создаёт.

Как открыть сразу несколько файлов?

Вызовите ФайловаяСистема.ОткрытьФайл в цикле для каждого пути — каждый файл откроется в отдельном окне ассоциированного приложения. Учитывайте, что при большом количестве файлов это создаст нагрузку на компьютер пользователя; имеет смысл ограничивать количество или запрашивать подтверждение.

Итог

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

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