Преобразует двоичные данные в строку с заданной кодировкой текста.
Синтаксис
ПолучитьСтрокуИзДвоичныхДанных(<ДвоичныеДанные>, <КодировкаТекста>)Полное описание, параметры и ограничения
Глобальный контекст.ПолучитьСтрокуИзДвоичныхДанных (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. Отдельно демонстрируем варианты, где результат хранится буфером или двоичными данными.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Серверный контекст. Учебная строка abc кодируется в UTF-8 без BOM.
В примере стандартное 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));Разбор по шагам
Получаем три байта abc и показываем строковые Base64 и Hex.
Декодируем строковые представления и проверяем исходный текст.
Буферные и двоичные варианты кодирования содержат символы кодированного представления, а не исходные три байта.
Декодируем каждый вариант; Base64Строка и Base64Значение показывают старые краткие функции для двоичных данных.
Как проверить результат
Base64 равно YWJj, Hex равно 616263.
Все обратные преобразования выводят abc, сравнения представлений дают Истина.
Не передавайте Hex-строку декодировщику Base64: это другой формат и другой смысл байтов.
Ожидаемый результат
Каждый показанный формат восстанавливает исходные байты при использовании парной функции.
На что обратить внимание
Base64 не шифрует и не защищает данные: любой получатель может их восстановить.
Двоичное содержимое Base64Данные — кодированное представление. Для HTTP-заголовка или JSON обычно нужна строковая функция.
При работе с чужим API не заменяйте Base64 на base64url вручную без проверки его контракта.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Разделить настоящий UTF8 буфер:4поля, один/массив разделителей и неверная сумма
Конкретный парсер Книга;3;250;750 демонстрирует реальные массивы БуферДвоичныхДанных, декодирование только после разделения, альтернативные разделители и отказ сумме751. Без файлов/архивов/сети.
Где и как запускать
Полный модуль собственной управляемой формы толстого Windows-клиента; только memory UTF8/BSL, actual0.
Подготовка
Создайте отдельную новую пустую файловую ИБ на платформе ровно8.5.1.1343: корень конфигурации УчебныеАрхивыИБуферы85, управляемое приложение, русский встроенный язык, совместимость Не использовать. Рабочие базы/каталоги/архивы в этом уроке запрещены.
В конфигурации0предметных объектов/регистров/общих реквизитов/подписок/заданий/внешних источников. Никаких расширений базы или сеанса. Полный guard server-процедуры проверяет это и отсутствие активной транзакции.
Запускайте только толстый управляемый Windows-клиент8.5.1.1343, не сервер/тонкий/веб/мобильный. Желательно отдельный учебный Windows-профиль с ASCII именем OwnArchive85: legacyZIP API ограничивает национальные символы в исходных путях. SHA256 API доступен в толстом клиенте.
Создайте отдельную внешнюю обработку OwnArchive85 с управляемой формой. Реквизиты ПодтверждаюСвойОпыт85 Булево исходноЛожь; ПутьОпыта85 Строка0 ТолькоПросмотр; Статус85 Строка0 многострочный ТолькоПросмотр. Назначьте ПриОткрытии; команда Выполнить85 и одноименный обработчик/кнопка, ИзменяетСохраняемыеДанныеЛожь.
Вставьте весь основной модуль одного выбранного урока в форму. Уроки самостоятельны: не объединяйте одноименные процедуры. Буферный урок не создает файлов и не использует ПутьОпыта85.
После подтверждения нового пустого стенда каждая файловая команда генерирует свой свежий UUID и проверяет отсутствие OwnArchive85-UUID в native клиентском временном каталоге. Путь не берется из пользовательской строки. Existing-файлы никогда не перезаписываются.
Архивный fixture — только свои card.txt UTF8безBOM Книга;3;250;750 и manifest.txt со своим UUID/files=2. Файлы сначала реально записываются и сверяются с исходными bytes/размером/SHA256. Пути/маски/имена пользователя в writer не передаются.
Архивы создаются в ПотокВПамяти двумя реальными API-путями: constructor(stream) и new-uninitialized→Открыть(stream). Для modern явно ТипФайлаАрхива.ZIP; пароль пустой, шифрование не заявляется. Записать финализирует writer; метода Закрыть у writer нет, он не выдумывается.
Перед ИзвлечьВсе проверяются ровно2entry, exact whitelist плоских имен,0дубликатов/шифрования и точные размеры исходных байтов. Неизвестные/абсолютные пути/каталоги/traversal отказываются до распаковки. Это только свой только что построенный архив, не универсальный валидатор чужих ZIP.
Output out-1/out-2 создаются внутри только своего UUID каталога после проверки отсутствия/пустоты. ИзвлечьВсе передается лишь обязательный Путь: native modern8.5 описывает второй параметр как Строка, поэтому неподтвержденное enum-значение туда не подставляется. Плоский whitelist не требует восстановленных каталогов.
У ExtractAll результат подтверждается по обоим файлам: exact bytes, размеры иSHA256file=mempayload. Legacy Найти/Получить проверяются на реально полученной коллекции, с missing-name и index=count. Modern Find/Get native ошибочно описаны без аргументов и в этом уроке не угадываются.
Ждать и callback уроки записывают отдельный свой новый payload.txt. Promise дает Неопределено; callback — только К; error callback3аргумента. Имя/bytes не принимаются от незнакомого объекта и completion не выдается за успешность без readback.
Новые собственные учебные файлы/output-папки после ВАШЕГО ручного опыта остаются по показанному пути для контроля. Автоматического/рекурсивного удаления нет. При ошибке не повторяйте запись в старую UUID-папку; не подставляйте рабочий каталог.
Здесь 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Проверьте собственный пустой стенд/клиент. Этот отдельный урок не создает UUID-папок и не пишет файлы.
Кодирует Книга;3;250;750 в UTF8безBOM и получает actual БуферДвоичныхДанных, не произвольную строку вместо буфера.
Разделитель ; тоже реальный UTF8 буфер. Разделить(буфер) дает массив4буферов.
Каждую часть проверяем как БуферДвоичныхДанных, переводим обратно в ДвоичныеДанные и только затем UTF8 строку.
Проверяем exact Книга/3/250/750 и арифметику3×250=750; числа берутся из собственных действительно распарсенных полей.
Второй вариант создает настоящий массив буферов ; и |; Смешанный Книга;3|250;750 разбирается в те же4поля.
Разделитель | отсутствует в исходном буфере: одна часть и точные исходные bytes сохранены, не пустой массив.
Собственный испорченный record содержит751. Сам Split не валидирует бизнес-данные: наш полный валидатор обязан отказаться и не выдать общий успех.
Как проверить результат
Результат Split — массив буферов, не строк; UTF8 Книга сохранена без разрезания многобайтных символов ASCII разделителем.
Один и массив разделителей дают exact4поля; отсутствующий delimiter сохраняет запись целиком.
Ошибочная сумма751 отказана после полноценного парсинга;3×250 проверено по реальным полям.
Не используется malformed native0args вариант Split: вызываются два четко описанных required-arg варианта. Files/1C/network0.
Ожидаемый результат
Ожидаемые ручные4поля Книга/3/250/750, сохранение whole-buffer без delimiter и отказ751. Статические UTF8/contract tests — не запуск1С.
На что обратить внимание
Делить raw UTF8 по произвольному байту внутри кириллического символа нельзя. Здесь ASCII ;/| — собственный известный формат записи.
Буфер.Разделить сам не проверяет количество/типы/арифметику. Для этого реализован конкретный собственный валидатор, а не обещание корректности любых данных.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.