При разработке прикладных решений в системе 1С:Предприятие часто возникает необходимость хранить в базе данных произвольные файлы (шаблоны печатных форм в формате Word или Excel, сканы документов, архивы или картинки). Для хранения таких объектов в реквизитах справочников и документов используется тип ХранилищеЗначения. Рассмотрим подробнее, как правильно извлечь сохраненные файлы из хранилища и выгрузить их на диск в виде объекта ДвоичныеДанные.
Объект ХранилищеЗначения выступает в роли специального контейнера платформы, предназначенного для помещения любых сериализуемых данных в сжатом или несжатом виде. Сам по себе объект ХранилищеЗначения не имеет методов прямой записи на диск (таких как метод записи в файл), поскольку он лишь оборачивает сохраненный тип данных.
Чтобы получить доступ к содержимому, необходимо выполнить метод Получить(). Этот метод распаковывает контейнер и возвращает исходный объект ровно в том типе, в котором он был туда помещен при инициализации (например, ДвоичныеДанные, ТабличныйДокумент, Картинка или Структура).
Разберем стандартную последовательность действий для выгрузки файла шаблона из хранилища на диск:
ПолучитьИмяВременногоФайла() резервируем путь во временном каталоге операционной системы с нужным расширением.Получить() у целевого реквизита.Записать() у полученного объекта ДвоичныеДанные.Посмотрим на практический пример программного кода:
// 1. Получаем уникальное имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
// 2. Извлекаем данные из ХранилищаЗначения
ИсходныеДанные = Объект.РеквизитХранилище.Получить();
// 3. Проверяем тип извлеченного объекта
Если ТипЗнч(ИсходныеДанные) = Тип("ДвоичныеДанные") Тогда
// 4. Записываем двоичные данные в файл на диске
ИсходныеДанные.Записать(ИмяФайла);
Попытка
// Здесь выполняем необходимые действия с файлом (открытие, печать, заполнение)
// ...
Исключение
// Обработка возможных ошибок
ВызватьИсключение;
КонецПопытки;
// 5. Обязательно удаляем временный файл после использования
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Проанализируем обратную операцию — помещение файла с диска или макета в хранилище. При создании нового объекта ХранилищеЗначения вторым параметром можно передать степень сжатия данных с помощью объекта СжатиеДанных (допустимые значения от 0 до 9):
ИмяФайла = "C:\Templates\Template.docx";
// Считываем файл с диска в объект ДвоичныеДанные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
// Помещаем в ХранилищеЗначения
// Для файлов, которые уже сжаты (docx, xlsx, zip, pdf), используем СжатиеДанных(0)
Хранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(0));
// Записываем хранилище в реквизит объекта
ОбъектСправочника.ФайлШаблона = Хранилище;
ОбъектСправочника.Записать();
При работе с двоичными данными и хранилищами значений следует учитывать несколько важных нюансов архитектуры платформы 1С:
ПолучитьИмяВременногоФайла() лишь генерирует уникальную строку пути, но не создает сам файл. Создание происходит при вызове метода Записать(). Созданные временные файлы не удаляются платформой автоматически, поэтому их необходимо удалять с помощью команды УдалитьФайлы() во избежание переполнения системного диска.СжатиеДанных(9) для архивных форматов (.docx, .xlsx, .zip, .png) не уменьшает размер записи в базе данных, но создает дополнительную нагрузку на процессор сервера. Для таких файлов рекомендуется отключать сжатие или использовать значение по умолчанию.ХранилищеЗначения не считываются в оперативную память целиком до тех пор, пока к ним не происходит явного обращения через объектную модель, что снижает нагрузку на сервер при обработке больших массивов строк.