Как извлечь двоичные данные из ХранилищаЗначения и сохранить их в файл в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке прикладных решений в системе 1С:Предприятие часто возникает необходимость хранить в базе данных произвольные файлы (шаблоны печатных форм в формате Word или Excel, сканы документов, архивы или картинки). Для хранения таких объектов в реквизитах справочников и документов используется тип ХранилищеЗначения. Рассмотрим подробнее, как правильно извлечь сохраненные файлы из хранилища и выгрузить их на диск в виде объекта ДвоичныеДанные.

Принцип работы с объектом ХранилищеЗначения

Объект ХранилищеЗначения выступает в роли специального контейнера платформы, предназначенного для помещения любых сериализуемых данных в сжатом или несжатом виде. Сам по себе объект ХранилищеЗначения не имеет методов прямой записи на диск (таких как метод записи в файл), поскольку он лишь оборачивает сохраненный тип данных.

Чтобы получить доступ к содержимому, необходимо выполнить метод Получить(). Этот метод распаковывает контейнер и возвращает исходный объект ровно в том типе, в котором он был туда помещен при инициализации (например, ДвоичныеДанные, ТабличныйДокумент, Картинка или Структура).

Пошаговый алгоритм извлечения и сохранения файла

Разберем стандартную последовательность действий для выгрузки файла шаблона из хранилища на диск:

  1. Формирование пути к файлу — с помощью функции ПолучитьИмяВременногоФайла() резервируем путь во временном каталоге операционной системы с нужным расширением.
  2. Извлечение объекта из хранилища — вызываем метод Получить() у целевого реквизита.
  3. Проверка типа данных — убеждаемся, что внутри действительно находятся двоичные данные.
  4. Сохранение на диск — вызываем метод Записать() у полученного объекта ДвоичныеДанные.
  5. Очистка временных файлов — после завершения работы с файлом удаляем его с диска.

Посмотрим на практический пример программного кода:


// 1. Получаем уникальное имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");

// 2. Извлекаем данные из ХранилищаЗначения
ИсходныеДанные = Объект.РеквизитХранилище.Получить();

// 3. Проверяем тип извлеченного объекта
Если ТипЗнч(ИсходныеДанные) = Тип("ДвоичныеДанные") Тогда
    
    // 4. Записываем двоичные данные в файл на диске
    ИсходныеДанные.Записать(ИмяФайла);
    
    Попытка
        // Здесь выполняем необходимые действия с файлом (открытие, печать, заполнение)
        // ...
    Исключение
        // Обработка возможных ошибок
        ВызватьИсключение;
    КонецПопытки;
    
    // 5. Обязательно удаляем временный файл после использования
    УдалитьФайлы(ИмяФайла);
    
КонецЕсли;

Как правильно помещать файлы в ХранилищеЗначения

Проанализируем обратную операцию — помещение файла с диска или макета в хранилище. При создании нового объекта ХранилищеЗначения вторым параметром можно передать степень сжатия данных с помощью объекта СжатиеДанных (допустимые значения от 0 до 9):


ИмяФайла = "C:\Templates\Template.docx";

// Считываем файл с диска в объект ДвоичныеДанные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

// Помещаем в ХранилищеЗначения
// Для файлов, которые уже сжаты (docx, xlsx, zip, pdf), используем СжатиеДанных(0)
Хранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(0));

// Записываем хранилище в реквизит объекта
ОбъектСправочника.ФайлШаблона = Хранилище;
ОбъектСправочника.Записать();

Важные практические рекомендации

При работе с двоичными данными и хранилищами значений следует учитывать несколько важных нюансов архитектуры платформы 1С:

  1. Очистка временных файлов: Функция ПолучитьИмяВременногоФайла() лишь генерирует уникальную строку пути, но не создает сам файл. Создание происходит при вызове метода Записать(). Созданные временные файлы не удаляются платформой автоматически, поэтому их необходимо удалять с помощью команды УдалитьФайлы() во избежание переполнения системного диска.
  2. Оптимизация сжатия: Использование максимального сжатия СжатиеДанных(9) для архивных форматов (.docx, .xlsx, .zip, .png) не уменьшает размер записи в базе данных, но создает дополнительную нагрузку на процессор сервера. Для таких файлов рекомендуется отключать сжатие или использовать значение по умолчанию.
  3. Оптимизация оперативной памяти: При чтении таблиц базы данных запросами поля типа ХранилищеЗначения не считываются в оперативную память целиком до тех пор, пока к ним не происходит явного обращения через объектную модель, что снижает нагрузку на сервер при обработке больших массивов строк.
← На главную