Реализовано в версии 8.3.10.2168.
Мы постепенно наращиваем функциональность работы с двоичными данными. Для этого есть несколько причин. Во-первых, на первом этапе мы реализовали не всё из того, что было нами задумано. А во-вторых, в процессе обсуждения новых возможностей, мы получили от вас ряд пожеланий, которые мы также решили реализовать.
В глобальный контекст мы добавили большое количество новых функций для преобразования двоичных данных. Так, например, вы можете выполнять прямое и обратное преобразование двоичных данных в обычную строку, строку формата Base64 и строку формата BinHex. Кроме этого сами двоичные данные вы можете преобразовать в форматы Base64, BinHex и обратно.
Аналогичные преобразования поддерживаются и для типа БуферДвоичныхДанных. Кроме этого буфер двоичных данных вы можете преобразовывать в двоичные данные и обратно.
Помимо этого две новые функции позволяют разделить двоичные данные на несколько частей, и наоборот, объединить несколько объектов типа ДвоичныеДанные в один. При этом новый объект будет содержать данные всех частей в том порядке, который вы укажете.
Эти функции по своему смыслу аналогичны разделению и объединению файлов, но во многих случаях они более эффективны. Потому что не нужно предварительно сохранять двоичные данные в файл, и потому, что при разделении отсутствует лишнее копирование данных.
Поскольку использование двоичных данных во многом связано с файловыми операциями, мы посчитали совершенно логичным и естественным добавить работу с потоками в те объекты, которые сейчас тем или иным образом читают и пишут файлы.
В результате теперь вы можете открывать потоки для чтения и записи при использовании таких объектов как:
Вы можете получать тело как поток, когда работаете с HTTP:
Вы можете записывать в поток и читать из потока при работе с объектами:
Запись в поток доступна теперь при работе с типами Картинка и ПреобразованиеККаноническомуXML. А кроме этого работа с потоками поддерживается теперь в различных методах, которые есть у типов ПреобразованиеXSL, МенеджерКриптографии, СертификатКриптографии и ХешированиеДанных.
Инструменты для работы с двоичными данными, которые мы реализовали на первом этапе, позволяли копировать потоки. Но на больших объёмах данных эта операция выполнялась не очень эффективно.
Поэтому у типа ЧтениеДанных мы реализовали новый метод КопироватьВ(). Он не только устраняет эту проблему, но и упрощает текст, делая его более понятным.
Например, раньше можно было получить двоичные данные из одного потока, и записать их в другой поток.
Теперь нет необходимости получать двоичные данные, копирование выполняется ещё на этапе чтения данных.
Приятным моментом является то, что копировать можно не только в поток, но и в объект ЗаписьДанных. Этот вариант удобен тогда, когда, помимо данных из исходного потока, вам требуется записать в выходной поток какие-то свои данные.
Теперь вы можете использовать побитовые логические операции при работе с буферами двоичных данных. В результате этих операций в исходный буфер будет записан результат побитового объединения исходных байтов и байтов в заданном буфере по правилам выбранной логической операции. Мы реализовали следующие операции:
Хорошим примером использования побитовых логических операций является задача декодирования формата обмена с торговым оборудованием. Например, формат обмена с торговым оборудованием описывается полем длиной в 1 байт. Это поле содержит набор признаков, описывающих номенклатуру товара:
Тогда код, извлекающий эту информацию, и представляющий её в виде, удобном для дальнейшей обработки, может выглядеть так.
Мы добавили две новые функции глобального контекста, которые преобразуют шестнадцатеричные и двоичные литералы в числа:
Двоичные литералы удобно использовать для определения масок при совместном использовании с побитовыми операциями. Например, в предыдущем примере с разбором формата обмена с торговым оборудованием, маски задаются с использованием десятичных чисел. Это не очень удобно, так как при написании и чтении кода нужно постоянно производить мысленную трансляцию десятичного числа в двоичную систему.
Вместо этого гораздо удобнее использовать двоичные литералы. При этом код становится более наглядным и вероятность ошибки значительно уменьшается.
Шестнадцатеричные литералы удобно использовать при разборе технических форматов: форматы изображений, звука, видео.
Раньше при передаче двоичных данных между 1С:Предприятием и внешней компонентой существовал ряд ограничений. Например, передать двоичные данные во внешнюю компоненту было нельзя, а при работе в веб-клиенте обмен двоичными данными был вообще невозможен.
Теперь мы убираем все эти ограничения. Обмен двоичными данными вы можете осуществлять в обе стороны и даже в веб-клиенте.
На работе существующих внешних компонент это никак не отразится. Они будут работать, как и раньше. А вот во вновь создаваемых компонентах вы сможете теперь в качестве параметров передавать объекты ДвоичныеДанные.