ДвоичныеДанные

Типы · BinaryData

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

Примеры платформы

МояКартинка = Новый ДвоичныеДанные("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
...
ИмяФайла = "C:\Мои документы\Картинка2.bmp";
НовНоменклатура.Изображение.Получить().Записать(ИмяФайла);
Полное описание, параметры и ограничения

ДвоичныеДанные (BinaryData)

ДвоичныеДанные (BinaryData)

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

Методы:
Записать (Write)
ЗаписатьАсинх (WriteAsync)
НачатьЗапись (BeginWrite)
ОткрытьПотокДляЧтения (OpenStreamForRead)
Размер (Size)

Конструкторы:
На основании файла

Описание:

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

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: base64Binary, hexBinary.

Пример:

МояКартинка = Новый ДвоичныеДанные("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);

// сохранение значения типа ХранилищеЗначения в базе данных

НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения

НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
...
// выгрузка значения типа ДвоичныеДанные из хранилища значений в файл

ИмяФайла = "C:\Мои документы\Картинка2.bmp";
НовНоменклатура.Изображение.Получить().Записать(ИмяФайла);

См. также:
ПочтовоеВложение, свойство Данные
ПочтовыеВложения, метод Добавить
ИнтернетПочтовыеВложения, метод Добавить
Картинка, метод ПолучитьДвоичныеДанные
Глобальный контекст, метод Base64Значение
Глобальный контекст, метод Base64Строка
Картинка, конструктор Формирование из двоичных данных
ИнтернетТекстПочтовогоСообщения, свойство Данные
ЧтениеFastInfoset, метод УстановитьДвоичныеДанные
Глобальный контекст, метод СоединитьДвоичныеДанные
Глобальный контекст, метод РазделитьДвоичныеДанные
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзСтроки
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзBase64Строки
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзBase64ДвоичныхДанных
Глобальный контекст, метод ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзHexСтроки
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзHexДвоичныхДанных
Глобальный контекст, метод ПолучитьHexДвоичныеДанныеИзДвоичныхДанных
Глобальный контекст, метод ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных

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

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

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

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

Преобразовать русское название в UTF-8 и вернуть обратно

Размер строки в символах и размер передаваемых байтов различаются. Явно выбираем UTF-8 без BOM для обмена.

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

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

Подготовка

  1. Выполняйте на сервере; файл не создаётся, сеть не используется.

  2. В первом запуске оставьте название Книга и параметр ЗаписатьBOM равным Ложь.

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

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

  1. Кодируем строку в двоичные данные с явно заданной кодировкой.

  2. Преобразуем двоичные данные в изменяемый буфер и сравниваем размеры.

  3. Декодируем данные и буфер той же кодировкой и проверяем равенство исходному названию.

  4. Повторяем путь через создание буфера прямо из строки.

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

  1. В названии 5 символов, в UTF-8 без BOM 10 байтов.

  2. Оба обратных преобразования возвращают Книга; все сравнения равны Истина.

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

Название восстановлено без потери русских букв; различие байтов и символов показано явно.

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

  1. Передавая длину в сетевой протокол, уточните, требуются байты или символы: СтрДлина не заменяет размер UTF-8.

  2. Декодирование другой кодировкой может дать испорченный текст. BOM добавляйте только если его ждёт принимающая сторона.

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

Загрузить публичный сертификат оповещением и выгрузить байты

Полный модуль формы показывает параметры обоих callbacks: созданный сертификат приходит первым аргументом инициализации, публичные байты — первым аргументом выгрузки без имени файла.

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

Полный модуль управляемой формы учебной обработки Windows; два callbacks и точная очистка собственного CER.

Подготовка

  1. В отдельной учебной базе создайте внешнюю обработку с пустой управляемой формой, командой УчебныйПример и кнопкой. Укажите действие УчебныйПример и вставьте весь модуль.

  2. Запускайте в Windows-клиенте 8.5.1.1343. НачатьИнициализацию принимает путь CER: поэтому этот урок создаёт ровно один уникальный собственный временный файл.

  3. Встроенный сертификат тот же публичный учебный Syntax Guide Training Only: закрытого ключа, установки в ОС и доверия нет.

  4. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  5. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь завершения своей цепочки сертификата");
        Возврат;
    КонецЕсли;
    ИмяФайла = КаталогВременныхФайлов() + "УчебныйСертификат_" + Строка(Новый УникальныйИдентификатор) + ".cer";
    Данные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
    Состояние = Новый Структура("ИмяФайла,СвойФайл,Поток,ОжидаемыеДанные,Сертификат", ИмяФайла, Ложь, Неопределено, Данные, Неопределено);
    Выполняется = Истина;
    Попытка
        Состояние.Поток = Новый ФайловыйПоток(Состояние.ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СвойФайл = Истина;
        Состояние.ОжидаемыеДанные.Записать(Состояние.Поток);
        Состояние.Поток.Закрыть();
        Состояние.Поток = Неопределено;
        Состояние.Сертификат = Новый СертификатКриптографии;
        Состояние.Сертификат.НачатьИнициализацию(ОповещениеДля("ПослеИнициализации", Состояние), Состояние.ИмяФайла);
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(Обработчик, Состояние)
    Возврат Новый ОписаниеОповещения(Обработчик, ЭтотОбъект, Состояние, "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ПослеИнициализации(ЗагруженныйСертификат, Состояние) Экспорт
    Попытка
        Если ТипЗнч(ЗагруженныйСертификат) <> Тип("СертификатКриптографии") Тогда
            ВызватьИсключение "Оповещение не вернуло созданный сертификат";
        КонецЕсли;
        Состояние.Сертификат = ЗагруженныйСертификат;
        Сообщить(Base64Строка(Состояние.Сертификат.Отпечаток) = "tRDNiwoaiFssHhQqwyjWVlPLdns=");
        Состояние.Сертификат.НачатьВыгрузку(ОповещениеДля("ПослеВыгрузки", Состояние));
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыгрузки(ВыгруженныеДанные, Состояние) Экспорт
    Попытка
        Если ТипЗнч(ВыгруженныеДанные) <> Тип("ДвоичныеДанные") Тогда
            ВызватьИсключение "Оповещение выгрузки не вернуло публичные байты";
        КонецЕсли;
        Сообщить(Base64Строка(ВыгруженныеДанные) = Base64Строка(Состояние.ОжидаемыеДанные));
        ОсвободитьСвойФайл(Состояние);
        ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
        Если ПроверкаФайла.Существует() Тогда
            ВызватьИсключение "Очистка собственного CER не завершилась; успешного завершения нет";
        КонецЕсли;
        Сообщить(Не ПроверкаФайла.Существует());
        Выполняется = Ложь;
        Сообщить("Учебный публичный сертификат выгружен; свой временный файл удалён");
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьСвойФайл(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьСвойФайл(Состояние)
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
            Состояние.Поток = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственный CER-поток: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.СвойФайл Тогда
        Попытка
            УдалитьФайлы(Состояние.ИмяФайла);
            Состояние.СвойФайл = Ложь;
        Исключение
            Сообщить("Не удалось удалить только собственный временный CER: " + Состояние.ИмяФайла + "; " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

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

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

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

  3. НачатьВыгрузку без файлового имени возвращает данные в ПослеВыгрузки(ВыгруженныеДанные, Состояние). Сравниваем их с исходным DER.

  4. После завершения удаляем точный собственный CER под защитой флага и проверяем отсутствие. Коллекции сертификатов ОС не меняются.

  5. Флаг Выполняется препятствует повторному старту. Ошибки операции и ошибки следующего шага идут через очистку, а не через сообщение об успешном завершении.

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

  1. Три сравнения Истина: отпечаток, исходные DER-байты и отсутствие своего файла.

  2. При повторном нажатии до окончания ожидается сообщение дождаться своей цепочки.

  3. При отказе удаления выводится точное имя; отдельная проверка вызывает исключение до сообщения об успешном завершении.

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

Созданный результат инициализации и результат публичной выгрузки обработаны правильными callbacks.

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

  1. Вариант НачатьВыгрузку с файловым именем возвращает имя, а не байты: его обработчик должен иметь соответствующий первый аргумент.

  2. Не подставляйте путь к рабочему сертификату: этот модуль должен обслуживать только созданный им CER.

  3. Нельзя удалять CER сразу после НачатьИнициализацию: асинхронная операция ещё может читать его.

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

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

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

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

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