Открываем файл из кода 1С 8.3: от ЗапуститьПриложение до веб-клиента
Содержание
Чтобы программно открыть файл в 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")) и читайте копию.
Веб-клиент и терминальный сервер: что меняется
Веб-клиент
Браузер изолирует страницу от диска. Отсюда три следствия:
COMОбъектнедоступен вообще.НачатьЗапускПриложенияработает только при установленном расширении работы с файлами.- Надёжный путь без расширения — обмен через временное хранилище.
Чтобы прочитать файл пользователя, вызовите НачатьПомещениеФайла с интерактивным выбором. Файл уйдёт на сервер, где его получают через ПолучитьИзВременногоХранилища(Адрес) как двоичные данные. Затем их записывают во временный файл и читают обычными серверными методами.
Чтобы показать файл пользователю, сделайте обратное: поместите двоичные данные во временное хранилище и передайте адрес клиенту. Браузер скачает файл, а дальше пользователь откроет его сам. В БСП это делает ФайловаяСистемаКлиент.СохранитьФайл.
Терминальный сервер (RDP)
Тонкий клиент на терминале — это обычный Windows-клиент, но работает он на сервере. Поэтому:
- 🖥️
ЗапуститьПриложениеоткроет файл на терминальном сервере, в сеансе пользователя. Нужная программа должна стоять именно там. - 💾 Локальные диски пользователя доступны по пути
\\tsclient\C, если в настройках RDP включено перенаправление дисков. - 👥 Пути вида
C:\Выгрузкиобщие для всех сеансов. Чтобы пользователи не перетирали файлы друг друга, используйтеКаталогВременныхФайлов()или папку профиля.
Сравнение по клиентам
| Возможность | Толстый клиент | Тонкий клиент | Веб-клиент |
|---|---|---|---|
ЗапуститьПриложение синхронно | Да | Если разрешено в конфигурации | Нет |
НачатьЗапускПриложения | Да | Да | С расширением |
ДиалогВыбораФайла | Да | Да | С расширением |
COMОбъект | Да (Windows) | Да (Windows) | Нет |
| Временное хранилище | Да | Да | Да |
Частые вопросы
Как открыть каталог, а не файл?
НачатьЗапускПриложения: проводник откроет её. Чтобы выделить конкретный файл, используйте команду explorer.exe /select, и полный путь после запятой.Можно ли открыть файл, который хранится в базе 1С?
Записать() во временный файл и откройте его как обычный.Как открыть сайт или ссылку из 1С?
http:// и https:// используйте ПерейтиПоНавигационнойСсылке(). Метод работает во всех клиентах, включая веб.Почему код работает у программиста, но не у пользователя?
Как дождаться, пока пользователь закроет файл?
НачатьЗапускПриложения. Код возврата программы придёт в обработчик оповещения после её закрытия.