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С
Любой файл можно представить в виде двоичных данных и загрузить в ХранилищеЗначений.
При преобразовании двоичных данных в объект ХранилищеЗначения используется конструкция новый ХранилищеЗначения(Данные,Сжатие) с двумя параметрами:
- Данные — двоичные данные, которые нужно поместить в хранилище
- Сжатие — степень сжатия алгоритма 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 кодов, ключей шифрования, картинок, или при декодировании формата обмена с торговым оборудованием.
На этом все, надеюсь, статья структурировала ваше представлении о двоичных данных, и была хоть немного полезна.