Открываем файл из кода 1С 8.3: от ЗапуститьПриложение до веб-клиента

· 9 мин

Содержание

Чтобы программно открыть файл в 1С 8.3 в программе по умолчанию, на клиенте вызывают НачатьЗапускПриложения() (или ЗапуститьПриложениеАсинх() на платформе 8.3.18 и новее) и передают полный путь к файлу. Windows сама подберёт приложение по расширению: PDF откроется в просмотрщике, XLSX — в Excel. Старый синхронный ЗапуститьПриложение() тоже работает, но только если в свойствах конфигурации разрешены синхронные вызовы.

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

Какой способ открытия файла выбрать

Сначала определите, что именно значит «открыть» в вашей задаче. Показать файл пользователю и прочитать его содержимое в 1С — разные операции.

ЗадачаМетодГде работаетОграничения
Открыть файл во внешней программеНачатьЗапускПриложения, ЗапуститьПриложениеАсинхКлиентВ веб-клиенте нужно расширение работы с файлами
Дать пользователю выбрать файлДиалогВыбораФайла с методом ПоказатьКлиентСинхронный Выбрать() запрещён без модальности
Прочитать текстТекстовыйДокумент, ЧтениеТекстаКлиент и серверФайл должен быть доступен тому, кто читает
Прочитать ExcelТабличныйДокумент.Прочитать() или COMКлиент и серверCOM — только Windows и установленный Excel
Управлять Word/Excel из кодаCOMОбъектWindows-клиент, Windows-серверНе работает в веб-клиенте и на Linux
Открыть внешнюю обработкуВнешниеОбработки.Подключить + ОткрытьФормуСервер + клиентНужны права и защита от опасных действий

💡 Главное правило: код выполняется там, где он написан. ЗапуститьПриложение в серверной процедуре откроет файл на сервере 1С, а пользователь ничего не увидит.

Запуск файла в программе по умолчанию через ЗапуститьПриложение

Метод принимает строку команды. Если передать путь к документу, а не к исполняемому файлу, система откроет его ассоциированной программой.

Синхронный вариант

Подходит для старых конфигураций, где в свойствах стоит режим синхронных вызовов «Использовать»:

&НаКлиенте
Процедура ОткрытьВыгрузку(Команда)
    ПутьКФайлу = "C:\Выгрузки\Реестр платежей.xlsx";
    ЗапуститьПриложение("""" + ПутьКФайлу + """");
КонецПроцедуры

Путь обёрнут в кавычки не зря. Без них строка с пробелом разобьётся на части, и система попытается открыть C:\Выгрузки\Реестр.

Полная сигнатура: ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата). Третий параметр заставляет 1С ждать, пока пользователь закроет программу. Для обычного открытия документа он не нужен: форма «зависнет» до закрытия Excel.

Асинхронный вариант с оповещением

В новых конфигурациях синхронные методы на клиенте запрещены, поэтому используют НачатьЗапускПриложения:

&НаКлиенте
Процедура ОткрытьФайлВПрограмме(ПутьКФайлу)
    Оповещение = Новый ОписаниеОповещения("ПослеЗапуска", ЭтотОбъект);
    НачатьЗапускПриложения(Оповещение, """" + ПутьКФайлу + """", , Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапуска(КодВозврата, ДополнительныеПараметры) Экспорт
    // Файл передан системе, дополнительных действий не требуется
КонецПроцедуры

Процедура-обработчик обязательно Экспорт, иначе платформа не сможет её вызвать.

Вариант с Асинх и Ждать

Начиная с 8.3.18 тот же код пишется линейно:

&НаКлиенте
Асинх Процедура ОткрытьОтчетПоставщика(Команда)
    ПутьКФайлу = "C:\Входящие\Акт сверки.pdf";
    Попытка
        Ждать ЗапуститьПриложениеАсинх("""" + ПутьКФайлу + """");
    Исключение
        Сообщить("Не удалось открыть файл: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

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

Если клиент на Linux

Ассоциации файлов там работают через утилиту xdg-open. Передайте её в начало команды: "xdg-open """ + ПутьКФайлу + """". Чтобы открыть папку, а не файл, в Windows подставляют explorer.exe с путём к каталогу.

Диалог выбора файла: как дать пользователю указать путь

Жёстко прописанный путь годится для примера. В реальной форме файл выбирает пользователь. Для этого есть объект ДиалогВыбораФайла.

Настройка диалога

Основные свойства:

  • 📂 Заголовок — текст в шапке окна;
  • 🔍 Фильтр — строка вида "Описание|*.расширение", пары разделяются вертикальной чертой;
  • ☑️ МножественныйВыбор — разрешить выбор нескольких файлов;
  • 📁 Каталог — с какой папки начать;
  • 🧾 ПолноеИмяФайла — путь по умолчанию и результат одиночного выбора.

Режим задают в конструкторе: РежимДиалогаВыбораФайла.Открытие, Сохранение или ВыборКаталога.

Асинхронный выбор и открытие

&НаКлиенте
Процедура ВыбратьИОткрыть(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл от поставщика";
    Диалог.Фильтр = "Таблицы Excel (*.xlsx;*.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*";
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы = Неопределено Тогда
        Возврат; // пользователь нажал «Отмена»
    КонецЕсли;
    ОткрытьФайлВПрограмме(ВыбранныеФайлы[0]);
КонецПроцедуры

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

Синхронный Выбрать()

Метод Диалог.Выбрать() возвращает Истину или Ложь и открывает модальное окно. В конфигурации с режимом модальности «Не использовать» он вызовет ошибку Использование модальных окон в данном режиме запрещено!. Используйте его только в старых решениях, где модальность разрешена.

Чтение содержимого вместо открытия

Если файл нужен самой программе, внешняя программа не нужна. Прочитайте его прямо в 1С:

&НаКлиенте
Процедура ПрочитатьТекст(ПутьКФайлу)
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
    Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
        Строка = Текст.ПолучитьСтроку(НомерСтроки);
        // разбор строки
    КонецЦикла;
КонецПроцедуры

Табличный документ читает .xlsx и .mxl без Excel: ТабДок = Новый ТабличныйДокумент; ТабДок.Прочитать(ПутьКФайлу);. Дальше значения берут через ТабДок.Область("R2C1").Текст. На сервере синхронные методы разрешены всегда, поэтому большие файлы удобнее разбирать там.

COM-объекты и OLE: открытие документов Word и Excel

Когда нужно не просто показать файл, а заполнить шаблон, пересчитать формулы или сохранить в другом формате, используют COM. Это и есть то, что раньше называли OLE-автоматизацией.

Excel

&НаКлиенте
Процедура ОткрытьВExcel(ПутьКФайлу)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Excel не установлен или не зарегистрирован: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Книга = Excel.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Worksheets(1);
    Сообщить("Значение A1: " + Строка(Лист.Cells(1, 1).Value));
    Excel.Visible = Истина; // показать окно пользователю
КонецПроцедуры

Если окно показывать не нужно, оставьте Visible ложным, а в конце закройте приложение: Книга.Close(Ложь); Excel.Quit(); Excel = Неопределено;. Иначе в диспетчере задач копятся процессы EXCEL.EXE.

Word

Принцип тот же: Word = Новый COMОбъект("Word.Application"); Документ = Word.Documents.Open(ПутьКФайлу); Word.Visible = Истина;. Через объект Документ можно заменять закладки, вставлять таблицы и сохранять копию.

Открыть файл по ассоциации через оболочку Windows

Альтернатива ЗапуститьПриложение — объект WScript.Shell:

Оболочка = Новый COMОбъект("WScript.Shell");
Оболочка.Run("""" + ПутьКФайлу + """");

Это полезно в тонком клиенте старых решений, когда синхронный запуск запрещён, а переписывать код на оповещения некогда. Но это костыль: на Linux и в веб-клиенте он не сработает.

Ограничения COM

  • 🪟 Только Windows. На Linux-сервере COMОбъект недоступен.
  • 🌐 В веб-клиенте COM не работает вовсе.
  • 🖥️ На сервере 1С Excel запускается от имени служебной учётной записи. Без профиля и прав он часто не стартует или висит. Для серверного чтения Excel надёжнее табличный документ.
  • 📦 Версия Office на машинах пользователей должна поддерживать нужный формат.

Внешние обработки и расширения для работы с файлами

Иногда задача — открыть не документ, а файл обработки .epf или отчёта .erf, причём из кода.

Интерактивное открытие

Пользователь открывает такой файл через главное меню Файл → Открыть (сочетание Ctrl+O). Пункт доступен, если у роли есть право «Интерактивное открытие внешних обработок». Без него пользователь получит отказ, даже если файл корректный.

Программное подключение

В управляемом приложении файл сначала помещают во временное хранилище, затем подключают на сервере и открывают форму на клиенте:

&НаКлиенте
Процедура ПодключитьОбработку(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещения(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    ИмяОбработки = ПодключитьНаСервере(Адрес);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

&НаСервере
Функция ПодключитьНаСервере(Адрес)
    Защита = Новый ОписаниеЗащитыОтОпасныхДействий;
    Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
    Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь, Защита);
КонецФункции

Отключение предупреждений и безопасного режима делайте только для обработок, которым доверяете. Чужой .epf с таким кодом получит полный доступ к базе.

В типовых конфигурациях правильнее зарегистрировать обработку в справочнике дополнительных обработок. Тогда права, версии и подключение берёт на себя БСП.

Расширение работы с файлами

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

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

&НаКлиенте
Процедура ПослеПодключения(Подключено, ДополнительныеПараметры) Экспорт
    Если Не Подключено Тогда
        НачатьУстановкуРасширенияРаботыСФайлами();
    КонецЕсли;
КонецПроцедуры

Обработка ошибок при открытии файла из 1С

Открытие файла ломается на трёх уровнях: файла нет, нет программы для открытия, метод запрещён режимом конфигурации.

Проверка существования

На сервере и в толстом клиенте хватит синхронной проверки:

Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
    Сообщить("Файл не найден: " + ПутьКФайлу);
    Возврат;
КонецЕсли;

На клиенте с запретом синхронных вызовов используйте Ждать Файл.СуществуетАсинх() в Асинх-процедуре или НачатьПроверкуСуществования с оповещением.

Попытка и Исключение

Любой вызов внешней программы и COM оборачивайте в Попытка ... Исключение. Внутри блока Исключение текст ошибки даёт ОписаниеОшибки(). Для журнала регистрации берите подробное представление через ИнформацияОбОшибке().

Диагностика: выберите симптом

Файл занят другим процессом

Если файл открыт в Excel, чтение через ТекстовыйДокумент или ТабличныйДокумент может упасть с ошибкой доступа. Предложите пользователю закрыть файл или копируйте его во временный каталог (ПолучитьИмяВременногоФайла("xlsx")) и читайте копию.

Веб-клиент и терминальный сервер: что меняется

Веб-клиент

Браузер изолирует страницу от диска. Отсюда три следствия:

  1. COMОбъект недоступен вообще.
  2. НачатьЗапускПриложения работает только при установленном расширении работы с файлами.
  3. Надёжный путь без расширения — обмен через временное хранилище.

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

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

Терминальный сервер (RDP)

Тонкий клиент на терминале — это обычный Windows-клиент, но работает он на сервере. Поэтому:

  • 🖥️ ЗапуститьПриложение откроет файл на терминальном сервере, в сеансе пользователя. Нужная программа должна стоять именно там.
  • 💾 Локальные диски пользователя доступны по пути \\tsclient\C, если в настройках RDP включено перенаправление дисков.
  • 👥 Пути вида C:\Выгрузки общие для всех сеансов. Чтобы пользователи не перетирали файлы друг друга, используйте КаталогВременныхФайлов() или папку профиля.

Сравнение по клиентам

ВозможностьТолстый клиентТонкий клиентВеб-клиент
ЗапуститьПриложение синхронноДаЕсли разрешено в конфигурацииНет
НачатьЗапускПриложенияДаДаС расширением
ДиалогВыбораФайлаДаДаС расширением
COMОбъектДа (Windows)Да (Windows)Нет
Временное хранилищеДаДаДа

Частые вопросы

Как открыть каталог, а не файл?
Передайте путь к папке в НачатьЗапускПриложения: проводник откроет её. Чтобы выделить конкретный файл, используйте команду explorer.exe /select, и полный путь после запятой.
Можно ли открыть файл, который хранится в базе 1С?
Да. Получите двоичные данные из реквизита или хранилища значения, запишите их методом Записать() во временный файл и откройте его как обычный.
Как открыть сайт или ссылку из 1С?
Для адресов http:// и https:// используйте ПерейтиПоНавигационнойСсылке(). Метод работает во всех клиентах, включая веб.
Почему код работает у программиста, но не у пользователя?
Чаще всего у разработчика толстый клиент или разрешены синхронные вызовы, а у пользователя веб-клиент или терминал. Проверяйте код в том клиенте, в котором работают сотрудники.
Как дождаться, пока пользователь закроет файл?
Передайте Истину в параметр «ДождатьсяЗавершения» у НачатьЗапускПриложения. Код возврата программы придёт в обработчик оповещения после её закрытия.