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

В стандартных обработках (доступных из пункта меню «Функции для технического специалиста») появится обработка «Управление хранилищем двоичных данных». В этой обработке можно включить и настроить новый механизм.
У конфигурации, начиная с режима совместимости 8.3.10, появится свойство “Использование хранилища двоичных данных”. При установке этого свойства в «Использовать» все реквизиты типа ХранилищеЗначений, чей размер больше указанного в настройках, будут сохранены в хранилище двоичных данных (при условии, что использование хранилища двоичных данных включено и у хранилища не установлен режим «Только чтение»).
Включение хранилища двоичных данных для конкретной информационной базы приведет к тому, что часть данных будет храниться как и раньше в СУБД, а часть — в специальном каталоге кластера серверов 1С:Предприятие. Поэтому рекомендуется выполнять резервное копирование и базы данных, и «Хранилища двоичных данных».
Механизм хранилища двоичных данных доступен только в клиент-серверном варианте работы.
Использование хранилища двоичных данных абсолютно прозрачно для разработчиков и конечных пользователей; не надо задумываться над тем, используется хранилище или нет, и не надо ничего модифицировать в конфигурации.
Сейчас использовать механизм хранилища двоичных данных могут только участники программы бета-тестирования. Чтобы стать участником программы бета-тестирования нажмите зелёную кнопку «Пробовать» в начале статьи.1с где можно хранить двоичные данные
Идея была какова. Хранить изображение для каждого элемента справочника клиенты в его реквизите в двоичных данных. Удобно при обменах. А при открытии этого элемента из реквизита в картинку.
(5) В СП набери:
-ХранилищеЗначения
-ДвоичныеДанные(5) посмотри как картинки организованы в той же торговле
(5) в его реквизите только не надо плиз, череватоХранилищеКартинки = Новый ХранилищеЗначения(ЭлементыФормы.ПолеКартинки2.Картинка);
Изображение = ХранилищеКартинки;потом при открытии элемента справочник пишу:
ЭлементыФормы.ПолеКартинки2.Картинка = Изображение.Получить();Запись работает.
Достать из хранилища не получается
Получилось.
ЭлементыФормы.ПолеКартинки2.Картинка = Новый Картинка(Изображение.Получить());
хорошая идея 🙂 только уже все реализовано до вас 🙂Только теперь вопрос:
Я так понимаю хранилище не хранит в себе данные постоянно а только до определенного момента.
Т.е. в любом случае нужно хранить изображения в виде файлов.
И если у меня 200 переферийных баз и нужно организовать односторонний обмен — то мне каким то левым боком нужно будет гонять сами файлы.Я так понимаю хранилище не хранит в себе данные постоянно а только до определенного момента — не правильно.
(17) ссори промахнулся. т.е. хранилище специально и создано для хранения картинок и др. прям в самой базе?
(16) А может ЖКК почитать?
Или справочник сделать с реквизитом типа ХранилищеЗначений.
Можно его еще в план обмена включить.Вот всегда так на мисте — 5 минут позора но зато тележка знаний. А некоторые поглумились и счастливые.
Большое спасибо всем кто помогал.
капец базе с этими картинками.
во внешних файлах надо хранить всю эту анимацию — также открывать как и из роеквизита.
на сервре организовал том для файло помойки и все или веб-сервис
хранилище это тлеющая подводная мина которая бабахнет если ее набивать четри чем
(24) или ftp
(29) выбирать где хранить файлы в базе или на диске
тут можно хоть немного подробнее плиз.Я так понимаю что если на диске то в справочнике я храню ссылку на файл на диске. Гонять прийдется как то так.
или можно сделать отдельную базу для хранения файлов и юзать ее по оле
Кусок кода из УПП Справочник Номенклатура
НовыйОбъект = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
НовыйОбъект.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
НовыйОбъект.Хранилище = Новый ХранилищеЗначения(ВыбранноеИзображение, Новый СжатиеДанных);
НовыйОбъект.Объект = ОбъектВладелец;
НовыйОбъект.ИмяФайла = ПолучитьИмяФайлаИзПолногоПути(ДиалогОткрытияФайла.ПолноеИмяФайла);не хранит она в файлах.
если центральная база SQLная + хранить все в бинарном виде + сжатие + размер файла 50к
что сдесь минного?(25) Аргументируйте плиз.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший
Двоичные данные в 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.2 и 8.3
Начиная с версии технологической платформы 8.3.9 средства для работы с двоичными данными претерпели существенные изменения. В этой статье я постараюсь рассказать как о старых, так и о новых инструментах для работы с двоичными данными. При написании статьи использовалась версия технологической платформы 8.3.12
Общая информация
Если раньше, до версии технологической платформы 8.3.9, мы располагали только объектом ДвоичныеДанные, то к настоящему времени у нас имеется целый набор объектов, которые серьезно расширяют наши возможности по манипуляциям с двоичными данными. Рассмотрим все эти объекты чуточку подробнее.
Двоичные данные
Экземпляры объекта ДвоичныеДанные содержат двоичные данные, которые считываются из файла. При это объект ДвоичныеДанные является достаточно многофункциональным — мы можем:
- читать двоичные данные из файла и записывать их в файл;
- передавать их между клиентом и сервером при помощи временного хранилища;
- передавать и получать их по сети;
- хранить их базе данных в реквизитах вида ХранилищеЗначения;
- превратить двоичные данные в объект вида Картинка (при определенных условиях конечно);
- хранить двоичные данные в макетах;
- шифровать и расшифровывать, подписывать и проверять подписи;
Наверняка я что-то пропустил, но главное должно быть понятно — несмотря на значительное развитие средств работы с двоичными данными, объект ДвоичныеДанные остается ключевым.
Потоки
Это группа объектов назначение которых заключается в работе с потоками данных.
Поток — этот объект представляет собой поток данных из которого можно читать и/или записывать в него данные. Данный объект не имеет конструктора, а получить экземпляр объекта можно при помощи различных методов других объектов.
ФайловыйПоток — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в файлах на диске.
ПотокВПамяти — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в оперативной памяти.
МенеджерФайловыхПотоков — этот объект предоставляет типовые методы для работы с файлами (открытие и создание). Создать экземпляр этого объекта нельзя — имеется объект глобального контекста ФайловыеПотоки который и предоставляет доступ к методам менеджера.
Чтение и запись
ЧтениеДанных — этот объект предназначен для чтения различных типов данных из различных источников (потоки, файлы, двоичные данные).
РезультатЧтенияДанных — этот объект содержит описание результата чтения данных из потока. Объект не имеет конструктора, получить экземпляр объекта можно при помощи методов других объектов.
БуферДвоичныхДанных — этот объект представляет собой коллекцию байтов фиксированного размера, имеется возможность произвольного доступа и изменения по месту.
ЗаписьДанных — этот объект предназначен для записи различных типов данных в приемник.
Практическая часть
Итак, у нас достаточно много различных объектов, которые, в свою очередь, имеют много разных свойств и методов. Разобраться во всем этом более подробно помогут практические примеры, к ним и перейдем.
Многие объекты — ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти, ЧтениеДанных, ЗаписьДанных, РезультатЧтенияДанных имеют пары синхронных и асинхронных методов, например: Записать — НачатьЗапись, Закрыть — НачатьЗакрытие. Асинхронные методы нужны для обеспечения возможности одинаковой работы и в тонком клиенте, и в веб-клиенте.
Подробнее про синхронные и асинхронные методы можно прочесть в этой статье.
Двоичные данные
Ниже приведены примеры основных операций с объектом ДвоичныеДанные.
Процедура РаботаСДвоичнымиДаннымиВ1С(Команда)
//создаем двоичные данные из файла
ДвоичныеДанные = Новый ДвоичныеДанные(«D:\test.png»);
//получаем размер двоичных данных
Сообщить(«Размер файла: «+ДвоичныеДанные.Размер()+» байт»);
//кодируем двоичные данные в строку по алгоритму base64
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
//и раскодируем обратно
ДвоичныеДанные = Base64Значение(СтрокаBase64);
Сообщить(СтрокаBase64);
//создаем картинку из двоичных данных
Картинка = Новый Картинка(ДвоичныеДанные);
//помещаем во временное хранилище и передаем адрес на сервер
ПолучитьДвоичныеДанныеНаСервере(ПоместитьВоВременноеХранилище(ДвоичныеДанные));
КонецПроцедуры
Процедура ПолучитьДвоичныеДанныеНаСервере(Адрес)
//получаем двоичные данные из временного хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
//записываем двоичные данные в файл на сервере
ДвоичныеДанные.Записать(«D:\serv-test.png»);
//помещаем двоичные данные в объект ХранилищеЗначения
Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные);
КонецПроцедурыПотоки
В начале создадим файловый поток из PNG-файла и прочитаем первые 8 байт — они у изображений в формате PNG всегда такие: 137,80,78,71,13,10,26,10. При создании объекта ЧтениеДанных указан порядок байтов — BigEndian, подробнее об этом можно прочесть тут.

Процедура РаботаСПотокамиВ1С(Команда)
//создадим фаловый поток
ФайловыйПоток = ФайловыеПотоки.ОткрытьДляЧтения(«D:\test.png»);
//размер файла
Сообщить(«Размер файла: «+ФайловыйПоток.Размер()+» байт»);
//создадим необходимый объект для чтения данных из потока
ЧтениеДанных = Новый ЧтениеДанных(ФайловыйПоток, КодировкаТекста.ANSI, ПорядокБайтов.BigEndian);
//считаем первые восемь байт в буфер
Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(8);
//пройдемся по каждому байту буфера
Для Каждого Байт Из Буфер Цикл
Сообщить(Строка(Байт));
КонецЦикла;
//этот цикл делает тоже самое что и предыдущий
Для Номер = 0 По 7 Цикл
Сообщить(Строка(Буфер[Номер]));
КонецЦикла;
КонецПроцедурыТеперь попробуем отправить составное (multipart) HTTP-сообщение. У меня на сервере есть PHP-скрипт вот такого содержания:
Отошлем ему две картинки из библиотеки картинок и посмотрим, что получится:
Процедура Проверить3(Команда)
//подготавливаем вложенные сообщенияДвоичныеДанные1 = ПодготовитьКартинку(«image1», «image1.png», БиблиотекаКартинок.АктивироватьЗадачу);
ДвоичныеДанные2 = ПодготовитьКартинку(«image2», «image2.png», БиблиотекаКартинок.АктивныеПользователи);
Разделитель = «boundary»;
//устанавливаем заголовки основного сообщения
Заголовки = Новый Соответствие();
Заголовки.Вставить(«Content-Type», «multipart/form-data; boundary crayon-line crayon-striped-line» >
//формируем основное сообщение
ПотокВПамяти = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
ЗаписьДанных.ЗаписатьСтроку(«—«+Разделитель);
ЗаписьДанных.Записать(ДвоичныеДанные1);
ЗаписьДанных.ЗаписатьСтроку(«»);
ЗаписьДанных.ЗаписатьСтроку(«—«+Разделитель);
ЗаписьДанных.Записать(ДвоичныеДанные2);
ЗаписьДанных.ЗаписатьСтроку(«»);
ЗаписьДанных.ЗаписатьСтроку(«—» + Разделитель + «—«);
ЗаписьДанных.Закрыть();
ТелоЗапроса = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
//отправляем данные скрипту
Соединение = Новый HTTPСоединение(«server.ru»,443. Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(«/script.php», Заголовки);
Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецПроцедуры
Функция ПодготовитьКартинку(Название, ИмяФайла, Картинка)
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
//устанавливаем заголовкиЗаписьДанных.ЗаписатьСтроку(«Content-Disposition: form-data; name=» + Название + «; filename crayon-line crayon-striped-line» > ЗаписьДанных.ЗаписатьСтроку(«Content-Type: image/png»);
ЗаписьДанных.ЗаписатьСтроку(«»);
ЗаписьДанных.Записать(Картинка.ПолучитьДвоичныеДанные());
ЗаписьДанных.Закрыть();
Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
На этом все, надеюсь, что эта статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Оценка статьи:



(оценок: 12, средняя оценка: 3,50 из 5) 8 71 953 просмотров
Понравилась статья? Поделиться с друзьями:
Вам также может быть интересно
Типы данных 4 97 604 просмотров
Число — это один из примитивных типов данных существующих в 1С. Числа в 1С:Предприятии
Типы данных 4 82 220 просмотров
Дата — это один из примитивных типов данных существующих в 1С. Также как числа
Типы данных 3 79 612 просмотров
Строка — это один из примитивных типов данных существующих 1С и работать с ним
Комментарии: 8
Евгений 01.02.2021 в 23:36
нихрена не понял.
как из входящих писем вытащить вложения и прикрепить их как файлы к внутр.доку-ту в 1С документообороте.
уже неделю зависаю. Email = Новый ИнтернетПочта;
Email.Подключиться(Профиль,ПротоколИнтернетПочты.IMAP); МассивВходящихПисем = Новый Массив;
МассивВходящихПисем = Email.Выбрать(Ложь,,Ложь); Для каждого Письмо Из МассивВходящихПисем Цикл
Если СтрНайти(Письмо.Тема,»Заявка на доработку ИС»)>0 Тогда
Сообщить(«Нашлось письмо по Заявке на доработку ИС»); Заявка = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
Заявка.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию(«Заявка на доработку ИС»);
Заявка.ДатаСоздания = ТекущаяДата();
ШаблоныДокументов.ЗаполнитьРеквизитыДокументаПоШаблону(
Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию(«Заявка на доработку ИС»),Заявка);
Заявка.Содержание = Письмо.Тексты[0].Текст;
Заявка.Подготовил = Заявка.Ответственный;
Заявка.Записать(); что дальге надо писать. прикрепленные файлы находятся в Письмо.Вложения[].Данные (это и есть двлич.данные)….как из них получить файл и потом прикрутить к Заявке? вот это вот не работает:
ВложенияВоВременномХранилище = РаботаСПочтовымиСообщениямиСлужебный.ОписанияВложений(Письмо);
РаботаСФайламиСлужебныйВызовСервера.УстановитьВладельцаФайла(ВложенияВоВременномХранилище,Заявка);esqado 27.01.2022 в 11:45
Была похожая задачка.
Проверял входящие по отправителю, выдёргивал вложения и складывал в директорию.
Потом пробегал по файлам (excel), через табдок считывал внутренности и записывал в бд.
В твоём случае, в объекте письмо должно находиться вложение.
Это вложение нужно записать как файл (временный файл) и прочитать через двоичные данные.esqado 27.01.2022 в 11:46
И ещё: для вложений лучше использовать отдельный справочник, а в документе оставлять ссылку (адрес) на элемент справочника.
Таким образом ты немного облегчишь документ. Удачи!Игорь 25.06.2021 в 15:20
Ну наверно так считать
ИмяВременногоФайла = КаталогВременныхФайлов()+»Вложение.bin»;
Письмо.Вложения[0].Данные.Записать(ИмяВременногоФайла);
а уж как прикрутить, то во «внутреннем документе» наверно есть какое-то поле, куда его можно загрузить
