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

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

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

Как посмотреть двоичные данные в 1С: чтение файлов, картинок и ХранилищаЗначения, вывод в hex и Base64, работа через встроенный язык и внешние инструменты.

Двоичные данные в 1С встречаются повсюду: вложения в справочниках, картинки товаров, подписанные документы, файлы обмена, настройки в хранилище значений. Платформа не даёт готового «просмотрщика байтов», поэтому задача «посмотреть, что лежит внутри» решается разными способами в зависимости от того, где данные хранятся и что именно нужно узнать — тип файла, содержимое, структуру или просто размер.

Основной объект для работы с бинарным содержимым во встроенном языке — ДвоичныеДанные. Его можно получить из файла на диске, из реквизита типа ХранилищеЗначения, из временного хранилища или из строки Base64. Дальше данные либо выгружаются во временный файл и открываются подходящей программой, либо разбираются программно через ПотокДанных и ЧтениеДанных.

Выбор способа зависит от цели. Если нужно просто увидеть картинку или PDF — достаточно выгрузить файл и открыть его. Если нужно понять, что за файл лежит в базе без расширения, — читают первые байты (сигнатуру). Если требуется проанализировать структуру, например заголовок файла обмена, — используют потоковое чтение или вывод в шестнадцатеричном виде.

Где в 1С хранятся двоичные данные

Прежде чем смотреть содержимое, нужно понять, где оно физически находится. Самый распространённый вариант — реквизит объекта с типом ХранилищеЗначения. Внутри него может лежать и ДвоичныеДанные, и Картинка, и произвольный сериализованный объект. Второй источник — присоединённые файлы в типовых конфигурациях: в БСП они хранятся либо в информационной базе (в таблицах присоединённых файлов), либо в томах на диске, и путь к ним определяется настройками хранения файлов.

Отдельный случай — временное хранилище. При передаче файла с клиента на сервер (например, через НачатьПомещениеФайла) данные попадают во временное хранилище и доступны по адресу вида e1cib/tempstorage/.... Наконец, двоичные данные могут приходить извне: из HTTP-сервисов, веб-сервисов, механизмов обмена — тогда они обычно уже представлены объектом ДвоичныеДанные или строкой Base64.

Как выгрузить данные в файл и открыть внешней программой

Это самый практичный способ, когда нужно именно посмотреть содержимое: картинку, PDF, архив, документ Word. Идея проста — получить объект ДвоичныеДанные и записать его на диск с правильным расширением, после чего файл открывается ассоциированной программой.

Если данные лежат в реквизите типа ХранилищеЗначения, сначала вызывают метод Получить(), который возвращает упакованное значение. Если внутри оказались именно ДвоичныеДанные, у объекта есть метод Записать(ИмяФайла). Для данных из временного хранилища используют ПолучитьИзВременногоХранилища(Адрес) — результат тот же объект ДвоичныеДанные.

bsl
Значение = Объект.ДанныеФайла.Получить(); // ХранилищеЗначения
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
    ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
    Значение.Записать(ИмяФайла);
    ЗапуститьПриложение(ИмяФайла); // открыть на клиенте
КонецЕсли;

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

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

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

Частая ситуация: в базе лежит файл без расширения или с неверным расширением, и непонятно, чем его открывать. Решение — прочитать первые байты и сравнить их с известными сигнатурами. Почти все популярные форматы начинаются с характерной последовательности: PDF — со строки %PDF, PNG — с байтов 89 50 4E 47, JPEG — с FF D8 FF, ZIP (а значит, и DOCX/XLSX) — с 50 4B 03 04.

Для чтения отдельных байтов используют объект ЧтениеДанных, создаваемый конструктором Новый ЧтениеДанных(ДвоичныеДанные). Метод ПрочитатьЦелое32() или чтение в буфер через ПрочитатьВБуферДвоичныхДанных() позволяют получить первые байты, после чего их можно сравнить с сигнатурами или вывести в hex для ручного анализа.

Для текстовой проверки достаточно преобразовать начало данных в строку: если первые байты читаются как осмысленный текст (например, <?xml или PK), формат угадывается сразу. Для XML и JSON проще сразу попробовать прочитать данные как текст через ПолучитьСтрокуИзДвоичныхДанных() или записать в файл и открыть блокнотом.

25 50 44 46 (%PDF)PDF-документ

Открывается любой читалкой PDF

89 50 4E 47PNG-изображение

Открывается просмотрщиком картинок

FF D8 FFJPEG-изображение

Открывается просмотрщиком картинок

50 4B 03 04 (PK)ZIP-архив или DOCX/XLSX

Переименуйте в .zip и посмотрите состав

D0 CF 11 E0Старый OLE-формат (XLS, DOC)

Открывается офисным пакетом

Просмотр через Base64 и шестнадцатеричный дамп

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

Обратное преобразование выполняет Base64Значение(Строка) — так удобно переносить бинарные данные через XML, JSON и HTTP, где чистые байты передавать нельзя. Учтите, что Base64 увеличивает объём примерно на треть, поэтому для больших файлов выводить строку целиком в окно сообщений бессмысленно — оно обрежется и будет нечитаемым.

Для классического hex-дампа в платформе нет готовой функции, но его несложно получить: прочитать данные через ЧтениеДанных в БуферДвоичныхДанных и вывести каждый байт функцией ЦелЧислоВШестнадцатеричнуюСтроку() или через форматирование. На практике чаще поступают проще — выгружают файл и открывают его в любом hex-редакторе (например, HxD или Far с плагином просмотра), где видны и байты, и текстовое представление одновременно.

Работа с потоками и большими файлами

Загружать файл целиком в память объекта ДвоичныеДанные приемлемо для небольших вложений, но для файлов в сотни мегабайт это рискованно: можно исчерпать память сервера или рабочего процесса. Для таких случаев платформа предоставляет потоковые объекты: ФайловыйПоток, ПотокВПамяти, а также ЧтениеДанных и ЗаписьДанных поверх них.

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

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

Типовые инструменты и готовые обработки

В конфигурациях на БСП искать вложения вручную через запросы не нужно: присоединённые файлы открываются прямо из карточки объекта двойным щелчком, а программно данные получают функцией РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл). Это избавляет от необходимости разбираться, где физически лежит файл — в базе или в томе.

Для разработчика полезны универсальные внешние обработки «консоль кода» и «редактор хранилища значений», которые позволяют выбрать объект базы, извлечь значение реквизита и сразу сохранить его в файл. Такие инструменты есть в открытых наборах для разработчиков и в типовой обработке «Инструменты разработчика» для управляемых форм. Они особенно удобны, когда нужно быстро посмотреть данные в чужой базе без написания кода.

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

Типичные ошибки
01
Вызов Записать() на сервере и ожидание, что файл появится у пользователя: файл пишется на диск сервера, клиент его не видит
02
Открытие ХранилищеЗначения без проверки типа результата Получить(): внутри может быть не ДвоичныеДанные, а Картинка, структура или Неопределено — код падает с ошибкой
03
Вывод Base64 большого файла в Сообщить(): текст обрезается, и скопировать его целиком невозможно
04
Загрузка большого файла целиком в ДвоичныеДанные вместо потокового чтения: рабочий процесс сервера может упасть по памяти
05
Выгрузка файла с неверным расширением: программа-просмотрщик отказывается открывать корректный файл, и создаётся ложное впечатление о битых данных

Как проверить результат и что делать при проблемах

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

Если Получить() хранилища значения вернул Неопределено, данные в базе отсутствуют — реквизит пуст, и искать проблему нужно не в просмотре, а в механизме записи. Если вернулся объект неожиданного типа (например, Картинка), у него есть собственный метод ПолучитьДвоичныеДанные() или Записать() — работайте уже с ним.

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

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

Размер выгруженного файла
Норма

Совпадает с ДвоичныеДанные.Размер()

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

Файл меньше — данные обрезаны при передаче

Первые байты файла
Норма

Соответствуют сигнатуре ожидаемого формата

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

Мусор или HTML с текстом ошибки — в базе лежит не то, что ожидалось

Открытие целевой программой
Норма

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

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

Ошибка формата — проверьте расширение и сигнатуру

Тип значения из ХранилищеЗначения
Норма

ДвоичныеДанные или Картинка

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

Неопределено — реквизит пуст

Когда данные приходят из обмена и выглядят как набор случайных символов, проверьте кодировку: текст в UTF-8, прочитанный как ANSI, даёт характерные «кракозябры». Для таких случаев данные записывают в файл и открывают редактором с ручным выбором кодировки либо читают через ЧтениеТекста с явным указанием КодировкаТекста.UTF8.

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

Можно ли посмотреть двоичные данные прямо в конфигураторе?

Готового просмотрщика байтов в конфигураторе нет. Можно открыть объект через табло или консоль запросов, но содержимое реквизита ХранилищеЗначения отобразится только как строка вида «Хранилище значения». Реально посмотреть данные получится только программно: извлечь значение и выгрузить в файл или преобразовать в Base64.

Чем отличаются ДвоичныеДанные от ХранилищаЗначения?

ДвоичныеДанные — это сами байты. ХранилищеЗначения — контейнер-обёртка для хранения в реквизите базы произвольного значения: внутри может быть ДвоичныеДанные, Картинка, таблица значений или что угодно сериализуемое. Из хранилища значение извлекают методом Получить().

Как посмотреть картинку, хранящуюся в базе?

Если реквизит имеет тип ХранилищеЗначения с картинкой, вызовите Получить() — вернётся объект Картинка. На форме её можно показать через реквизит типа Картинка или адрес временного хранилища; для выгрузки на диск используйте метод Записать() объекта Картинка, указав имя файла с расширением png или jpg.

Как прочитать двоичные данные из HTTP-ответа или веб-сервиса?

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

Что делать, если файл выгрузился, но не открывается?

Проверьте три вещи: совпадает ли размер файла с размером исходных данных, соответствует ли расширение реальной сигнатуре первых байт и не лежит ли в базе вместо файла текст ошибки (например, HTML-страница от веб-сервиса). Откройте файл в hex-редакторе — первые байты сразу покажут, что внутри на самом деле.

Как сравнить два набора двоичных данных без выгрузки в файлы?

Используйте объект ХешированиеДанных с алгоритмом SHA256: вычислите хеш каждого набора и сравните результаты. Совпадение хешей означает идентичность данных. Побайтовое сравнение через ЧтениеДанных тоже возможно, но медленнее и требует больше кода.

Итог

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

Двоичные данные в 1С извлекают из ХранилищаЗначения методом Получить() или из временного хранилища, затем либо записывают в файл и открывают внешней программой, либо анализируют на месте через Base64, hex и ЧтениеДанных. Тип неизвестного файла определяют по сигнатуре первых байт, большие файлы читают потоками, а результат проверяют сравнением размеров и открытием целевой программой.