1с где можно хранить двоичные данные
Перейти к содержимому

1с где можно хранить двоичные данные

  • автор:

Хранилище двоичных данных

В версии 8.3.23 в платформе появится новый механизм – хранилище двоичных данных.
Этот механизм предназначен для хранения больших двоичных (Binary Large Objects, BLOB) не в базе данных, а в специализированном хранилище.

Решаемая задача

Часто задачи информационных баз включают в себя не только хранение и обработку интерактивно вносимых данных, но и требуют связки с различными прилагаемыми файлами (сканами документов, фотографиями, аудио- и видеозаписями и т.п.). Например, в 1С:Документообороте к создаваемому договору необходимо приложить скан бумажной версии.
Хранение больших двоичных данных в СУБД влечет ряд проблем, в частности:

  • Двоичные данные хранятся в используемой СУБД вместе с остальной информацией, при этом работа с этими данными конкурирует вместе с остальными операциями в базе данных, что может приводить к высокой нагрузке на аппаратные мощности и, возможно, к падению производительности системы.
  • Хранение больших двоичных данных в СУБД ведет к росту объёма базы, что, в свою очередь, вызывает сложности в эксплуатации самой системы:
    • Проблемы с бэкапом и восстановлением БД.
    • Проблемы с масштабированием системы.
    • Увеличенные сроки обновления и обслуживания БД (долгая дефрагментация и реструктуризация).

    img-01.png

    Использование механизма

    img-02.png

    В стандартных обработках (доступных из пункта меню «Функции для технического специалиста») появится обработка «Управление хранилищем двоичных данных». В этой обработке можно включить и настроить новый механизм.

    У конфигурации, начиная с режима совместимости 8.3.10, появится свойство “Использование хранилища двоичных данных”. При установке этого свойства в «Использовать» все реквизиты типа ХранилищеЗначений, чей размер больше указанного в настройках, будут сохранены в хранилище двоичных данных (при условии, что использование хранилища двоичных данных включено и у хранилища не установлен режим «Только чтение»).
    Включение хранилища двоичных данных для конкретной информационной базы приведет к тому, что часть данных будет храниться как и раньше в СУБД, а часть — в специальном каталоге кластера серверов 1С:Предприятие. Поэтому рекомендуется выполнять резервное копирование и базы данных, и «Хранилища двоичных данных».
    Механизм хранилища двоичных данных доступен только в клиент-серверном варианте работы.
    Использование хранилища двоичных данных абсолютно прозрачно для разработчиков и конечных пользователей; не надо задумываться над тем, используется хранилище или нет, и не надо ничего модифицировать в конфигурации.
    Сейчас использовать механизм хранилища двоичных данных могут только участники программы бета-тестирования. Чтобы стать участником программы бета-тестирования нажмите зелёную кнопку «Пробовать» в начале статьи.

    Сохранение и восстановление данных в Хранилище значений.

    Хранилище значений — это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.

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

     //Изображение, картинки (фотки): 

    ТекИзображение.Объект = СпрТкани.Ссылка;
    ТекИзображение.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
    Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных());
    ТекИзображение.Хранилище = Хранилище.Получить();

    // в этом месте он все выводит .

    ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить();
    ТекИзображение.Записать();
      
    //Табличный документ:
    Процедура СохранитьВХранилищеНажатие(Элемент)
    ТабДок=Новый ТабличныйДокумент;
    ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
    Хранилище=Новый ХранилищеЗначения(ТабДок);
    Записать();
    КонецПроцедуры

    Процедура ВосстановитьИзХранилищаНажатие(Элемент)
    ТабДок=Хранилище.Получить();
    Если ТабДок<>Неопределено Тогда
    ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
    КонецЕсли;
    КонецПроцедуры
     //Произвольные файлы (двоичные данные): 

    ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));

    Восьмерка поддерживает сжатие данных, помещаемых в хранилище:

     ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9)); 
     //Внешние обработки и отчеты: 

    Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
    СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум
    РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:\отчеты\отчет.epf", СтепеньСжатия));
    КонецПроцедуры

    Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
    ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf";
    ДвоичныеДанные = РеквизитТипХранилище.Получить();
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
    ВнешняяОбработка.ПолучитьФорму().Открыть();
    КонецПроцедуры

    Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

    Аренда 1С в облаке

     Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда 
    ДвоичныеДанные = Хранилище.Получить();
    Иначе
    ДвоичныеДанные = Хранилище;
    КонецЕсли;
    ДвоичныеДанные.Записать(ИмяФайла);

    Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

     ЗапуститьПриложение(ИмяФайла); 

    Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
    Код 1C v 8.х

     РеквизитХранилище = Неопределено; 

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

    К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
    Такой вариант не работает:
    Код 1C v 8.х

     фл=Хранилище<>Неопределено; 

    Работает только такой вариант:
    Код 1C v 8.х

     фл=Хранилище.Получить()<>Неопределено; 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Программа 1С 8.3: Двоичные данные

    Двоичные данные в системе 1С – это довольно многофункциональный объект, который относится ко встроенному языку 1С программирования и отвечает за проведение действий с файлами. Пользуясь объектом «ДвоичныеДанные» появляется возможность представления какого-либо файла в виде упорядоченной последовательности из байта.
    Объект «ДвоичныеДанные» есть и в толстом клиенте, и в тонком клиенте, и в мобильном приложении 1С, и для серверов, и для внешнего соединения.

    2. Особенности объекта системы 1С «ДвоичныеДанные»

    Важно отметить особенность объекта «ДвоичныеДанные» — это возможность проводить сериализацию и из, и в XML и XDTO. Также объект можно задействовать для реквизитов управляемой формы.
    Замечание: тип объекта XDTO, который будет ставиться в соответствие объекту «ДвоичныеДанные» определён внутри пространства имён, его имя должно быть или base64Binary, или hexBinary.
    Так как, уже говорилось выше, что использование двоичных данных возможно и на сервере, и на клиенте, то это способствует вольной передаче файлов в двоичном виде между сервером и клиентом. Но, несмотря на такую возможность, лучше, всё-таки, использовать хранилище значений 1С 8.3 для переправки файлов.

    3. Использование двоичных данных 1С 8.3

    Далее представлен перечень задач, в которых может быть использован объект «ДвоичныеДанные», что подтверждает их значимость: · Переправка различных файлов между сервером и клиентом; · Переправка вложений из сообщений в электронных письмах; · Переправка файловых данных во время работы протокола HTTP; · При помощи «ХранилищаЗначения» — хранение файлов в информационной базе 1С 8; · Представление файлов в текстовом формате; · Методы криптографии. На скриншоте с программным кодом 1С ниже представлено то, как обеспечить чтение двоичных данных и провести отправку с клиента на сервер:

    4. Процедура сохранения файла 1С внутри базы при помощи «ДвоичныхДанных»

    Довольно частый способ использования объекта «ДвоичныеДанные» — это сохранение файлового документа внутри информационной базы 1С 8. Чтобы файл хранился в двоичных данных 1С 8.3 – нужно внутри объекта внести реквизит, тип которого будет «ХранилищеЗначений».
    Далее демонстрируется программный код 1С для работы с реквизитами по заполнению значений 1С:

    А это программный код 1С для получения значений:

    5. Объект «ДвоичныеДанные» с использованием протоколом HTTP

    Возьмём такой пример – пусть нужно скачать изображение из сети Интернет и отобразить его в управляемой форме 1С 8. В таком случае, добавим реквизит, тип которого будет «ХранилищеЗначения», куда и будет перемещено изображение двоичного формата.

    Программный код функции, который отвечает за скачивание изображения выглядит следующим образом:

    А используется программно так:

    Далее можно увидеть, что внутри реквизита «Аватар» находятся данные изображения в двоичном виде. Переведём изображение на форму, которая является управляемой, для этого добавляем реквизит формы «Тип строка 1С» и переносим его на форму.
    Можно воспользоваться и другим способом, а именно: вручную создать новый элемент формы, внутри поля «Путь к данным» прописать реквизит «Картинка», а вид поменять на «Поле картинки 1С», как показано на скриншоте ниже:

    Для события «ПриСозданииНаСервере» нужно написать следующее, после чего, изображение появится на форме:

    6. Действия между объектом «ДвоичныеДанные» и потоками в конфигурации 1С Предприятие

    При работе с объектом «ДвоичныеДанные» нужно рассказать о том, как они могут взаимодействовать с потоками. Это взаимодействие происходит при помощи метода «ОткрытьПотокДляЧтения». Предположим, для примера, что в нашей информационной базе 1С 8 находится тип xml-файл, который заархивирован. И требуется отобразить для пользователя данные из этого файла.
    Если не использовать потоки, а просто задействовать объект «ДвоичныеДанные», то порядок действий будет следующим: 1. Получение данных в двоичном виде из информационной базы 1С 8; 2. Внесение этих данных во временный файл 1С 8.3; 3. Проведение процедуры разархивации данных; 4. Действие по удалению временного файла; 5. И чтение готового файла, со снятой архивацией. В случае работы с потоками, ряд действий будет таким: 1. Получение данных в двоичном виде из информационной базы 1С 8; 2. Проведение открытия потока, который обеспечит чтение; 3. Проведение процедуры разархивации данных; 4. Чтение готового файла, со снятой архивацией.
    Программный код 1С для процедуры, в которой потоки не задействуются:

    Программный код 1С для процедуры с использованием потока:

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

    Для начала, стоит оговорить, что Base64 1С – это некий стандарт, который отвечает за кодировку двоичных данных в строчный вид. Чтобы сериализовать тип «ДвоичныеДанные» нужно воспользоваться внутренним объектом «СериализаторXDTO». После проведения сериализации, данные будут отображены в виде одного узла base64Binary, который состоит из упорядоченной последовательности байт, которые имеют кодировку формата Base64 1С.
    Также, стоит отметить, что в системе на базе 1С существуют функции кодировки двоичных данных без сериализации – это:


    Специалист компании «Кодерлайн» Айдар Фархутдинов

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

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