К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как открыть двоичные данные в 1С

Как открыть двоичные данные в 1С: чтение из файла, хранилища значений и информационной базы. Примеры кода, типичные ошибки и проверка результата.

Двоичные данные в 1С — это универсальный тип, предназначенный для хранения и передачи содержимого любых файлов: картинок, PDF-документов, архивов, XML-файлов и вложений писем. Разработчик сталкивается с ними при загрузке фотографий товаров, обмене с сайтом, отправке печатных форм по почте или интеграции с внешними API. Умение корректно открыть, прочитать и сохранить такие данные — базовый навык для работы с файловыми операциями в платформе.

Главная сложность в том, что двоичные данные нельзя просто «посмотреть» как строку или число. Их нужно либо сохранить во временный файл и открыть внешней программой, либо преобразовать в текст, если внутри лежит текстовое содержимое, либо передать в специализированный объект — например, в картинку или табличный документ. Выбор способа зависит от того, что именно хранится внутри и какая задача решается.

Материал охватывает основные сценарии: получение двоичных данных из файла и из хранилища значений, открытие их пользователю, преобразование в текст и Base64, а также типичные ошибки, которые приводят к битым файлам и потерянным вложениям. Примеры кода приведены для управляемых форм с учётом тонкого клиента, где файловые операции выполняются асинхронно.

Что такое двоичные данные в платформе 1С

Тип «ДвоичныеДанные» (BinaryData) представляет собой последовательность байт без привязки к какой-либо кодировке или формату. Платформа не знает, что внутри — изображение, архив или документ, поэтому интерпретация содержимого полностью ложится на разработчика. Получить объект этого типа можно несколькими способами: конструктором Новый ДвоичныеДанные(ИмяФайла), извлечением из хранилища значения, чтением из потока или получением через HTTP-запрос.

Важно понимать, что двоичные данные нельзя редактировать «по месту» — объект неизменяем. Любая модификация означает создание нового объекта. Для работы с большими файлами это критично: данные целиком загружаются в оперативную память, поэтому при обмене файлами в сотни мегабайт лучше использовать потоки (ФайловыйПоток, ПотокВПамяти), которые появились в платформе 8.3.15 и новее.

Как получить двоичные данные из файла

Самый частый сценарий — прочитать файл с диска в переменную. На сервере или в толстом клиенте достаточно одной строки: ДД = Новый ДвоичныеДанные("C:\Temp\document.pdf");. После этого переменная содержит всё содержимое файла, и её можно сохранить в реквизит с типом «ХранилищеЗначения», передать в веб-сервис или отправить по HTTP.

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

bsl
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    // Сохраняем в реквизит типа ХранилищеЗначения
    Объект.ФайлДанные = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
КонецПроцедуры

Как открыть двоичные данные пользователю

Когда данные уже лежат в базе и их нужно показать пользователю, стандартный приём — записать их во временный файл и запустить ассоциированное приложение операционной системы. Метод Записать(ИмяФайла) сохраняет байты на диск, после чего файл открывается. Расширение временного файла должно соответствовать реальному формату: если в базе хранится PDF, а вы записали файл с расширением .tmp, система не поймёт, чем его открывать.

Поэтому рядом с двоичными данными в базе почти всегда хранят имя файла или хотя бы расширение. В типовых конфигурациях для этого существует подсистема «Работа с файлами» (присоединённые файлы), где расширение — отдельный реквизит. Если вы проектируете собственное хранилище вложений, добавьте поля «ИмяФайла» и «Расширение» — это избавит от угадывания формата при открытии.

Порядок открытия файла из базы
  1. 1
    Извлеките двоичные данные: ДД = Хранилище.Получить()
  2. 2
    Сформируйте имя: ИмяФайла = ПолучитьИмяВременногоФайла(Расширение)
  3. 3
    Запишите данные: ДД.Записать(ИмяФайла)
  4. 4
    Откройте файл: НачатьЗапускПриложения(, ИмяФайла) на клиенте
  5. 5
    Проверьте, что файл открылся в нужной программе и не повреждён

Открытие картинки без временного файла

Изображения — особый случай: их не обязательно сохранять на диск. Достаточно поместить двоичные данные во временное хранилище вызовом ПоместитьВоВременноеХранилище(ДД, УникальныйИдентификаторФормы) и назначить полученный адрес реквизиту формы, связанному с полем вида «Поле картинки». Платформа сама отобразит изображение. Это быстрее, безопаснее и не оставляет мусорных файлов в каталоге временных файлов.

Как извлечь текст из двоичных данных

Если внутри двоичных данных лежит текст — XML, JSON, CSV или обычный txt, — его можно прочитать напрямую. Способ зависит от версии платформы. В современных версиях удобнее объект ЧтениеТекста, который умеет работать с потоком: данные передаются через ПотокВПамяти или сохраняются во временный файл, после чего читаются с указанием кодировки. Альтернатива — функции работы со строками: ПолучитьСтрокуИзДвоичныхДанных(ДД, Кодировка) доступна в глобальном контексте последних версий платформы.

Ключевой момент — кодировка. Файлы из внешних систем часто приходят в UTF-8, но встречаются UTF-16, windows-1251 и варианты с BOM. Если кодировку указать неверно, вместо текста получите «кракозябры» или ошибку преобразования. Когда кодировка источника неизвестна, надёжнее сначала проверить наличие BOM-маркера, а при его отсутствии пробовать UTF-8 как наиболее распространённый вариант.

Base64: передача двоичных данных через веб-сервисы

При обмене через HTTP и веб-сервисы двоичные данные передают в текстовом виде — кодировке Base64. Платформа предоставляет пару функций: Base64Строка(ДД) для кодирования и Base64Значение(Строка) для обратного преобразования. В последних версиях платформы добавлены также ПолучитьBase64СтрокуИзДвоичныхДанных и ПолучитьДвоичныеДанныеИзBase64Строки — они работают быстрее и рекомендуются для новых разработок.

Учтите, что Base64 увеличивает объём данных примерно на треть. Для больших вложений это заметно влияет на трафик и время обмена. Если передаёте файлы размером в десятки мегабайт, рассмотрите передачу через HTTP-сервисы с двоичным телом ответа — метод ПолучитьТелоКакДвоичныеДанные() объекта HTTPОтвет позволяет принять файл без промежуточного кодирования.

Типичные ошибки
01
Запись файла без расширения — система не знает, какой программой его открыть
02
Неверная кодировка при чтении текста — вместо содержимого появляются нечитаемые символы
03
Хранение двоичных данных в реквизите строкового типа — данные портятся при преобразовании
04
Чтение огромных файлов целиком в память вместо потоков — падение сеанса по нехватке памяти
05
Использование модальных методов ПолучитьФайл в тонком клиенте — код не работает в веб-клиенте

Хранение двоичных данных в информационной базе

Для постоянного хранения файлов в базе используется реквизит типа «ХранилищеЗначения». Двоичные данные упаковываются конструктором Новый ХранилищеЗначения(ДД, Новый СжатиеДанных(9)) — сжатие уменьшает объём базы, особенно для текстовых и офисных документов. Извлечение выполняется методом Получить(), который возвращает исходный объект двоичных данных.

Хранение файлов непосредственно в базе имеет предел разумности: при большом количестве вложений база раздувается, замедляются резервное копирование и обновление. Типовые конфигурации решают это хранением файлов в томах на диске — в базе остаются только ссылки. Для самописных решений с интенсивным документооборотом стоит сразу закладывать аналогичный механизм.

Проверка результата и диагностика проблем

После открытия или сохранения файла убедитесь, что данные не повреждены. Простейшая проверка — сравнение размера: метод Размер() у объекта двоичных данных должен совпадать с размером исходного файла. Для более строгого контроля при обмене используют хеш-суммы — объект ХешированиеДанных с алгоритмом MD5 или SHA позволяет сверить контрольную сумму до и после передачи.

Характерный признак испорченных данных — файл открывается, но программа сообщает о повреждении формата. Чаще всего причина в том, что данные где-то по пути прошли через строковое преобразование с неверной кодировкой: несколько байт в начале или конце файла искажаются, и формат перестаёт распознаваться. При такой проблеме ищите в коде все места, где двоичные данные присваиваются строковым переменным или конкатенируются со строками.

Контрольные точки

Как проверить результат

Размер данных
Норма

ДД.Размер() равен размеру исходного файла

Тревожный признак

Размер отличается — данные усечены или дополнены

Открытие файла
Норма

Файл открывается штатной программой без предупреждений

Тревожный признак

Программа сообщает о повреждении формата

Текстовое содержимое
Норма

Текст читается, кириллица отображается корректно

Тревожный признак

Кракозябры — неверно указана кодировка

Хеш-сумма
Норма

Хеш до и после передачи совпадает

Тревожный признак

Хеши различаются — данные изменились в пути

Итог

Что важно запомнить

Двоичные данные открывают через временный файл с правильным расширением, картинки — через временное хранилище, текст — через ЧтениеТекста с корректной кодировкой. Для обмена используйте Base64 или двоичное тело HTTP-ответа, а для больших файлов — потоки и хранение вне базы.

Часто задаваемые вопросы

Как открыть двоичные данные, если неизвестен формат файла?

Посмотрите первые байты данных — сигнатуру файла. Например, PDF начинается с символов %PDF, ZIP-архив — с PK, изображения JPEG — со служебных байт FF D8. Сохраните данные во временный файл и откройте его шестнадцатеричным просмотрщиком, чтобы определить сигнатуру, затем назначьте соответствующее расширение.

Можно ли хранить двоичные данные в реквизите строкового типа?

Технически через Base64 — да, напрямую — нет. Прямое присваивание двоичных данных строке приведёт к ошибке или порче содержимого. Если требуется строковое представление, кодируйте данные функцией Base64Строка, а при чтении декодируйте обратно через Base64Значение.

Почему файл из базы открывается пустым?

Типичные причины: в хранилище значений записан пустой объект, данные не были извлечены методом Получить() перед записью, либо запись во временный файл выполняется на сервере, а открытие — на клиенте, где этого файла нет. Проверьте размер данных через ДД.Размер() сразу после извлечения из базы.

Как передать двоичные данные с клиента на сервер в тонком клиенте?

Используйте временное хранилище: на клиенте вызовите НачатьПомещениеФайла или ПоместитьВоВременноеХранилище, получите адрес, передайте его в серверную процедуру и извлеките данные вызовом ПолучитьИзВременногоХранилища. Прямая передача объекта ДвоичныеДанные параметром между клиентом и сервером также поддерживается в современных версиях платформы.

Что делать с файлами большого размера, чтобы не было ошибки памяти?

Используйте файловые потоки вместо загрузки целиком: объекты ФайловыйПоток и ЧтениеДанных позволяют обрабатывать файл частями. Дополнительно рассмотрите хранение больших вложений вне базы — в сетевом каталоге или объектном хранилище — с сохранением в базе только пути к файлу.

Работает ли ЗапуститьПриложение в веб-клиенте?

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