Разработка и Конфигурация · 11 мин
Как открыть двоичные данные в 1С
Как открыть двоичные данные в 1С: чтение из файла, хранилища значений и информационной базы. Примеры кода, типичные ошибки и проверка результата.
Двоичные данные в 1С — это универсальный тип, предназначенный для хранения и передачи содержимого любых файлов: картинок, PDF-документов, архивов, XML-файлов и вложений писем. Разработчик сталкивается с ними при загрузке фотографий товаров, обмене с сайтом, отправке печатных форм по почте или интеграции с внешними API. Умение корректно открыть, прочитать и сохранить такие данные — базовый навык для работы с файловыми операциями в платформе.
Главная сложность в том, что двоичные данные нельзя просто «посмотреть» как строку или число. Их нужно либо сохранить во временный файл и открыть внешней программой, либо преобразовать в текст, если внутри лежит текстовое содержимое, либо передать в специализированный объект — например, в картинку или табличный документ. Выбор способа зависит от того, что именно хранится внутри и какая задача решается.
Материал охватывает основные сценарии: получение двоичных данных из файла и из хранилища значений, открытие их пользователю, преобразование в текст и Base64, а также типичные ошибки, которые приводят к битым файлам и потерянным вложениям. Примеры кода приведены для управляемых форм с учётом тонкого клиента, где файловые операции выполняются асинхронно.
Что такое двоичные данные в платформе 1С
Тип «ДвоичныеДанные» (BinaryData) представляет собой последовательность байт без привязки к какой-либо кодировке или формату. Платформа не знает, что внутри — изображение, архив или документ, поэтому интерпретация содержимого полностью ложится на разработчика. Получить объект этого типа можно несколькими способами: конструктором Новый ДвоичныеДанные(ИмяФайла), извлечением из хранилища значения, чтением из потока или получением через HTTP-запрос.
Важно понимать, что двоичные данные нельзя редактировать «по месту» — объект неизменяем. Любая модификация означает создание нового объекта. Для работы с большими файлами это критично: данные целиком загружаются в оперативную память, поэтому при обмене файлами в сотни мегабайт лучше использовать потоки (ФайловыйПоток, ПотокВПамяти), которые появились в платформе 8.3.15 и новее.
Как получить двоичные данные из файла
Самый частый сценарий — прочитать файл с диска в переменную. На сервере или в толстом клиенте достаточно одной строки: ДД = Новый ДвоичныеДанные("C:\Temp\document.pdf");. После этого переменная содержит всё содержимое файла, и её можно сохранить в реквизит с типом «ХранилищеЗначения», передать в веб-сервис или отправить по HTTP.
В тонком и веб-клиенте прямой путь к файлу недоступен из соображений безопасности. Файл сначала помещают во временное хранилище интерактивно — методом НачатьПомещениеФайла с диалогом выбора, а на сервере извлекают вызовом ПолучитьИзВременногоХранилища(Адрес), который вернёт именно двоичные данные. Этот двухшагный механизм — стандартный паттерн для всех загрузок файлов в управляемом приложении.
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Сохраняем в реквизит типа ХранилищеЗначения
Объект.ФайлДанные = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
КонецПроцедурыКак открыть двоичные данные пользователю
Когда данные уже лежат в базе и их нужно показать пользователю, стандартный приём — записать их во временный файл и запустить ассоциированное приложение операционной системы. Метод Записать(ИмяФайла) сохраняет байты на диск, после чего файл открывается. Расширение временного файла должно соответствовать реальному формату: если в базе хранится PDF, а вы записали файл с расширением .tmp, система не поймёт, чем его открывать.
Поэтому рядом с двоичными данными в базе почти всегда хранят имя файла или хотя бы расширение. В типовых конфигурациях для этого существует подсистема «Работа с файлами» (присоединённые файлы), где расширение — отдельный реквизит. Если вы проектируете собственное хранилище вложений, добавьте поля «ИмяФайла» и «Расширение» — это избавит от угадывания формата при открытии.
- 1Извлеките двоичные данные: ДД = Хранилище.Получить()
- 2Сформируйте имя: ИмяФайла = ПолучитьИмяВременногоФайла(Расширение)
- 3Запишите данные: ДД.Записать(ИмяФайла)
- 4Откройте файл: НачатьЗапускПриложения(, ИмяФайла) на клиенте
- 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Ответ позволяет принять файл без промежуточного кодирования.
Хранение двоичных данных в информационной базе
Для постоянного хранения файлов в базе используется реквизит типа «ХранилищеЗначения». Двоичные данные упаковываются конструктором Новый ХранилищеЗначения(ДД, Новый СжатиеДанных(9)) — сжатие уменьшает объём базы, особенно для текстовых и офисных документов. Извлечение выполняется методом Получить(), который возвращает исходный объект двоичных данных.
Хранение файлов непосредственно в базе имеет предел разумности: при большом количестве вложений база раздувается, замедляются резервное копирование и обновление. Типовые конфигурации решают это хранением файлов в томах на диске — в базе остаются только ссылки. Для самописных решений с интенсивным документооборотом стоит сразу закладывать аналогичный механизм.
Проверка результата и диагностика проблем
После открытия или сохранения файла убедитесь, что данные не повреждены. Простейшая проверка — сравнение размера: метод Размер() у объекта двоичных данных должен совпадать с размером исходного файла. Для более строгого контроля при обмене используют хеш-суммы — объект ХешированиеДанных с алгоритмом MD5 или SHA позволяет сверить контрольную сумму до и после передачи.
Характерный признак испорченных данных — файл открывается, но программа сообщает о повреждении формата. Чаще всего причина в том, что данные где-то по пути прошли через строковое преобразование с неверной кодировкой: несколько байт в начале или конце файла искажаются, и формат перестаёт распознаваться. При такой проблеме ищите в коде все места, где двоичные данные присваиваются строковым переменным или конкатенируются со строками.
Как проверить результат
ДД.Размер() равен размеру исходного файла
Размер отличается — данные усечены или дополнены
Файл открывается штатной программой без предупреждений
Программа сообщает о повреждении формата
Текст читается, кириллица отображается корректно
Кракозябры — неверно указана кодировка
Хеш до и после передачи совпадает
Хеши различаются — данные изменились в пути
Что важно запомнить
Двоичные данные открывают через временный файл с правильным расширением, картинки — через временное хранилище, текст — через ЧтениеТекста с корректной кодировкой. Для обмена используйте Base64 или двоичное тело HTTP-ответа, а для больших файлов — потоки и хранение вне базы.
Часто задаваемые вопросы
Как открыть двоичные данные, если неизвестен формат файла?
Посмотрите первые байты данных — сигнатуру файла. Например, PDF начинается с символов %PDF, ZIP-архив — с PK, изображения JPEG — со служебных байт FF D8. Сохраните данные во временный файл и откройте его шестнадцатеричным просмотрщиком, чтобы определить сигнатуру, затем назначьте соответствующее расширение.
Можно ли хранить двоичные данные в реквизите строкового типа?
Технически через Base64 — да, напрямую — нет. Прямое присваивание двоичных данных строке приведёт к ошибке или порче содержимого. Если требуется строковое представление, кодируйте данные функцией Base64Строка, а при чтении декодируйте обратно через Base64Значение.
Почему файл из базы открывается пустым?
Типичные причины: в хранилище значений записан пустой объект, данные не были извлечены методом Получить() перед записью, либо запись во временный файл выполняется на сервере, а открытие — на клиенте, где этого файла нет. Проверьте размер данных через ДД.Размер() сразу после извлечения из базы.
Как передать двоичные данные с клиента на сервер в тонком клиенте?
Используйте временное хранилище: на клиенте вызовите НачатьПомещениеФайла или ПоместитьВоВременноеХранилище, получите адрес, передайте его в серверную процедуру и извлеките данные вызовом ПолучитьИзВременногоХранилища. Прямая передача объекта ДвоичныеДанные параметром между клиентом и сервером также поддерживается в современных версиях платформы.
Что делать с файлами большого размера, чтобы не было ошибки памяти?
Используйте файловые потоки вместо загрузки целиком: объекты ФайловыйПоток и ЧтениеДанных позволяют обрабатывать файл частями. Дополнительно рассмотрите хранение больших вложений вне базы — в сетевом каталоге или объектном хранилище — с сохранением в базе только пути к файлу.
Работает ли ЗапуститьПриложение в веб-клиенте?
В веб-клиенте запуск локальных приложений ограничен настройками браузера и расширения для работы с файлами. Надёжный вариант для веб-клиента — отдать файл пользователю через ПолучитьФайл с сохранением на диск, после чего пользователь открывает его самостоятельно, либо показать содержимое прямо в форме, если формат это позволяет.