Разработка и Конфигурация · 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На сервере получите двоичные данные файла и поместите их во временное хранилище с привязкой к УникальныйИдентификатор формы
- 2Верните адрес хранилища в клиентскую процедуру
- 3На клиенте получите файл из хранилища во временный каталог
- 4Откройте файл через ФайловаяСистема.ОткрытьФайл
- 5Проверьте, что файл открылся в ассоциированном приложении
Особенности веб-клиента и тонкого клиента
В веб-клиенте действуют ограничения браузерной песочницы: прямой доступ к произвольным путям файловой системы запрещён. Открыть файл по локальному пути вроде C:\Документы\file.pdf из веб-клиента нельзя — код должен работать только с файлами, которые пользователь явно выбрал через диалог, или с файлами, полученными из хранилища.
Для веб-клиента типовой сценарий выглядит так: файл с сервера передаётся через временное хранилище, браузер скачивает его в каталог загрузок, после чего пользователь открывает файл вручную либо браузер открывает его автоматически, если так настроен. Метод ПолучитьФайл() с параметром интерактивности управляет показом диалога сохранения.
Тонкий клиент ограничений браузера не имеет, но требует установки расширения работы с файлами для части операций. Перед файловыми вызовами полезно проверять и подключать расширение:
&НаКлиенте
Процедура ПодключитьРасширениеИОткрыть()
Оповещение = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект);
НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
КонецПроцедуры
Альтернативные способы: Shell, браузер, внешние компоненты
Через COM-объект WScript.Shell можно запустить файл способом, близким к двойному щелчку в проводнике. Способ работает только в Windows и только там, где разрешено создание COM-объектов (тонкий и толстый клиент, не веб):
Shell = Новый COMОбъект("WScript.Shell");
Shell.Run("""" + ПутьКФайлу + """");
Для открытия файла в браузере (например, HTML-отчёта) удобен метод ЗапуститьПриложение() с URL или ПерейтиПоНавигационнойСсылке(), если файл опубликован на веб-сервере. Навигационная ссылка вида file:///... в большинстве браузеров заблокирована, поэтому для веб-клиента этот путь не подходит.
Изображения и текстовые файлы иногда удобнее не открывать во внешней программе, а показать прямо в форме 1С: картинку — через поле картинки, текст — через текстовый документ или поле HTML-документа. Это снимает зависимость от установленного на компьютере пользователя ПО.
Сравнение вариантов
Рекомендуемый метод для платформы 8.3.22+. Асинхронный, работает в тонком и веб-клиенте, сам находит ассоциированное приложение
Для платформ младше 8.3.22 или когда нужен запуск конкретной программы с параметрами. Требует аккуратной работы с кавычками
Только Windows, только клиенты с разрешёнными COM. Подходит как запасной вариант в старых доработках
Для картинок, текста и HTML. Не зависит от внешних программ, но требует доработки интерфейса
Проверка результата и диагностика проблем
После внедрения кода проверьте сценарий минимум в трёх условиях: файл существует по указанному пути, файл отсутствует (обработка ошибки), путь содержит пробелы и кириллицу. Именно кириллические пути и пробелы чаще всего ломают строковые команды запуска.
Признаки корректной работы: ассоциированное приложение открывается в течение нескольких секунд, в журнале регистрации нет ошибок, код возврата НачатьЗапускПриложения равен нулю. Если приложение не открывается и ошибок нет — почти всегда проблема в кавычках или в отсутствии ассоциации расширения с программой на конкретном компьютере.
Для отладки полезно временно выводить итоговую строку команды через Сообщить() и выполнять её вручную в командной строке Windows — так сразу видно, корректно ли она собрана.
Как проверить результат
Файл открывается в нужной программе — ассоциация настроена, код 1С сработает
Windows спрашивает, чем открыть файл — сначала настройте ассоциацию в ОС
0 — команда выполнена
Ненулевой код — проверяйте путь и кавычки в строке команды
Путь полный, файл существует, нет неэкранированных пробелов
Относительный путь или файл на сервере при вызове с клиента
Часто задаваемые вопросы
Как открыть файл и дождаться закрытия программы?
Используйте НачатьЗапускПриложения с параметром ДождатьсяЗавершения = Истина — оповещение сработает после завершения процесса. Для сценария «открыть на редактирование и забрать обратно» удобнее механизм редактирования файла из хранилища в связке с ФайловаяСистема.ОткрытьФайл, который отслеживает окончание редактирования.
Почему код работает на одном компьютере и не работает на другом?
Чаще всего на втором компьютере не настроена ассоциация расширения файла с программой или программа установлена по другому пути. Проверьте, открывается ли файл двойным щелчком в проводнике. Не зашивайте пути к программам в код — полагайтесь на ассоциации ОС.
Можно ли открыть файл в веб-клиенте без скачивания?
Нет, браузерная модель безопасности не позволяет 1С запустить локальное приложение напрямую. Файл передаётся через временное хранилище и скачивается браузером, после чего открывается средствами ОС. Альтернатива — показать содержимое прямо в форме (картинка, HTML, текст).
Как открыть файл на сервере 1С под Linux?
На сервере файлы обычно не открывают интерактивно — там нет пользовательского сеанса с графической средой. Если нужно выполнить внешнюю утилиту на сервере, используйте ЗапуститьПриложение в серверном контексте с полными путями, учитывая права пользователя, под которым работает агент сервера 1С.
Что делать, если путь к файлу содержит кириллицу и пробелы?
Заключайте путь в двойные кавычки при формировании строки команды, а для cmd /c start добавляйте пустые кавычки заголовка первым параметром. Метод ФайловаяСистема.ОткрытьФайл принимает путь напрямую и таких проблем не создаёт.
Как открыть сразу несколько файлов?
Вызовите ФайловаяСистема.ОткрытьФайл в цикле для каждого пути — каждый файл откроется в отдельном окне ассоциированного приложения. Учитывайте, что при большом количестве файлов это создаст нагрузку на компьютер пользователя; имеет смысл ограничивать количество или запрашивать подтверждение.
Что важно запомнить
Для платформы 8.3.22+ используйте ФайловаяСистема.ОткрытьФайл — это асинхронный и кросс-клиентский способ. На старых релизах применяйте НачатьЗапускПриложения с корректным экранированием путей. Файл с сервера сначала передавайте клиенту через временное хранилище, а в веб-клиенте помните про ограничения браузера.