Перейти к содержимому

Как сохранить двоичные данные в файл 1с

  • автор:

1С 8.3 Хранилище значений — Программист 1С Минск. Автоматизация бизнеса.

// Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
СправочникСтранаСсылка = Справочники . Страны . НайтиПоНаименованию ( «Испания» );
Если Не СправочникСтранаСсылка . Пустая () Тогда
// Изменим и запишем численность жителей в стране
СтранаИспания = СправочникСтранаСсылка . ПолучитьОбъект ();
СтранаИспания . ХранилищеЗначения = Хранилище_Зн ;
СтранаИспания . Записать ();
КонецЕсли;

// *** 2.Пример (Табличный документ):
ЗначенияТабДок = Новый ТабличныйДокумент ;
ЗначенияТабДок . Вывести ( ЭлементыФормы . ПолеТабличногоДокумента1 );
Хранилище_ТабДок = Новый ХранилищеЗначения ( ЗначенияТабДок );

// *** 3.Пример (Структура):
ЗначенияСтр = Новый Структура (); // Создание значения «Структура»
ЗначенияСтр . Вставить ( «Код» , «34» );
ЗначенияСтр . Вставить ( «Наименование» , «Испания» );
ЗначенияСтр . Вставить ( «Описание» , «Европейская страна, расположенная на Пиренейском полуострове» );
ЗначенияСтр . Вставить ( «Население» , 46600000 );
// Вставка в хранилище значений
Хранилище_Стр = Новый ХранилищеЗначения ( ЗначенияСтр , Новый СжатиеДанных ( 9 )); // «9» — макс.степень сжатия
ЗначениеВФайл ( «D:\import\» , Хранилище_Стр ); // Сохранение значения в файл

// *** 4.Пример (Любой файл) :
ФайлДвоичныеДанные = Новый ДвоичныеДанные ( «D:\import\КлиентБанк_РБ.exe» );
Хранилище_Файл = Новый ХранилищеЗначения ( ФайлДвоичныеДанные , Новый СжатиеДанных ( 0 )); // «0» — без сжатия

// *** 5.Пример (Файл картинка) :
ФайлФото = Новый Картинка ( «D:\import\ФотоСотрудника.png» );
Хранилище_Фото = Новый ХранилищеЗначения ( ФайлФото , Новый СжатиеДанных ( 5 )); // «5» — средн.степень сжатия

// *** 6.Пример (Текстовый файл) :
ФайлТекст = Новый ЧтениеТекста ( «D:\import\Война_и_мир.txt» );
ТекстИзФайла = ФайлТекст . Прочитать ();
Хранилище_Текст = Новый ХранилищеЗначения ( ТекстИзФайла , Новый СжатиеДанных ( 1 )); // «1» — мин.степень сжатия

// *** 7.Пример (Отчет/обработка 1С) :
Хранилище_Epf = Новый ХранилищеЗначения ( Новый ДвоичныеДанные ( «D:\import\Otchet_realizacija_2020.epf» , СтепеньСжатия ));

// Двоичные данные можно восстановить из хранилища значения методом Получить и записать в файл методом Записать()
Если ТипЗнч ( РеквизитХранилище ) = Тип ( «ДвоичныеДанные» ) Тогда

// Хранилище.Получить()<>Неопределено Тогда // Процедура извлекает данные из хранилища (требует времени)
// Для больших объемов данных рекомендуется использовать доп.реквизит (Например: Булево) Содержит данные — Истина
ДанныеХранилища = РеквизитХранилище . Получить ();
Если ДанныеХранилища = Неопределено Тогда
Сообщить ( «Ошибка получения данных из хранилища значений 1С» );
КонецЕсли;
ДанныеХранилища . Записать ( ИмяФайла ); // Записываем восстановленые данные в файл

// Восстановление Табличного документа
ЭлементыФормы . ПолеТабличногоДокумента1 . Вывести ( ДанныеХранилища );

// Восстановление и запуск Отчета/обработки 1С
ИмяФайла_Epf = «D:\import\Otchet_realizacija_2020.epf» ;
ДвоичныеДанные = РеквизитХранилище . Получить ();
ДвоичныеДанные . Записать ( ИмяФайла_Epf );
Epf = ВнешниеОбработки . Создать ( ИмяФайла_Epf );
Epf . ПолучитьФорму (). Открыть ();

Иначе
ДанныеХранилища = РеквизитХранилище ;
КонецЕсли;

// Файлы зарегистрированного типа (doc, xls, pdf, jpg, txt, exe. )
ЗапуститьПриложение ( ИмяФайла );

Работа с файлами в 1С

Технологическая платформа 1С:Предприятие 8 позволяет сохранять в информационной базе произвольные файлы, получать их оттуда и использовать различными способами. Рассмотрим эти операции на примерах.

Перед выполнением загрузки файла в информационную базу 1С нужно получить полный адрес файла на диске. Работа с диалогами выбора файлов описана в отдельной статье.

Для хранения файлов используется реквизит (или ресурс регистра) с типом ХранилищеЗначения.

Загрузка произвольного файла в информационную базу 1С

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

При преобразовании двоичных данных в объект ХранилищеЗначения используется конструкция новый ХранилищеЗначения(Данные,Сжатие) с двумя параметрами:

  1. Данные — двоичные данные, которые нужно поместить в хранилище
  2. Сжатие — степень сжатия алгоритма Deflation. Целое число в диапазоне -1…9. -1 — степень сжатия по умолчанию. 0 — никакого сжатия, 9 — максимальная степень сжатия. Значение по умолчанию: -1. Параметр необязательный, если не указан, то сжатие не используется.

//В переменной Путь находится полный адрес файла на диске

//Преобразуем файл в двоичные данные
Файл = Новый ДвоичныеДанные ( Путь ) ;

//Создаем новый объект ХранилищеЗначения
//ХранилищеДанных — реквизит объекта с типом ХранилищеЗначения
ХранилищеДанных = Новый ХранилищеЗначения ( Файл , Новый СжатиеДанных ( 9 ) ) ;

Сохранение произвольного файла из информационной базы 1С на диск

Для сохранения файла из базы 1С на диск нужно определить путь и имя файла. Для этого существует диалог сохранения файлов, работа с которым описана в отдельной статье.

//Получаем двоичные данные из хранилища
//ХранилищеДанных — реквизит объекта с типом ХранилищеЗначения
Данные = ХранилищеДанных . Получить ( ) ;

//Записываем полученные данные на диск
//В переменной Путь находится полный адрес файла на диске
Данные . Записать ( Путь ) ;

Просмотр файла, находящегося в информационной базе 1С

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

//Получаем имя временного файла с необходимым расширением
//В переменную Расширение нужно поместить расширение файла, например "pdf"
Путь = ПолучитьИмяВременногоФайла ( Расширение ) ;

//Получаем данные из хранилища
//ХранилищеДанных — реквизит объекта с типом ХранилищеЗначения
Данные = ХранилищеДанных . Получить ( ) ;

//Записываем данные во временный файл
Данные . Записать ( Путь ) ;

//Пытаемся открыть файл в предназначенном для него приложении
//Если приложение не найдено, появится системный диалог "Открыть с помощью. "
ЗапуститьПриложение ( Путь ) ;

Работа с двоичными данными в 1С 8.2 и 8.3

Начиная с версии технологической платформы 8.3.9 средства для работы с двоичными данными претерпели существенные изменения. В этой статье я постараюсь рассказать как о старых, так и о новых инструментах для работы с двоичными данными. При написании статьи использовалась версия технологической платформы 8.3.12

Общая информация

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

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

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

  • читать двоичные данные из файла и записывать их в файл;
  • передавать их между клиентом и сервером при помощи временного хранилища;
  • передавать и получать их по сети;
  • хранить их базе данных в реквизитах вида ХранилищеЗначения;
  • превратить двоичные данные в объект вида Картинка (при определенных условиях конечно);
  • хранить двоичные данные в макетах;
  • шифровать и расшифровывать, подписывать и проверять подписи;

Наверняка я что-то пропустил, но главное должно быть понятно — несмотря на значительное развитие средств работы с двоичными данными, объект ДвоичныеДанные остается ключевым.

Потоки

Это группа объектов назначение которых заключается в работе с потоками данных.

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

ФайловыйПоток — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в файлах на диске.

ПотокВПамяти — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в оперативной памяти.

МенеджерФайловыхПотоков — этот объект предоставляет типовые методы для работы с файлами (открытие и создание). Создать экземпляр этого объекта нельзя — имеется объект глобального контекста ФайловыеПотоки который и предоставляет доступ к методам менеджера.

Чтение и запись

ЧтениеДанных — этот объект предназначен для чтения различных типов данных из различных источников (потоки, файлы, двоичные данные).

РезультатЧтенияДанных — этот объект содержит описание результата чтения данных из потока. Объект не имеет конструктора, получить экземпляр объекта можно при помощи методов других объектов.

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

ЗаписьДанных — этот объект предназначен для записи различных типов данных в приемник.

Практическая часть

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

Многие объекты — ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти, ЧтениеДанных, ЗаписьДанных, РезультатЧтенияДанных имеют пары синхронных и асинхронных методов, например: ЗаписатьНачатьЗапись, ЗакрытьНачатьЗакрытие. Асинхронные методы нужны для обеспечения возможности одинаковой работы и в тонком клиенте, и в веб-клиенте.

Подробнее про синхронные и асинхронные методы можно прочесть в этой статье.

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

Ниже приведены примеры основных операций с объектом ДвоичныеДанные.

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

В статье рассматриваются двоичные данные, способы их хранения в 1С, примеры использования, а также примеры программного кода для работы с двоичными данными.

Содержание

Что хранится в двоичных данных?

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

Где хранить двоичные данные в базе 1С?

Двоичные данные можно хранить несколькими способами.

В макетах с типом “Двоичные данные”, в объектах конфигурации. В этом случае запись двоичных данных в макет производится еще на этапе разработки конфигурации.

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

В реквизитах типа строка, в формате base64, в Base 16 (Hex), либо в виде строки в указанной кодировке. Рассмотрим пример. Допустим, у нас есть текстовый файл с содержимым “Тест тест тест”, который мы прочитали в виде двоичных данных в переменную ДД. Платформа предусматривает несколько методов получения строки из двоичных данных, каждому из которых соответствует обратный метод – формирование двоичных данных из строки того или иного формата.

Где применяются двоичные данные в 1С?

Чаще всего, двоичные данные в 1С используются в следующих случаях:

  • Внешние компоненты – для подключения торгового оборудования, или для решения задач, которые средствами платформы сложно или вовсе невозможно решить;
  • Хранение файлов внешних отчетов и обработок;
  • Вывод изображений на форму (на экран) или в печатный документ;
  • Прикрепленные файлы – любые файлы, имеющие отношение к конкретным объектам базы – например, сканы договоров, презентации, документы, и т.д.
  • вложения электронных писем или html-документов
  • шифрование и использование криптографии, в частности, электронные подписи
  • получение файлов по сети, например при помощи http-сервисов
  • Хранение xml-файлов – например, настроек обмена, xml-схем, и т.д.

Как работать с двоичными данными в 1С?

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

  • получить из строки (см. выше)
  • прочитать из реквизита с типом ХранилищеЗначения:
    НужнаяНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(“Нужная номенклатура”);
    ДвоичныеДанные = НужнаяНоменклатура.ХранилищеДвоичныхДанных.Получить();
  • Получить как тело ответа http-сервиса:
    //HTTPОтвет = результат выполнения http-запроса.
    HTTPОтвет.ПолучитьТелоКакДвоичныеДанные()
  • Получить как данные почтового вложения
    ПочтовоеВложение.Данные
  • Получить как исходные данные интернет почтового сообщения
    ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные

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

дд = Новый ДвоичныеДанные(ПутьКФайлу);
СпрКартинка = Справочники.Картинки.Картинка; //Картинка – реквизит с типом ХранилищеЗначения
Об = СпрКартинка.ПолучитьОбъект();
Об.Картинка = Новый ХранилищеЗначения(дд);
Об.Записать();

Либо в реквизит с типом Строка неограниченной длины. О том, как преобразовать двоичные данные в строку – чуть выше.
Ну и кроме того, двоичные данные нужны для того, чтобы сохранить их в файл. Для того чтобы это сделать, предусмотрены целых три метода!

  • Записать – стандартный синхронный метод, который записывает двоичные данные в файл. При этом платформа будет ожидать окончания выполнения записи, прежде чем продолжить выполнение кода.
  • НачатьЗапись – асинхронная процедура, которая не блокирует выполнение кода. При этом по завершении записи в файл, будет вызвана процедура-обработчик.
  • ЗаписатьАсинх – новый вариант асинхронной записи, появившийся в версии 8.3.18.

Потоки и побитовые операции с двоичными данными в 1С.

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

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

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

Добавить комментарий

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