Разработка и Конфигурация · 9 мин
Как открыть файл из двоичных данных в 1С
Как открыть файл из двоичных данных в 1С: методы ПолучитьИмяВременногоФайла, Записать, НачатьЗапускПриложения. Примеры кода, типичные ошибки и FAQ.
Двоичные данные в 1С встречаются повсюду: вложения писем, файлы, хранящиеся в справочниках, картинки, документы из обмена. Но сам по себе объект «ДвоичныеДанные» — это просто массив байт в памяти, и «открыть» его напрямую нельзя: сначала нужно превратить его обратно в файл на диске, а затем запустить ассоциированное приложение или прочитать содержимое программно.
Типовой сценарий выглядит так: извлечь двоичные данные из хранилища значения или реквизита, записать их во временный файл с правильным расширением, открыть файл пользователю или обработать встроенными средствами платформы. Ошибки чаще всего связаны именно с расширением временного файла: если сохранить PDF как .tmp, система не поймёт, чем его открывать.
Ниже разобраны все этапы: от получения двоичных данных до безопасного удаления временных файлов, с примерами кода для тонкого и веб-клиента.
Откуда берутся двоичные данные и как их получить
Чаще всего двоичные данные хранятся в реквизите типа «ХранилищеЗначения». Чтобы получить их, нужно вызвать метод Получить() у значения хранилища. Например, в типовых конфигурациях файлы присоединены к объектам, а сами данные лежат в регистре сведений или в табличной части.
Другой источник — чтение файла с диска: конструктор Новый ДвоичныеДанные(ПутьКФайлу) загружает файл в память. Также двоичные данные приходят из веб-сервисов, HTTP-ответов и механизмов обмена, где файл передаётся в формате Base64 — тогда сначала потребуется декодирование через Base64Значение().
// Пример: получение двоичных данных из хранилища значения
Запрос = Новый Запрос("ВЫБРАТЬ ДанныеФайла ИЗ РегистрСведений.ФайлыХранилище ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ФайлСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДвоичныеДанные = Выборка.ДанныеФайла.Получить();
КонецЕсли;
Проверьте, что после Получить() переменная действительно содержит значение типа «ДвоичныеДанные», а не Неопределено. Пустое хранилище — частая причина ошибок на следующих шагах, и лучше перехватить её сразу.
Запись двоичных данных во временный файл
Ключевой метод — Записать(ИмяФайла): он сохраняет байты на диск. Имя файла удобно формировать через ПолучитьИмяВременногоФайла(Расширение), которая возвращает уникальный путь во временном каталоге. Именно сюда нужно передать корректное расширение исходного файла — «pdf», «xlsx», «jpg» и т.д.
Расширение = "pdf";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// теперь файл доступен по пути ИмяВременногоФайлаЕсли расширение неизвестно заранее, его нужно хранить отдельно рядом с двоичными данными (например, в реквизите «Расширение» справочника файлов, как это сделано в типовых). Пытаться угадать формат по сигнатуре байтов — ненадёжный путь, оставьте его крайним случаям.
Учтите: ПолучитьИмяВременногоФайла на сервере и на клиенте вернёт разные пути. Если данные получены в серверной процедуре, а открыть файл нужно на клиенте, потребуется передать сами двоичные данные на клиент (например, через адрес временного хранилища) и записать файл уже там.
Как открыть файл пользователю
Когда файл записан на диск клиентского компьютера, его открывают методом НачатьЗапускПриложения() — платформа передаст файл операционной системе, и та запустит ассоциированную программу: Acrobat для PDF, Excel для XLSX, просмотрщик для картинок.
&НаКлиенте
Процедура ОткрытьФайл(Команда)
АдресДанных = ПолучитьАдресДанныхНаСервере(ФайлСсылка);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресДанных);
ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяФайла);
ФайловаяСистемаКлиент.ОткрытьФайл(ИмяФайла);
КонецПроцедуры
В свежих версиях платформы вместо устаревших глобальных вызовов рекомендуется использовать модули БСП: ФайловаяСистемаКлиент.ОткрытьФайл() и ФайловаяСистемаКлиент.ОткрытьПроводник(). Они корректно работают в тонком, толстом и веб-клиенте и не требуют отключения модальности.
- 1Получите двоичные данные из хранилища значения или запроса
- 2Проверьте, что данные не пустые и имеют тип ДвоичныеДанные
- 3Передайте данные на клиент через временное хранилище, если работа шла на сервере
- 4Сформируйте имя через ПолучитьИмяВременногоФайла() с правильным расширением
- 5Запишите данные методом Записать()
- 6Откройте файл через ФайловаяСистемаКлиент.ОткрытьФайл() или НачатьЗапускПриложения()
Программное чтение без открытия приложения
Не всегда файл нужно показывать пользователю — часто достаточно прочитать содержимое. Для текстовых файлов используйте ЧтениеТекста, для XML — ЧтениеXML, для картинок — конструктор Новый Картинка(ДвоичныеДанные), который принимает данные напрямую, без записи на диск.
Табличные документы (MXL) и данные Excel через COM тоже читаются из файла: сначала запись во временный файл, затем ТабличныйДокумент.Прочитать(ИмяФайла). Для ZIP-архивов есть ЧтениеZipФайла, который умеет работать и с потоками в памяти.
Сравнение вариантов
Подходит, когда пользователь должен увидеть или отредактировать файл. Ограничение: нужны права на временный каталог и установленное приложение для формата.
Подходит для автоматической обработки без участия пользователя. Ограничение: работает только с форматами, которые понимает платформа.
Подходит для крупных файлов и передачи между механизмами без диска. Ограничение: сложнее код, не все объекты умеют читать из потока.
Работа в веб-клиенте и на сервере
В веб-клиенте прямой запуск приложений ограничен браузером: файл чаще всего предлагают скачать через ПолучитьФайл() или открывают в новой вкладке, если данные доступны по URL из временного хранилища. Метод НачатьЗапускПриложения в веб-клиенте работает с оговорками и зависит от настроек браузера.
На сервере открывать файл «для просмотра» бессмысленно — у сеанса сервера нет экрана пользователя. Серверная запись во временный файл оправдана только для промежуточной обработки: распаковки, конвертации, печати. Всегда чётко разделяйте, где выполняется код: директивы &НаСервере и &НаКлиенте определяют, чей временный каталог будет использован.
Типичные ошибки и очистка временных файлов
Самая частая ошибка — запись файла без расширения или с неверным расширением: система не находит приложение и показывает диалог «Чем открыть файл». Вторая по частоте — попытка открыть на клиенте файл, записанный на сервере: путь существует, но на другой машине, и возникает ошибка «файл не найден».
Временные файлы накапливаются в каталоге и занимают место, особенно при массовой обработке. После использования удаляйте их через УдалитьФайлы(ИмяФайла) — но только после того, как внешнее приложение закончило работу с файлом, иначе получите ошибку доступа.
Ещё одна ловушка — кодировка при чтении текстовых файлов. Если исходный файл не в UTF-8, укажите кодировку явно: Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.ANSI), иначе кириллица превратится в нечитаемые символы.
Как проверить результат
ТипЗнч возвращает «ДвоичныеДанные», размер больше нуля
Неопределено или размер 0 — хранилище пустое
Файл существует, размер совпадает с размером данных
Файл не создан или имеет нулевой размер
Запускается правильное приложение, содержимое читается
Диалог выбора программы или повреждённое содержимое — неверное расширение или битые данные
FAQ
Можно ли открыть двоичные данные без записи на диск?
Частично да: объект «Картинка» принимает двоичные данные напрямую, а ЧтениеZipФайла и некоторые другие механизмы умеют работать с потоками в памяти. Но для запуска внешнего приложения (PDF, Excel) файл на диске обязателен — операционная система работает только с файловыми путями.
Как узнать расширение файла, если хранятся только двоичные данные?
Надёжного способа нет — поэтому в прикладных решениях расширение хранят отдельным реквизитом рядом с данными. Теоретически можно определить формат по сигнатуре первых байтов (например, PDF начинается с %PDF), но это эвристика, которая не покрывает все форматы.
Почему код работает в файловой базе, но падает в клиент-серверной?
В файловой базе клиент и «сервер» — фактически один процесс на одном компьютере, поэтому пути совпадают. В клиент-серверном режиме серверный временный файл физически находится на сервере. Передавайте данные на клиент через ПоместитьВоВременноеХранилище и записывайте файл заново на клиенте.
Как открыть картинку из двоичных данных прямо в форме 1С?
Создайте реквизит формы типа «Строка» для адреса временного хранилища, поместите туда двоичные данные через ПоместитьВоВременноеХранилище и свяжите реквизит с элементом формы «Поле картинки». Платформа отобразит изображение без записи файла на диск.
Что делать, если файл открывается, но содержимое повреждено?
Проверьте, не проходили ли данные через Base64 или текстовое преобразование: лишнее кодирование/декодирование портит байты. Также убедитесь, что данные не обрезаны при передаче — сравните размер исходных двоичных данных и записанного файла.
Что важно запомнить
Двоичные данные открывают через временный файл: ПолучитьИмяВременногоФайла с правильным расширением, Записать(), затем запуск приложения или программное чтение. Разделяйте серверный и клиентский контексты, проверяйте данные на пустоту, фильтруйте опасные расширения и удаляйте временные файлы после использования.