Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).
Объект сериализуется
Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.
Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.
Задачи, для решения которых можно использовать двоичные данные:
- Хранение файлов в базе данных (с использованием ХранилищеЗначения);
- Передача файла с клиента на сервер;
- Передача файлов при работе с протоколом HTTP;
- Передача вложений при работе с электронными письмами;
- Криптография;
- Представления файла в виде текста (с использованием Base64).
Работа с двоичными данными:
&НаКлиенте
Процедура ПередатьФайлНаСервер()
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Ложь;
Если Диалог.Выбрать() ТОгда
БинДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(БинДанные, ЭтаФорма.УникальныйИдентификатор);
ОбработкаФайлаНаСервере(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработкаФайлаНаСервере(АдресВХ)
БинДанные = ПолучитьИзВременногоХранилища(АдресВХ);
Если БинДанные <> Неопределено Тогда
//БинДанные.Записать("Путь файла на сервере");
КонецЕсли;
КонецПроцедуры
Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.
Примеры по работе с двоичными данными
Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).
Заполнение:
ПутьКФайлу = "";
БинДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Объект.Файл = Новый ХранилищеЗначения(БинДанные);
Получение (фрагмент кода, выполняемый на сервере):
БинДанные = Объект.Файл.Получить();
Если БинДанные <> Неопределено Тогда
// БинДанные.Записать(Имя Файла);
// или
// Поток = БинДанные.ОткрытьПотокДляЧтения();
КонецЕсли
Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.
Функция, скачивающая картинку из интернета:
Функция СкачатьКартинку(URL)
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
ФайлОтвет = ПолучитьИмяВременногоФайла();
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.ИмяСервера);
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
Ответ = HTTPСоединение.Получить(HTTPЗапрос, ФайлОтвет);
Если Ответ.КодСостояния = 200 Тогда
Возврат Новый ДвоичныеДанные(ФайлОтвет);
КонецЕсли;
КонецФункции
Использование функции:
БинДанные = СкачатьКартинку("url картинки");
СпрОбъект.Аватар = Новый ХранилищеЗначения(БинДанные);
СпрОбъект.Записать();
Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».
По событию ПриСозданииНаСервере
СпрОбъект = РеквизитФормыВЗначение("Объект");
Картинка = ПолучитьНавигационнуюСсылку(СпрОбъект, "Аватар");
Готово, на форме у нас картинка.
Двоичные данные и потоки
Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).
Последовательность действий при работе с двоичными данными без использования потоков:
- Получить двоичные данные из базы;
- Записать их во временный файл;
- Разархивировать;
- Удалить временный файл;
- Прочитать разархивированный файл.
Последовательность действий при работе с потоками:
- Получить двоичные данные из базы;
- Открыть поток для чтения;
- Разархивировать;
- Прочитать разархивированный файл.
Пример кода без использования потоков:
Процедура ОбработкаФайлаНаСервере(АдресВХ)
БинДанные = ПолучитьИзВременногоХранилища(АдресВХ);
ВрФайл = ПолучитьИмяВременногоФайла("zip");
Если БинДанные <> Неопределено Тогда
БинДанные.Записать(ВрФайл);
ПолучитьФайлыАрхива(ВрФайл);
УдалитьФайлы(ВрФайл);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьФайлыАрхива(ВрФайл)
Результат = Новый Массив();
ЧтениеZipФайла = Новый ЧтениеZipФайла(ВрФайл);
ЧтениеZipФайла.ИзвлечьВсе("Путь к каталогу", РежимВосстановленияПутейФайловZIP.Восстанавливать);
ЧтениеZipФайла.Закрыть();
КонецФункции
Пример кода по работе с потоком:
Процедура ОбработкаФайлаНаСервере(АдресВХ)
БинДанные = ПолучитьИзВременногоХранилища(АдресВХ);
Если БинДанные <> Неопределено Тогда
ПолучитьФайлыАрхива(БинДанные);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьФайлыАрхива(БинДанные)
Результат = Новый Массив();
ЧтениеZipФайла = Новый ЧтениеZipФайла(БинДанные.ОткрытьПотокДляЧтения());
ЧтениеZipФайла.ИзвлечьВсе("Путь к каталогу", РежимВосстановленияПутейФайловZIP.Восстанавливать);
ЧтениеZipФайла.Закрыть();
КонецФункции
Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.
Работа с Base64
Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.
xmlns:xsi="">http://www.w3.org/2001/XMLSchema-instance">
строка в Base64
Платформа 1С также позволяет кодировать двоичные данные, не прибегая к сериализации. Для этого есть две функции:
<Строка> = Base64Строка(<ДвоичныеДанные>)
и
<ДвоичныеДанные> = Base64Значение(<Строка>)
Они преобразуются в Base64 и обратно в двоичные данные.
Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.
консультация эксперта
самые свежие новости 1 раз в месяц