Хранилище двоичных данных
В версии 8.3.23 в платформе появится новый механизм – хранилище двоичных данных.
Этот механизм предназначен для хранения больших двоичных (Binary Large Objects, BLOB) не в базе данных, а в специализированном хранилище.
Решаемая задача
Часто задачи информационных баз включают в себя не только хранение и обработку интерактивно вносимых данных, но и требуют связки с различными прилагаемыми файлами (сканами документов, фотографиями, аудио- и видеозаписями и т.п.). Например, в 1С:Документообороте к создаваемому договору необходимо приложить скан бумажной версии.
Хранение больших двоичных данных в СУБД влечет ряд проблем, в частности:
- Двоичные данные хранятся в используемой СУБД вместе с остальной информацией, при этом работа с этими данными конкурирует вместе с остальными операциями в базе данных, что может приводить к высокой нагрузке на аппаратные мощности и, возможно, к падению производительности системы.
- Хранение больших двоичных данных в СУБД ведет к росту объёма базы, что, в свою очередь, вызывает сложности в эксплуатации самой системы:
- Проблемы с бэкапом и восстановлением БД.
- Проблемы с масштабированием системы.
- Увеличенные сроки обновления и обслуживания БД (долгая дефрагментация и реструктуризация).

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

В стандартных обработках (доступных из пункта меню «Функции для технического специалиста») появится обработка «Управление хранилищем двоичных данных». В этой обработке можно включить и настроить новый механизм.
У конфигурации, начиная с режима совместимости 8.3.10, появится свойство “Использование хранилища двоичных данных”. При установке этого свойства в «Использовать» все реквизиты типа ХранилищеЗначений, чей размер больше указанного в настройках, будут сохранены в хранилище двоичных данных (при условии, что использование хранилища двоичных данных включено и у хранилища не установлен режим «Только чтение»).
Включение хранилища двоичных данных для конкретной информационной базы приведет к тому, что часть данных будет храниться как и раньше в СУБД, а часть — в специальном каталоге кластера серверов 1С:Предприятие. Поэтому рекомендуется выполнять резервное копирование и базы данных, и «Хранилища двоичных данных».
Механизм хранилища двоичных данных доступен только в клиент-серверном варианте работы.
Использование хранилища двоичных данных абсолютно прозрачно для разработчиков и конечных пользователей; не надо задумываться над тем, используется хранилище или нет, и не надо ничего модифицировать в конфигурации.
Сейчас использовать механизм хранилища двоичных данных могут только участники программы бета-тестирования. Чтобы стать участником программы бета-тестирования нажмите зелёную кнопку «Пробовать» в начале статьи.Сохранение и восстановление данных в Хранилище значений.
Хранилище значений — это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.
Тип Хранилище значения может быть назначен реквизиту справочника, документа, ресурсу регистра сведений и т.д.
//Изображение, картинки (фотки):
ТекИзображение.Объект = СпрТкани.Ссылка;
ТекИзображение.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных());
ТекИзображение.Хранилище = Хранилище.Получить();
// в этом месте он все выводит .
ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить();
ТекИзображение.Записать();
//Табличный документ:
Процедура СохранитьВХранилищеНажатие(Элемент)
ТабДок=Новый ТабличныйДокумент;
ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
Хранилище=Новый ХранилищеЗначения(ТабДок);
Записать();
КонецПроцедуры
Процедура ВосстановитьИзХранилищаНажатие(Элемент)
ТабДок=Хранилище.Получить();
Если ТабДок<>Неопределено Тогда
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
КонецЕсли;
КонецПроцедуры//Произвольные файлы (двоичные данные):
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));//Внешние обработки и отчеты:
Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум
РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:\отчеты\отчет.epf", СтепеньСжатия));
КонецПроцедуры
Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf";
ДвоичныеДанные = РеквизитТипХранилище.Получить();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ВнешняяОбработка.ПолучитьФорму().Открыть();
КонецПроцедурыЕсли это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
ДвоичныеДанные = Хранилище.Получить();
Иначе
ДвоичныеДанные = Хранилище;
КонецЕсли;
ДвоичныеДанные.Записать(ИмяФайла);Если это был, например, 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С существуют функции кодировки двоичных данных без сериализации – это:
Специалист компании «Кодерлайн» Айдар Фархутдинов