Заметки из Зазеркалья

05.08.2016

Расширение функциональности работы с двоичными данными

Реализовано в версии 8.3.10.2168.

Мы постепенно наращиваем функциональность работы с двоичными данными. Для этого есть несколько причин. Во-первых, на первом этапе мы реализовали не всё из того, что было нами задумано. А во-вторых, в процессе обсуждения новых возможностей, мы получили от вас ряд пожеланий, которые мы также решили реализовать.

Новые функции для преобразования двоичных данных в разные форматы

В глобальный контекст мы добавили большое количество новых функций для преобразования двоичных данных. Так, например, вы можете выполнять прямое и обратное преобразование двоичных данных в обычную строку, строку формата Base64 и строку формата BinHex. Кроме этого сами двоичные данные вы можете преобразовать в форматы Base64, BinHex и обратно.

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

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

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

Добавление возможности работы с потоками тем объектам, которые работают с файлами

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

В результате теперь вы можете открывать потоки для чтения и записи при использовании таких объектов как:

  • ЧтениеТекста и ЗаписьТекста;
  • ЧтениеFastInfoSet и ЗаписьFastInfoSet;
  • ЧтениеHtml и ЗаписьHtml;
  • ЧтениеJSON и ЗаписьJSON;
  • ЧтениеXML и ЗаписьXML;
  • ЧтениеZipФайла и ЗаписьZipФайла.

Вы можете получать тело как поток, когда работаете с HTTP:

  • HTTPЗапрос и HTTPОтвет;
  • HTTPСервисЗапрос и HTTPСервисОтвет.

Вы можете записывать в поток и читать из потока при работе с объектами:

  • ТекстовыйДокумент;
  • ТабличныйДокумент;
  • ФорматированныйДокумент;
  • ГеографическаяСхема;
  • ГрафическаяСхема;
  • FTPСоединение.

Запись в поток доступна теперь при работе с типами Картинка и ПреобразованиеККаноническомуXML. А кроме этого работа с потоками поддерживается теперь в различных методах, которые есть у типов ПреобразованиеXSL, МенеджерКриптографии, СертификатКриптографии и ХешированиеДанных.

Эффективное копирование с помощью чтения и записи данных

Инструменты для работы с двоичными данными, которые мы реализовали на первом этапе, позволяли копировать потоки. Но на больших объёмах данных эта операция выполнялась не очень эффективно.

Поэтому у типа ЧтениеДанных мы реализовали новый метод КопироватьВ(). Он не только устраняет эту проблему, но и упрощает текст, делая его более понятным.

Например, раньше можно было получить двоичные данные из одного потока, и записать их в другой поток.

04.png

Теперь нет необходимости получать двоичные данные, копирование выполняется ещё на этапе чтения данных.

05.png

Приятным моментом является то, что копировать можно не только в поток, но и в объект ЗаписьДанных. Этот вариант удобен тогда, когда, помимо данных из исходного потока, вам требуется записать в выходной поток какие-то свои данные.

Побитовые логические операции с буфером двоичных данных

Теперь вы можете использовать побитовые логические операции при работе с буферами двоичных данных. В результате этих операций в исходный буфер будет записан результат побитового объединения исходных байтов и байтов в заданном буфере по правилам выбранной логической операции. Мы реализовали следующие операции:

  • ЗаписатьПобитовоеИ();
  • ЗаписатьПобитовоеИли();
  • ЗаписатьПобитовоеИсключительноеИли();
  • ЗаписатьПобитовоеИНе();
  • Инвертировать().

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

  • Биты 0-2: налоговая ставка;
  • Бит 3: 0 - штучный товар, 1 - весовой товар;
  • Бит 4: 0 - разрешить продажу, 1 - запретить продажу;
  • Бит 5: 0 - разрешить подсчет количества, 1 - запретить подсчет количества;
  • Бит 6: 0 - одиночная продажа запрещена, 1 - одиночная продажа разрешена;
  • Бит 7: зарезервировано.

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

01.png

Получение числа из шестнадцатеричных и двоичных литералов

Мы добавили две новые функции глобального контекста, которые преобразуют шестнадцатеричные и двоичные литералы в числа:

  • ЧислоИзШестнадцатеричнойСтроки();
  • ЧислоИзДвоичнойСтроки().

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

02.png

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

03.png

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

Изменения в технологии внешних компонент NativeAPI

Раньше при передаче двоичных данных между 1С:Предприятием и внешней компонентой существовал ряд ограничений. Например, передать двоичные данные во внешнюю компоненту было нельзя, а при работе в веб-клиенте обмен двоичными данными был вообще невозможен.

Теперь мы убираем все эти ограничения. Обмен двоичными данными вы можете осуществлять в обе стороны и даже в веб-клиенте.

На работе существующих внешних компонент это никак не отразится. Они будут работать, как и раньше. А вот во вновь создаваемых компонентах вы сможете теперь в качестве параметров передавать объекты ДвоичныеДанные.

Рассказать друзьям: