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

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

1С: как преобразовать строку в двоичные данные

Как в 1С преобразовать строку в двоичные данные: ПолучитьДвоичныеДанныеИзСтроки, работа с кодировками, Base64, обратное преобразование и типичные ошибки разработчика.

Задача преобразования строки в двоичные данные возникает в 1С чаще, чем кажется: при обмене с веб-сервисами, формировании файлов на лету, сохранении текста в хранилище значений, подготовке тела HTTP-запроса или передаче данных в формате Base64. Платформа 1С:Предприятие предоставляет для этого встроенные функции, но у них есть нюансы с кодировками и типами результата, о которых нужно знать заранее.

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

Ниже разобраны основные способы преобразования, работа с кодировками, обратное преобразование в строку, проверка результата и типичные ошибки, которые приводят к «битым» файлам и нечитаемым данным на стороне приёмника.

Базовый способ: функция ПолучитьДвоичныеДанныеИзСтроки

Функция ПолучитьДвоичныеДанныеИзСтроки() — штатный и самый простой способ. Синтаксис: первый параметр — исходная строка, второй (необязательный) — кодировка текста, третий (необязательный) — признак записи BOM (маркера порядка байт). Результат — значение типа ДвоичныеДанные.

Минимальный пример:

Строка = "Привет, мир!";

ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Строка, КодировкаТекста.UTF8);

Полученный объект можно сразу использовать: записать в файл методом ДвоичныеДанные.Записать(ИмяФайла), передать как тело HTTP-запроса через HTTPЗапрос.УстановитьТелоИзДвоичныхДанных() или поместить во временное хранилище функцией ПоместитьВоВременноеХранилище().

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

bsl
Строка = "Текст для преобразования";
ДД = ПолучитьДвоичныеДанныеИзСтроки(Строка, КодировкаТекста.UTF8);
ДД.Записать("C:\Temp\result.txt");

Выбор кодировки: почему это критично

Одна и та же строка в разных кодировках превращается в разные наборы байт. Для кириллицы разница принципиальна: UTF-8 кодирует русские буквы двумя байтами, windows-1251 — одним, UTF-16 — двумя с другим порядком. Если приёмник ожидает одну кодировку, а вы передали другую, текст будет испорчен.

Доступные значения перечисления КодировкаТекста включают UTF8, UTF16, ANSI, OEM, KOI8 и другие. Практические ориентиры: для веб-сервисов, REST API и JSON почти всегда нужен UTF-8; для обмена со старыми Windows-приложениями часто требуется ANSI (windows-1251); для некоторых банковских форматов встречается OEM (cp866).

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

Обратное преобразование: из двоичных данных в строку

Для проверки результата и для приёма данных от внешних систем нужна обратная операция — функция ПолучитьСтрокуИзДвоичныхДанных(). Она принимает объект двоичных данных и кодировку, возвращает строку.

ВосстановленнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);

Кодировка при чтении должна совпадать с кодировкой записи. Если строка была записана в UTF-8, а читается как ANSI, кириллица превратится в последовательность нечитаемых символов. Это самый простой способ диагностики: если после обратного преобразования текст искажён — проблема именно в несовпадении кодировок.

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

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

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

Обратное преобразование
Норма

Строка после ПолучитьСтрокуИзДвоичныхДанных совпадает с исходной

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

Кракозябры или знаки вопроса вместо кириллицы

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

Размер больше нуля и соответствует длине текста в выбранной кодировке

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

Нулевой размер при непустой строке

Файл на диске
Норма

Файл открывается в редакторе и читается корректно

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

Редактор показывает искажённые символы или пустой файл

Преобразование через Base64 для обмена данными

Когда двоичные данные нужно передать внутри текстового протокола (JSON, XML, тело письма), используют промежуточное представление Base64. В 1С для этого есть функции Base64Строка() и Base64Значение().

Цепочка выглядит так: строка → двоичные данные → Base64-строка. На приёмной стороне выполняется обратная последовательность: Base64 → двоичные данные → строка.

ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Строка, КодировкаТекста.UTF8);

СтрокаBase64 = Base64Строка(ДвоичныеДанные);

// На приёмной стороне:

ДвоичныеДанныеОбратно = Base64Значение(СтрокаBase64);

СтрокаОбратно = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеОбратно, КодировкаТекста.UTF8);

Учтите, что Base64 увеличивает объём данных примерно на треть. Для больших текстов это влияет на трафик и время передачи, поэтому для массивных вложений иногда выгоднее передавать файл напрямую, а не внутри JSON.

Альтернативные способы: потоки и ЗаписьДанных

Когда нужно собрать двоичные данные из нескольких частей или дописывать содержимое порциями, удобнее объект ЗаписьДанных поверх потока в памяти. Метод ЗаписатьСимволы() позволяет добавить строку в нужной кодировке, а затем получить итоговые двоичные данные из потока.

Поток = Новый ПотокВПамяти();

Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8);

Запись.ЗаписатьСимволы("Первая часть");

Запись.ЗаписатьСимволы("Вторая часть");

Запись.Закрыть();

ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();

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

Сравнение способов

ПолучитьДвоичныеДанныеИзСтроки

Оптимально для однократного преобразования целой строки. Не подходит для поэтапной сборки данных.

ЗаписьДанных + ПотокВПамяти

Подходит для сборки данных из частей и смешанного содержимого. Требует больше кода и аккуратного закрытия объектов.

Через временный файл

Крайний вариант при ограничениях по памяти. Медленнее и требует прав на файловую систему сервера.

Где результат использовать: файлы, HTTP, хранилище

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

Для HTTP-запросов двоичные данные устанавливаются методом УстановитьТелоИзДвоичныхДанных(). Если API принимает текстовое тело (JSON, XML), часто проще использовать УстановитьТелоИзСтроки() с явной кодировкой — преобразование выполнится внутри платформы, но принцип тот же.

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

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

Ограничения и нюансы платформы

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

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

Ещё один нюанс: тип ДвоичныеДанные не сериализуется напрямую в JSON стандартными средствами. Для передачи через JSON сначала конвертируйте в Base64, как показано выше.

Итог

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

Строка преобразуется в двоичные данные функцией ПолучитьДвоичныеДанныеИзСтроки с явным указанием кодировки, обратно — ПолучитьСтрокуИзДвоичныхДанных. Для текстовых протоколов используйте Base64, для сборки из частей — потоки. Всегда проверяйте результат обратным преобразованием.

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

Чем ПолучитьДвоичныеДанныеИзСтроки отличается от записи строки в текстовый файл?

Функция возвращает объект в памяти без обращения к диску — его можно передать по HTTP, в хранилище или Base64. Текстовый документ сразу создаёт файл. Если конечная цель — файл, оба пути равнозначны; если данные нужны для передачи, текстовый файл — лишний промежуточный шаг.

Какую кодировку выбрать для обмена с веб-сервисом?

Практически всегда UTF-8 — это стандарт де-факто для REST API и JSON. Исключение — случаи, когда документация внешней системы явно требует другую кодировку. При сомнениях проверьте спецификацию API или заголовок Content-Type ответов сервиса.

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

Наиболее вероятная причина — несовпадение кодировки записи и кодировки, в которой файл открывает редактор. Запишите файл в UTF-8 с BOM — тогда большинство редакторов определят кодировку автоматически. Если файл читает другая программа, сверьтесь с её требованиями.

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

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

Как передать двоичные данные из строки внутри JSON?

Напрямую — никак, тип ДвоичныеДанные не сериализуется в JSON. Сначала преобразуйте данные функцией Base64Строка и вставьте полученную строку в JSON. Приёмник должен выполнить обратное декодирование через Base64Значение и ПолучитьСтрокуИзДвоичныхДанных.

Есть ли ограничение на длину строки для преобразования?

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