Открытие файлов из кода 1С:Предприятия 8.3 на клиенте, сервере и в веб-клиенте
Содержание
Чтобы программно открыть файл в 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С:Предприятием для браузера. Подключить его можно программно:НачатьПодключениеРасширенияРаботыСФайлами, а установить —НачатьУстановкуРасширенияРаботыСФайлами.COMОбъектв веб-клиенте не используйте вообще.- Без расширения работают только методы с временным хранилищем:
НачатьПомещениеФайладля загрузки иПолучитьФайлилиНачатьПолучениеФайловдля выдачи файла пользователю. Браузер сам предложит открыть или сохранить его.
&НаКлиенте
Процедура ПоказатьФайлПользователю(Адрес)
ПолучитьФайл(Адрес, "Акт сверки.pdf", Истина);
КонецПроцедуры
Терминальный сервер (RDP)
Тонкий клиент работает
на терминальном сервере, значит ЗапуститьПриложение откроет файл там, в сеансе пользователя. Нужная программа должна стоять на терминальном сервере.
Локальный диск пользователя виден из сеанса как \\tsclient\C\ — если в настройках подключения включено перенаправление дисков. Это рабочий приём, когда бухгалтеру нужно взять файл со своего компьютера. Диалог выбора файла по умолчанию тоже показывает диски сервера, а не пользователя.
Linux и macOS
Ассоциации файлов в Linux работают через xdg-open, в macOS — через open. Определите ОС и соберите команду:
&НаКлиенте
Процедура ОткрытьНаЛюбойОС(ПутьКФайлу)
Инфо = Новый СистемнаяИнформация;
Тип = Инфо.ТипПлатформы;
Если Тип = ТипПлатформы.Linux_x86_64 Тогда
ЗапуститьПриложение("xdg-open """ + ПутьКФайлу + """");
ИначеЕсли Тип = ТипПлатформы.MacOS_x86_64 Тогда
ЗапуститьПриложение("open """ + ПутьКФайлу + """");
Иначе
ЗапуститьПриложение("""" + ПутьКФайлу + """");
КонецЕсли;
КонецПроцедуры
Значений перечисления ТипПлатформы больше, чем в примере (32-битные варианты, ARM). Если поддерживаете разные сборки, проверяйте все нужные. Именно поэтому в типовых удобнее вызвать ФайловаяСистемаКлиент.ОткрытьФайл — там это уже сделано.