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

Методы · GetStringFromBinaryData

Преобразует двоичные данные в строку с заданной кодировкой текста.

Синтаксис

ПолучитьСтрокуИзДвоичныхДанных(<ДвоичныеДанные>, <КодировкаТекста>)
Полное описание, параметры и ограничения

Глобальный контекст.ПолучитьСтрокуИзДвоичныхДанных (Global context.GetStringFromBinaryData)

Глобальный контекст (Global context)

ПолучитьСтрокуИзДвоичныхДанных (GetStringFromBinaryData)

Доступен, начиная с версии 8.3.10.

Синтаксис:
ПолучитьСтрокуИзДвоичныхДанных(<ДвоичныеДанные>, <КодировкаТекста>)
Параметры:

<ДвоичныеДанные> (обязательный)
Тип: ДвоичныеДанные.
Двоичные данные, которые требуется преобразовать в строку.

<КодировкаТекста> (необязательный)
Тип: КодировкаТекста, Строка.
Кодировка текста может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.
Поддерживаемые названия кодировок:
UTF-8

UTF-16

UTF-16BE

UTF-16LE

ISO-8859-1

US-ASCII

gb18030

iso-8859-2

iso-8859-3

iso-8859-4

iso-8859-5

iso-8859-6

iso-8859-7

iso-8859-8

iso-8859-9

iso-8859-13

iso-8859-15

Shift_JIS

EUC-JP

Big5

Big5-HKSCS

GBK

GB2312

GB_2312-80

EUC-KR

KSC_5601

windows-949

windows-874

cp866

KOI8-R

KOI8-U

windows-1250

windows-1251

windows-1252

windows-1253

windows-1254

windows-1255

windows-1256

windows-1257

windows-1258

macintosh

x-mac-cyrillic

ISO-2022-JP

ISO-2022-KR

ISO-2022-CN

ISO-2022-CN-EXT

HZ-GB-2312
.
Значение по умолчанию: UTF8.
Возвращаемое значение:
Тип: Строка.

Описание:

Преобразует двоичные данные в строку с заданной кодировкой текста.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.3.10.

Методическая информация

Практические примеры

Передать байты как Base64 или показать их в Hex

Для JSON удобно строковое Base64, для диагностики — Hex. Отдельно демонстрируем варианты, где результат хранится буфером или двоичными данными.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Серверный контекст. Учебная строка abc кодируется в UTF-8 без BOM.

  2. В примере стандартное Base64, не вариант base64url для URL или токенов.

Данные = ПолучитьДвоичныеДанныеИзСтроки("abc", КодировкаТекста.UTF8, Ложь);
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
Base64Текст = ПолучитьBase64СтрокуИзДвоичныхДанных(Данные);
HexТекст = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер);
Сообщить(Base64Текст);
Сообщить(HexТекст);
ИзBase64 = ПолучитьДвоичныеДанныеИзBase64Строки(Base64Текст);
ИзHex = ПолучитьБуферДвоичныхДанныхИзHexСтроки(HexТекст);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ИзBase64, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(ИзHex, КодировкаТекста.UTF8));
Base64Буфер = ПолучитьBase64БуферДвоичныхДанныхИзБуфераДвоичныхДанных(Буфер);
ВосстановленныйБуфер = ПолучитьБуферДвоичныхДанныхИзBase64БуфераДвоичныхДанных(Base64Буфер);
Base64Данные = ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных(Данные);
ВосстановленныеДанные = ПолучитьДвоичныеДанныеИзBase64ДвоичныхДанных(Base64Данные);
HexБуфер = ПолучитьHexБуферДвоичныхДанныхИзБуфераДвоичныхДанных(Буфер);
БуферПослеHex = ПолучитьБуферДвоичныхДанныхИзHexБуфераДвоичныхДанных(HexБуфер);
HexДанные = ПолучитьHexДвоичныеДанныеИзДвоичныхДанных(Данные);
ДанныеПослеHex = ПолучитьДвоичныеДанныеИзHexДвоичныхДанных(HexДанные);
Сообщить(ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(ВосстановленныйБуфер) = Base64Текст);
Сообщить(ПолучитьHexСтрокуИзДвоичныхДанных(ВосстановленныеДанные) = HexТекст);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(БуферПослеHex, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеПослеHex, КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(HexТекст), КодировкаТекста.UTF8));
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзBase64Строки(Base64Текст), КодировкаТекста.UTF8));
Сообщить(Base64Строка(Данные) = Base64Текст);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Base64Текст), КодировкаТекста.UTF8));

Разбор по шагам

  1. Получаем три байта abc и показываем строковые Base64 и Hex.

  2. Декодируем строковые представления и проверяем исходный текст.

  3. Буферные и двоичные варианты кодирования содержат символы кодированного представления, а не исходные три байта.

  4. Декодируем каждый вариант; Base64Строка и Base64Значение показывают старые краткие функции для двоичных данных.

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

  1. Base64 равно YWJj, Hex равно 616263.

  2. Все обратные преобразования выводят abc, сравнения представлений дают Истина.

  3. Не передавайте Hex-строку декодировщику Base64: это другой формат и другой смысл байтов.

Ожидаемый результат

Каждый показанный формат восстанавливает исходные байты при использовании парной функции.

На что обратить внимание

  1. Base64 не шифрует и не защищает данные: любой получатель может их восстановить.

  2. Двоичное содержимое Base64Данные — кодированное представление. Для HTTP-заголовка или JSON обычно нужна строковая функция.

  3. При работе с чужим API не заменяйте Base64 на base64url вручную без проверки его контракта.

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

Разделить настоящий UTF8 буфер:4поля, один/массив разделителей и неверная сумма

Конкретный парсер Книга;3;250;750 демонстрирует реальные массивы БуферДвоичныхДанных, декодирование только после разделения, альтернативные разделители и отказ сумме751. Без файлов/архивов/сети.

Где и как запускать

Полный модуль собственной управляемой формы толстого Windows-клиента; только memory UTF8/BSL, actual0.

Подготовка

  1. Создайте отдельную новую пустую файловую ИБ на платформе ровно8.5.1.1343: корень конфигурации УчебныеАрхивыИБуферы85, управляемое приложение, русский встроенный язык, совместимость Не использовать. Рабочие базы/каталоги/архивы в этом уроке запрещены.

  2. В конфигурации0предметных объектов/регистров/общих реквизитов/подписок/заданий/внешних источников. Никаких расширений базы или сеанса. Полный guard server-процедуры проверяет это и отсутствие активной транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343, не сервер/тонкий/веб/мобильный. Желательно отдельный учебный Windows-профиль с ASCII именем OwnArchive85: legacyZIP API ограничивает национальные символы в исходных путях. SHA256 API доступен в толстом клиенте.

  4. Создайте отдельную внешнюю обработку OwnArchive85 с управляемой формой. Реквизиты ПодтверждаюСвойОпыт85 Булево исходноЛожь; ПутьОпыта85 Строка0 ТолькоПросмотр; Статус85 Строка0 многострочный ТолькоПросмотр. Назначьте ПриОткрытии; команда Выполнить85 и одноименный обработчик/кнопка, ИзменяетСохраняемыеДанныеЛожь.

  5. Вставьте весь основной модуль одного выбранного урока в форму. Уроки самостоятельны: не объединяйте одноименные процедуры. Буферный урок не создает файлов и не использует ПутьОпыта85.

  6. После подтверждения нового пустого стенда каждая файловая команда генерирует свой свежий UUID и проверяет отсутствие OwnArchive85-UUID в native клиентском временном каталоге. Путь не берется из пользовательской строки. Existing-файлы никогда не перезаписываются.

  7. Архивный fixture — только свои card.txt UTF8безBOM Книга;3;250;750 и manifest.txt со своим UUID/files=2. Файлы сначала реально записываются и сверяются с исходными bytes/размером/SHA256. Пути/маски/имена пользователя в writer не передаются.

  8. Архивы создаются в ПотокВПамяти двумя реальными API-путями: constructor(stream) и new-uninitialized→Открыть(stream). Для modern явно ТипФайлаАрхива.ZIP; пароль пустой, шифрование не заявляется. Записать финализирует writer; метода Закрыть у writer нет, он не выдумывается.

  9. Перед ИзвлечьВсе проверяются ровно2entry, exact whitelist плоских имен,0дубликатов/шифрования и точные размеры исходных байтов. Неизвестные/абсолютные пути/каталоги/traversal отказываются до распаковки. Это только свой только что построенный архив, не универсальный валидатор чужих ZIP.

  10. Output out-1/out-2 создаются внутри только своего UUID каталога после проверки отсутствия/пустоты. ИзвлечьВсе передается лишь обязательный Путь: native modern8.5 описывает второй параметр как Строка, поэтому неподтвержденное enum-значение туда не подставляется. Плоский whitelist не требует восстановленных каталогов.

  11. У ExtractAll результат подтверждается по обоим файлам: exact bytes, размеры иSHA256file=mempayload. Legacy Найти/Получить проверяются на реально полученной коллекции, с missing-name и index=count. Modern Find/Get native ошибочно описаны без аргументов и в этом уроке не угадываются.

  12. Ждать и callback уроки записывают отдельный свой новый payload.txt. Promise дает Неопределено; callback — только К; error callback3аргумента. Имя/bytes не принимаются от незнакомого объекта и completion не выдается за успешность без readback.

  13. Новые собственные учебные файлы/output-папки после ВАШЕГО ручного опыта остаются по показанному пути для контроля. Автоматического/рекурсивного удаления нет. При ошибке не повторяйте запись в старую UUID-папку; не подставляйте рабочий каталог.

  14. Здесь actual1C/files/archivewrites/network0: написаны только примеры и статические тесты. Архивные fixtures в offline-тестах исключительно in-memory и не являются резервными копиями. До ручного запуска итоговые сообщения — ожидаемый протокол.

&НаКлиенте
Процедура Выполнить85(Команда)
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь своего предыдущего опыта";
    КонецЕсли;
    Занято85 = Истина;
    Статус85 = "Свой binary parser еще не подтвержден";
    Попытка
        ПроверитьСвоегоКлиента85();
        Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3;250;750", КодировкаТекста.UTF8, Ложь));
        Разделитель = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(";", КодировкаТекста.UTF8, Ложь));
        Части = Буфер.Разделить(Разделитель);
        ПроверитьСвоиПоля85(Части);
        Разделители = Новый Массив;
        Разделители.Добавить(Разделитель);
        Дополнительный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("|", КодировкаТекста.UTF8, Ложь));
        Разделители.Добавить(Дополнительный);
        Смешанный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3|250;750", КодировкаТекста.UTF8, Ложь));
        ПроверитьСвоиПоля85(Смешанный.Разделить(Разделители));
        БезРазделителя = Буфер.Разделить(Дополнительный);
        Если ТипЗнч(БезРазделителя) <> Тип("Массив") Или БезРазделителя.Количество() <> 1 Тогда
            ВызватьИсключение "Отсутствующий разделитель должен сохранить весь собственный буфер";
        КонецЕсли;
        Если ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БезРазделителя[0]), КодировкаТекста.UTF8) <> "Книга;3;250;750" Тогда
            ВызватьИсключение "Собственный исходный буфер потерян";
        КонецЕсли;
        Испорченный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3;250;751", КодировкаТекста.UTF8, Ложь));
        ОтказИтога = Ложь;
        Попытка
            ПроверитьСвоиПоля85(Испорченный.Разделить(Разделитель));
        Исключение
            ОтказИтога = Истина;
        КонецПопытки;
        Если Не ОтказИтога Тогда
            ВызватьИсключение "Парсер обязан отвергнуть неверную собственную сумму";
        КонецЕсли;
        Статус85 = "Свой UTF8 binary parser:4поля Книга/3/250/750, один/массив разделителей; отсутствующий delimiter не теряет bytes; сумма751 отвергнута. Файлов/сети нет";
    Исключение
        Статус85 = "Свой binary parser не подтвержден";
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоиПоля85(Части)
    Если ТипЗнч(Части) <> Тип("Массив") Или Части.Количество() <> 4 Тогда
        ВызватьИсключение "Own record имеет ровно4поля";
    КонецЕсли;
    Поля = Новый Массив;
    Для Каждого Часть Из Части Цикл
        Если ТипЗнч(Часть) <> Тип("БуферДвоичныхДанных") Тогда
            ВызватьИсключение "Split возвращает массив буферов, не строк";
        КонецЕсли;
        Поля.Добавить(ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Часть), КодировкаТекста.UTF8));
    КонецЦикла;
    Если Поля[0] <> "Книга" Или Поля[1] <> "3" Или Поля[2] <> "250" Или Поля[3] <> "750"
        Или Число(Поля[1]) * Число(Поля[2]) <> Число(Поля[3]) Тогда
        ВызватьИсключение "Точный own UTF8 record/расчет не совпали";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Перем Занято85;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
    ПроверитьСеанс85();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Система = Новый СистемнаяИнформация;
        Если (Система.ТипПлатформы <> ТипПлатформы.Windows_x86 И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64) Или Не ПодтверждаюСвойОпыт85 Тогда
            ВызватьИсключение "Только свой новый пустой Windows-стенд и толстый управляемый клиент8.5.1.1343";
        КонецЕсли;
    #Иначе
        ВызватьИсключение "Этот own файловый урок не предназначен для сервера, тонкого, веб или мобильного клиента";
    #КонецЕсли
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСеанс85()
    ПроверитьСвойПустойСтенд();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Проверьте собственный пустой стенд/клиент. Этот отдельный урок не создает UUID-папок и не пишет файлы.

  2. Кодирует Книга;3;250;750 в UTF8безBOM и получает actual БуферДвоичныхДанных, не произвольную строку вместо буфера.

  3. Разделитель ; тоже реальный UTF8 буфер. Разделить(буфер) дает массив4буферов.

  4. Каждую часть проверяем как БуферДвоичныхДанных, переводим обратно в ДвоичныеДанные и только затем UTF8 строку.

  5. Проверяем exact Книга/3/250/750 и арифметику3×250=750; числа берутся из собственных действительно распарсенных полей.

  6. Второй вариант создает настоящий массив буферов ; и |; Смешанный Книга;3|250;750 разбирается в те же4поля.

  7. Разделитель | отсутствует в исходном буфере: одна часть и точные исходные bytes сохранены, не пустой массив.

  8. Собственный испорченный record содержит751. Сам Split не валидирует бизнес-данные: наш полный валидатор обязан отказаться и не выдать общий успех.

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

  1. Результат Split — массив буферов, не строк; UTF8 Книга сохранена без разрезания многобайтных символов ASCII разделителем.

  2. Один и массив разделителей дают exact4поля; отсутствующий delimiter сохраняет запись целиком.

  3. Ошибочная сумма751 отказана после полноценного парсинга;3×250 проверено по реальным полям.

  4. Не используется malformed native0args вариант Split: вызываются два четко описанных required-arg варианта. Files/1C/network0.

Ожидаемый результат

Ожидаемые ручные4поля Книга/3/250/750, сохранение whole-buffer без delimiter и отказ751. Статические UTF8/contract tests — не запуск1С.

На что обратить внимание

  1. Делить raw UTF8 по произвольному байту внутри кириллического символа нельзя. Здесь ASCII ;/| — собственный известный формат записи.

  2. Буфер.Разделить сам не проверяет количество/типы/арифметику. Для этого реализован конкретный собственный валидатор, а не обещание корректности любых данных.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.