Разработка и Конфигурация · 13 мин
Как посмотреть двоичные данные в 1С
Как посмотреть двоичные данные в 1С: чтение файлов, картинок и ХранилищаЗначения, вывод в hex и Base64, работа через встроенный язык и внешние инструменты.
Двоичные данные в 1С встречаются повсюду: вложения в справочниках, картинки товаров, подписанные документы, файлы обмена, настройки в хранилище значений. Платформа не даёт готового «просмотрщика байтов», поэтому задача «посмотреть, что лежит внутри» решается разными способами в зависимости от того, где данные хранятся и что именно нужно узнать — тип файла, содержимое, структуру или просто размер.
Основной объект для работы с бинарным содержимым во встроенном языке — ДвоичныеДанные. Его можно получить из файла на диске, из реквизита типа ХранилищеЗначения, из временного хранилища или из строки Base64. Дальше данные либо выгружаются во временный файл и открываются подходящей программой, либо разбираются программно через ПотокДанных и ЧтениеДанных.
Выбор способа зависит от цели. Если нужно просто увидеть картинку или PDF — достаточно выгрузить файл и открыть его. Если нужно понять, что за файл лежит в базе без расширения, — читают первые байты (сигнатуру). Если требуется проанализировать структуру, например заголовок файла обмена, — используют потоковое чтение или вывод в шестнадцатеричном виде.
Где в 1С хранятся двоичные данные
Прежде чем смотреть содержимое, нужно понять, где оно физически находится. Самый распространённый вариант — реквизит объекта с типом ХранилищеЗначения. Внутри него может лежать и ДвоичныеДанные, и Картинка, и произвольный сериализованный объект. Второй источник — присоединённые файлы в типовых конфигурациях: в БСП они хранятся либо в информационной базе (в таблицах присоединённых файлов), либо в томах на диске, и путь к ним определяется настройками хранения файлов.
Отдельный случай — временное хранилище. При передаче файла с клиента на сервер (например, через НачатьПомещениеФайла) данные попадают во временное хранилище и доступны по адресу вида e1cib/tempstorage/.... Наконец, двоичные данные могут приходить извне: из HTTP-сервисов, веб-сервисов, механизмов обмена — тогда они обычно уже представлены объектом ДвоичныеДанные или строкой Base64.
Как выгрузить данные в файл и открыть внешней программой
Это самый практичный способ, когда нужно именно посмотреть содержимое: картинку, PDF, архив, документ Word. Идея проста — получить объект ДвоичныеДанные и записать его на диск с правильным расширением, после чего файл открывается ассоциированной программой.
Если данные лежат в реквизите типа ХранилищеЗначения, сначала вызывают метод Получить(), который возвращает упакованное значение. Если внутри оказались именно ДвоичныеДанные, у объекта есть метод Записать(ИмяФайла). Для данных из временного хранилища используют ПолучитьИзВременногоХранилища(Адрес) — результат тот же объект ДвоичныеДанные.
Значение = Объект.ДанныеФайла.Получить(); // ХранилищеЗначения
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
Значение.Записать(ИмяФайла);
ЗапуститьПриложение(ИмяФайла); // открыть на клиенте
КонецЕсли;Важный нюанс: ЗапуститьПриложение() и работа с файловой системой доступны только на клиенте, а в тонком и веб-клиенте требуется расширение работы с файлами. На сервере файл можно записать только на диск сервера — пользователь его не увидит. Поэтому типовой сценарий такой: на сервере данные помещаются во временное хранилище, на клиенте извлекаются через ПолучитьИзВременногоХранилища и сохраняются локально.
- 1Определите, где лежат данные: реквизит ХранилищеЗначения, присоединённый файл или временное хранилище
- 2Получите объект ДвоичныеДанные: через Получить() для хранилища значения или ПолучитьИзВременногоХранилища()
- 3Сформируйте имя временного файла с правильным расширением через ПолучитьИмяВременногоФайла()
- 4Запишите данные методом Записать() и откройте файл внешней программой
- 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 проще сразу попробовать прочитать данные как текст через ПолучитьСтрокуИзДвоичныхДанных() или записать в файл и открыть блокнотом.
Открывается любой читалкой PDF
Открывается просмотрщиком картинок
Открывается просмотрщиком картинок
Переименуйте в .zip и посмотрите состав
Открывается офисным пакетом
Просмотр через Base64 и шестнадцатеричный дамп
Когда выгружать файл неудобно или невозможно (например, работа идёт только на сервере, а посмотреть нужно быстро), данные преобразуют в текст. Стандартный способ — функция Base64Строка(ДвоичныеДанные). Полученную строку можно вывести в сообщение, записать в текстовый файл или вставить в любой онлайн-декодер Base64, который покажет и текстовое содержимое, и позволит скачать исходный файл.
Обратное преобразование выполняет Base64Значение(Строка) — так удобно переносить бинарные данные через XML, JSON и HTTP, где чистые байты передавать нельзя. Учтите, что Base64 увеличивает объём примерно на треть, поэтому для больших файлов выводить строку целиком в окно сообщений бессмысленно — оно обрежется и будет нечитаемым.
Для классического hex-дампа в платформе нет готовой функции, но его несложно получить: прочитать данные через ЧтениеДанных в БуферДвоичныхДанных и вывести каждый байт функцией ЦелЧислоВШестнадцатеричнуюСтроку() или через форматирование. На практике чаще поступают проще — выгружают файл и открывают его в любом hex-редакторе (например, HxD или Far с плагином просмотра), где видны и байты, и текстовое представление одновременно.
Работа с потоками и большими файлами
Загружать файл целиком в память объекта ДвоичныеДанные приемлемо для небольших вложений, но для файлов в сотни мегабайт это рискованно: можно исчерпать память сервера или рабочего процесса. Для таких случаев платформа предоставляет потоковые объекты: ФайловыйПоток, ПотокВПамяти, а также ЧтениеДанных и ЗаписьДанных поверх них.
Потоковое чтение позволяет посмотреть фрагмент файла любого размера: открыть файл как поток, перейти на нужную позицию методом Перейти() и прочитать заданное число байт. Это незаменимо, когда нужно проанализировать только заголовок большого файла обмена или найти смещение, с которого начинаются повреждённые данные.
Для проверки целостности и сравнения двух бинарных наборов удобно считать хеш: объект ХешированиеДанных с алгоритмами MD5, SHA1 или SHA256. Если хеши двух выгрузок совпадают, данные идентичны — это быстрее и надёжнее побайтового сравнения.
Типовые инструменты и готовые обработки
В конфигурациях на БСП искать вложения вручную через запросы не нужно: присоединённые файлы открываются прямо из карточки объекта двойным щелчком, а программно данные получают функцией РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл). Это избавляет от необходимости разбираться, где физически лежит файл — в базе или в томе.
Для разработчика полезны универсальные внешние обработки «консоль кода» и «редактор хранилища значений», которые позволяют выбрать объект базы, извлечь значение реквизита и сразу сохранить его в файл. Такие инструменты есть в открытых наборах для разработчиков и в типовой обработке «Инструменты разработчика» для управляемых форм. Они особенно удобны, когда нужно быстро посмотреть данные в чужой базе без написания кода.
Если конфигурация самописная и структура хранения неизвестна, начните с просмотра метаданных в конфигураторе: найдите реквизиты с типом ХранилищеЗначения, затем запросом выберите несколько записей и проверьте, что возвращает Получить() — тип результата подскажет дальнейшие действия.
Как проверить результат и что делать при проблемах
Признак успешного просмотра — файл открывается целевой программой без предупреждений о повреждении, а его размер совпадает с размером объекта ДвоичныеДанные (метод Размер()). Если программа сообщает о битом файле, сначала сверьте размеры: обрезанные данные указывают на ошибку при передаче, например на потерю части Base64-строки или прерванную выгрузку.
Если Получить() хранилища значения вернул Неопределено, данные в базе отсутствуют — реквизит пуст, и искать проблему нужно не в просмотре, а в механизме записи. Если вернулся объект неожиданного типа (например, Картинка), у него есть собственный метод ПолучитьДвоичныеДанные() или Записать() — работайте уже с ним.
Как проверить результат
Совпадает с ДвоичныеДанные.Размер()
Файл меньше — данные обрезаны при передаче
Соответствуют сигнатуре ожидаемого формата
Мусор или HTML с текстом ошибки — в базе лежит не то, что ожидалось
Файл открывается без предупреждений
Ошибка формата — проверьте расширение и сигнатуру
ДвоичныеДанные или Картинка
Неопределено — реквизит пуст
Когда данные приходят из обмена и выглядят как набор случайных символов, проверьте кодировку: текст в UTF-8, прочитанный как ANSI, даёт характерные «кракозябры». Для таких случаев данные записывают в файл и открывают редактором с ручным выбором кодировки либо читают через ЧтениеТекста с явным указанием КодировкаТекста.UTF8.
Частые вопросы
Можно ли посмотреть двоичные данные прямо в конфигураторе?
Готового просмотрщика байтов в конфигураторе нет. Можно открыть объект через табло или консоль запросов, но содержимое реквизита ХранилищеЗначения отобразится только как строка вида «Хранилище значения». Реально посмотреть данные получится только программно: извлечь значение и выгрузить в файл или преобразовать в Base64.
Чем отличаются ДвоичныеДанные от ХранилищаЗначения?
ДвоичныеДанные — это сами байты. ХранилищеЗначения — контейнер-обёртка для хранения в реквизите базы произвольного значения: внутри может быть ДвоичныеДанные, Картинка, таблица значений или что угодно сериализуемое. Из хранилища значение извлекают методом Получить().
Как посмотреть картинку, хранящуюся в базе?
Если реквизит имеет тип ХранилищеЗначения с картинкой, вызовите Получить() — вернётся объект Картинка. На форме её можно показать через реквизит типа Картинка или адрес временного хранилища; для выгрузки на диск используйте метод Записать() объекта Картинка, указав имя файла с расширением png или jpg.
Как прочитать двоичные данные из HTTP-ответа или веб-сервиса?
Метод Получить() объекта HTTPСоединение с параметром-именем файла сохраняет ответ сразу на диск. Если ответ нужен в памяти, используйте HTTPОтвет.ПолучитьТелоКакДвоичныеДанные() или ПолучитьТелоКакПоток() для больших ответов. Дальше с данными работают так же, как с любыми другими: запись в файл, Base64 или потоковый разбор.
Что делать, если файл выгрузился, но не открывается?
Проверьте три вещи: совпадает ли размер файла с размером исходных данных, соответствует ли расширение реальной сигнатуре первых байт и не лежит ли в базе вместо файла текст ошибки (например, HTML-страница от веб-сервиса). Откройте файл в hex-редакторе — первые байты сразу покажут, что внутри на самом деле.
Как сравнить два набора двоичных данных без выгрузки в файлы?
Используйте объект ХешированиеДанных с алгоритмом SHA256: вычислите хеш каждого набора и сравните результаты. Совпадение хешей означает идентичность данных. Побайтовое сравнение через ЧтениеДанных тоже возможно, но медленнее и требует больше кода.
Что важно запомнить
Двоичные данные в 1С извлекают из ХранилищаЗначения методом Получить() или из временного хранилища, затем либо записывают в файл и открывают внешней программой, либо анализируют на месте через Base64, hex и ЧтениеДанных. Тип неизвестного файла определяют по сигнатуре первых байт, большие файлы читают потоками, а результат проверяют сравнением размеров и открытием целевой программой.