Двоичные данные в 1С 8.3
Меню

Двоичные данные в 1С 8.3

Содержание статьи
  1. Объект сериализуется
  2. Примеры по работе с двоичными данными
  3. Двоичные данные и потоки
  4. Работа с Base64

Двоичные данные платформы 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С 8.3 Бухгалтерия
Следующая статья статья
Основные справочники 1С 8.3: создание и изменение элементов
Комментарии