Открытие файлов из кода 1С:Предприятия 8.3 на клиенте, сервере и в веб-клиенте

· 10 мин

Содержание

Чтобы программно открыть файл в 1С:Предприятии 8.3 в программе по умолчанию, вызовите на клиенте ЗапуститьПриложение("C:\Отчеты\акт.pdf") или его асинхронный вариант НачатьЗапускПриложения. Если нужно не показать файл, а прочитать его содержимое, это другая задача: файл выбирают диалогом, передают на сервер через временное хранилище и читают там объектами ЧтениеТекста, ТекстовыйДокумент или ТабличныйДокумент.

Типичная ситуация: бухгалтер просит кнопку «Открыть скан договора» прямо в карточке контрагента, а программист пишет одну строку, которая работает у него в толстом клиенте и молча ничего не делает у пользователей в браузере. Всё дело в контексте: где выполняется код, есть ли у клиента доступ к диску и разрешена ли модальность. Ниже методы разобраны с этой точки зрения.

Какой метод открытия файла выбрать под задачу

Сначала определитесь, что значит «открыть» в вашем случае. Вариантов четыре, и у каждого свой инструмент.

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

Если в конфигурации есть Библиотека стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11 и другие типовые), начните с общего модуля ФайловаяСистемаКлиент. Процедуры ОткрытьФайл и ЗапуститьПрограмму уже учитывают веб-клиент, расширение и разные ОС.

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

Метод глобального контекста ЗапуститьПриложение принимает строку команды. Если передать путь к документу, Windows сама подберёт программу по расширению, как при двойном щелчке в проводнике.

Синхронный вызов

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

Путь обёрнут в кавычки не случайно. В строке 1С двойная кавычка внутри литерала пишется дважды, поэтому """" даёт один символ ". Без кавычек путь с пробелом («Договор 15.pdf») разобьётся на команду и аргумент.

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

Асинхронные варианты

В конфигурациях с режимом использования модальности «Не использовать» лучше сразу писать асинхронно. Классический вариант с описанием оповещения:

&НаКлиенте
Процедура ОткрытьСкан(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеЗапуска", ЭтотОбъект);
    НачатьЗапускПриложения(Оповещение, """C:\Сканы\Договор 15.pdf""");
КонецПроцедуры

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

На платформе с номером не ниже 8.3.18 доступен синтаксис Асинх/Ждать, и код читается как синхронный:

&НаКлиенте
Асинх Процедура ОткрытьСкан(Команда)
    КодВозврата = Ждать ЗапуститьПриложениеАсинх("""C:\Сканы\Договор 15.pdf""", , Ложь);
КонецПроцедуры

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

Пользователю часто удобнее увидеть файл в проводнике. На Windows для этого есть ключ /select у explorer.exe:

ЗапуститьПриложение("explorer.exe /select,""" + ПутьКФайлу + """");

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

Жёстко прописанный путь годится для примера, но не для рабочей базы. Обычно путь берут из реквизита или просят пользователя указать файл.

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

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

Что полезно знать про диалог:

  • 📁 Фильтр задаётся парами «описание|маска», пары тоже разделяются вертикальной чертой.
  • 📌 Каталог задаёт стартовую папку, ПолноеИмяФайла — имя, которое подставится в поле.
  • 📚 При МножественныйВыбор = Истина в обработчик придёт массив из нескольких путей.
  • 🛑 Отмена приходит как Неопределено, а не пустой массив. Проверяйте именно это.

Режим РежимДиалогаВыбораФайла.ВыборКаталога возвращает папку, Сохранение — путь для записи. На 8.3.18 и новее вместо Показать можно написать ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх(); внутри Асинх-процедуры.

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

Чтение содержимого: файл на сервере и временное хранилище

В клиент-серверном варианте код на сервере видит диск сервера. Путь C:\Users\buh\Desktop\выписка.xlsx с компьютера бухгалтера там не существует. Правильная схема — передать файл через временное хранилище.

Шаг 1. Передать файл с клиента

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

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

Четвёртый параметр Истина означает интерактивный режим: платформа сама покажет диалог выбора файла.

Шаг 2. Прочитать на сервере

&НаСервере
Процедура ПрочитатьНаСервере(Адрес)
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременного = ПолучитьИмяВременногоФайла("xlsx");
    Данные.Записать(ИмяВременного);

    Таблица = Новый ТабличныйДокумент;
    Таблица.Прочитать(ИмяВременного);
    ВсегоСтрок = Таблица.ВысотаТаблицы;

    Для НомерСтроки = 2 По ВсегоСтрок Цикл
        Дата  = Таблица.Область(НомерСтроки, 1).Текст;
        Сумма = Таблица.Область(НомерСтроки, 3).Текст;
        // обработка строки выписки
    КонецЦикла;

    УдалитьФайлы(ИмяВременного);
КонецПроцедуры

Цикл начинается со второй строки, потому что первая обычно занята заголовками колонок. Временный файл удаляйте сразу: каталог временных файлов сервера быстро разрастается.

Текстовые файлы и кодировка

Для CSV и TXT берите ЧтениеТекста с явной кодировкой. Иначе вместо кириллицы получите набор знаков.

Чтение = Новый ЧтениеТекста(ИмяВременного, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
    Поля = СтрРазделить(Строка, ";");
    // Поля[0] — первая колонка, Поля[1] — вторая
    Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Выгрузки из старых программ под Windows часто приходят в кодировке Windows-1251. Тогда вторым параметром передайте КодировкаТекста.ANSI или строку "windows-1251".

Открываем файлы через COM-объекты и OLE-автоматизацию

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

Excel и Word

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

Для Word идентификатор Word.Application, документ открывается через Word.Documents.Open(ПутьКФайлу). Свойства и методы здесь — это объектная модель Microsoft Office, а не 1С. Их смотрят в документации Office.

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

Shell-объекты Windows

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

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

Второй параметр 1 — обычное окно, третий Ложь — не ждать закрытия программы. Пригодится, если ЗапуститьПриложение запрещён политикой или нужно точнее управлять окном.

Не автоматизируйте Excel и Word на сервере 1С. Служба работает под учётной записью без рабочего стола, Office там зависает на любом диалоговом окне, а Microsoft такой сценарий не поддерживает. Для серверной обработки xlsx используйте ТабличныйДокумент.Прочитать.

Внешние обработки и расширения: открыть файл .epf из кода

Отдельный частый запрос — программно открыть внешнюю обработку из файла, не через меню Файл → Открыть. На сервере обработку сначала подключают, потом открывают её форму на клиенте.

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

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

&НаСервере
Функция ПодключитьНаСервере(Адрес)
    Возврат ВнешниеОбработки.Подключить(Адрес, , Истина);
КонецФункции

Третий параметр Истина у Подключить включает безопасный режим. В нём обработке запрещено то, о чём шла речь выше: создавать COM-объекты, запускать приложения, читать и писать файлы на диске сервера. Если обработка должна работать с файлами, придётся подключать её без безопасного режима. Такое право нужно давать только проверенному коду.

Что ещё влияет на открытие обработок и работу с файлами:

  • 🔐 Права роли: интерактивное открытие внешних обработок и запуск внешних приложений настраиваются в роли. Без них пользователь получит отказ в доступе.
  • 🛡️ Защита от опасных действий: платформа предупреждает пользователя при открытии внешней обработки. Флаг включается в свойствах пользователя в списке пользователей информационной базы.
  • 🧩 Расширения конфигурации : у расширения есть свойство «Безопасный режим». В безопасном режиме код расширения тоже не создаст COMОбъект и не запустит программу.
  • 📦 Профили безопасности кластера: если в типовой конфигурации включены профили безопасности, работа с диском и COM разрешается через запросы разрешений БСП.

Ошибки при открытии файла: перехват и диагностика

Любая операция с файлом может упасть: файл удалён, занят Excel, нет прав на папку. Оборачивайте вызовы в Попытка.

&НаКлиенте
Процедура ОткрытьБезопасно(ПутьКФайлу)
    Попытка
        ЗапуститьПриложение("""" + ПутьКФайлу + """");
    Исключение
        Текст = НСтр("ru = 'Не удалось открыть файл: '") + ОписаниеОшибки();
        ПоказатьПредупреждение(, Текст);
    КонецПопытки;
КонецПроцедуры

На сервере сообщение пользователю бесполезно, если обработка идёт регламентным заданием. Пишите в журнал регистрации: ЗаписьЖурналаРегистрации("Загрузка выписки", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()).

Проверка существования до открытия экономит одно исключение. На клиенте используйте асинхронную форму Файл.НачатьПроверкуСуществования(Оповещение), на сервере допустимо Новый Файл(Путь).Существует().

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

Веб-клиент, терминальный сервер и Linux

Один и тот же код ведёт себя по-разному в зависимости от того, где запущен клиент.

Веб-клиент

Браузер не пускает страницы к диску пользователя. Поэтому:

  1. ЗапуститьПриложение и работа с файлами по пути требуют расширения работы с 1С:Предприятием для браузера. Подключить его можно программно: НачатьПодключениеРасширенияРаботыСФайлами, а установить — НачатьУстановкуРасширенияРаботыСФайлами.
  2. COMОбъект в веб-клиенте не используйте вообще.
  3. Без расширения работают только методы с временным хранилищем: НачатьПомещениеФайла для загрузки и ПолучитьФайл или НачатьПолучениеФайлов для выдачи файла пользователю. Браузер сам предложит открыть или сохранить его.
&НаКлиенте
Процедура ПоказатьФайлПользователю(Адрес)
    ПолучитьФайл(Адрес, "Акт сверки.pdf", Истина);
КонецПроцедуры

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

Тонкий клиент работает на терминальном сервере, значит ЗапуститьПриложение откроет файл там, в сеансе пользователя. Нужная программа должна стоять на терминальном сервере.

Локальный диск пользователя виден из сеанса как \\tsclient\C\ — если в настройках подключения включено перенаправление дисков. Это рабочий приём, когда бухгалтеру нужно взять файл со своего компьютера. Диалог выбора файла по умолчанию тоже показывает диски сервера, а не пользователя.

Linux и macOS

Ассоциации файлов в Linux работают через xdg-open, в macOS — через open. Определите ОС и соберите команду:

&НаКлиенте
Процедура ОткрытьНаЛюбойОС(ПутьКФайлу)
    Инфо = Новый СистемнаяИнформация;
    Тип = Инфо.ТипПлатформы;
    Если Тип = ТипПлатформы.Linux_x86_64 Тогда
        ЗапуститьПриложение("xdg-open """ + ПутьКФайлу + """");
    ИначеЕсли Тип = ТипПлатформы.MacOS_x86_64 Тогда
        ЗапуститьПриложение("open """ + ПутьКФайлу + """");
    Иначе
        ЗапуститьПриложение("""" + ПутьКФайлу + """");
    КонецЕсли;
КонецПроцедуры

Значений перечисления ТипПлатформы больше, чем в примере (32-битные варианты, ARM). Если поддерживаете разные сборки, проверяйте все нужные. Именно поэтому в типовых удобнее вызвать ФайловаяСистемаКлиент.ОткрытьФайл — там это уже сделано.

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

Можно ли открыть файл по ссылке file:// через ПерейтиПоНавигационнойСсылке?
Можно, метод принимает и внешние ссылки. Но поведение зависит от клиента и настроек безопасности браузера, поэтому для локальных файлов надёжнее ЗапуститьПриложение.
Как открыть файл, который хранится в базе, а не на диске?
Получите двоичные данные из реквизита или присоединённого файла, поместите их во временное хранилище и выдайте пользователю через ПолучитьФайл. В БСП для присоединённых файлов есть готовые команды открытия.
Как дождаться, пока пользователь закроет открытый документ?
Передайте ДождатьсяЗавершения = Истина. Для документов это ненадёжно: если программа уже была открыта, процесс завершится сразу и вернёт управление раньше.
Почему файл открывается только для чтения?
Он уже открыт другим пользователем или процессом, чаще всего невидимым EXCEL.EXE после COM-обработки без вызова Quit(). Завершите лишний процесс и закрывайте приложение в коде.
Работает ли ЗапуститьПриложение в регламентном задании?
Формально метод выполняется и на сервере, но запускает программу под учётной записью службы, без окна. Для показа файлов пользователю он там бесполезен.