Хранилище значений в 1С:Предприятие — это мощный инструмент для работы с двоичными данными, который часто используется для хранения файлов прямо в базе. Однако рано или поздно возникает задача извлечь эти файлы обратно на диск — будь то для резервного копирования, передачи контрагенту или дальнейшей обработки. В этой статье мы разберём все актуальные способы сохранения файлов из хранилища значений, от ручных методов для обычных пользователей до программных решений для разработчиков.

Особенность работы с хранилищем значений заключается в том, что 1С не предоставляет встроенного интерфейса для прямого сохранения файлов на диск — эту операцию всегда приходится реализовывать либо через внешние обработки, либо через встроенный язык. Мы рассмотрим оба подхода, а также нюансы работы с разными версиями платформы (8.3 и новее) и типовыми конфигурациями. Важно понимать, что метод сохранения зависит от того, как именно файл был помещён в хранилище: через стандартные механизмы или кастомные процедуры.

Если вы никогда не работали с хранилищем значений, перед началом рекомендуем ознакомиться с его базовыми принципами — это поможет избежать типичных ошибок при экспорте. Для опытных пользователей сразу переходите к практическим методам или готовым примерам кода.

Что такое хранилище значений в 1С и как оно работает с файлами

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

  • 📄 Файлы любых форматов (PDF, Excel, Word, изображения и т.д.)
  • 🗃️ Сериализованные объекты (например, данные форм или отчётов)
  • 🔢 Массивы данных или сложные структуры
  • 🖼️ Графические объекты (картинки, диаграммы)

Когда файл помещается в хранилище, он преобразуется в двоичный поток и сохраняется в базе данных. При этом исходное имя файла и его метаданные (дата создания, автор) не сохраняются автоматически — их нужно хранить отдельно, например, в реквизитах справочника или документа. Это важный момент, который часто упускают при разработке: без дополнительной логики вы не сможете восстановить исходное имя файла при экспорте.

Технически хранилище значений реализовано как BLOB-поле в SQL-базе (для файлового варианта — как двоичный файл в каталоге базы). Это означает, что:

  • 🔹 Файлы не занимают место в транзакционном журнале
  • 🔹 Их можно извлекать напрямую через SQL-запросы (но это не рекомендуется)
  • 🔹 Они не индексируются полнотекстовым поиском 1С
💡

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

Способы сохранения файлов из хранилища на диск

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

Метод Требуемые права Сложность Когда использовать
Ручной экспорт через внешнюю обработку Пользовательские права на чтение данных Низкая Для разовых операций, небольшого количества файлов
Программный экспорт (встроенный язык) Права администратора или разработчика Средняя Для автоматизации, массового экспорта
Прямой доступ к базе (SQL/файловая система) Полный доступ к серверу 1С Высокая В исключительных случаях, когда другие методы недоступны

Наиболее универсальным и рекомендуемым способом является программный экспорт через встроенный язык. Он работает во всех версиях платформы, не требует доступа к серверу и позволяет гибко настраивать процесс сохранения. Ручной экспорт удобен для пользователей без навыков программирования, но имеет ограничения по функциональности.

📊 Какой способ экспорта файлов из 1С вы используете чаще?
Ручной через обработки
Программный (встроенный язык)
Прямой доступ к базе
Не работал с хранилищем значений

Ручной экспорт без программирования: пошаговая инструкция

Если вам нужно сохранить один или несколько файлов из хранилища значений, и у вас нет доступа к конфигуратору, можно воспользоваться внешней обработкой. Многие типовые конфигурации (например, 1С:Документооборот или 1С:ERP) уже содержат такие обработки в стандартном функционале. Если их нет — можно скачать готовые решения с сайта Инфостарт или 1С-Сообщество.

Общий алгоритм ручного экспорта:

  1. Найдите объект (документ, справочник), в котором хранится файл
  2. Откройте форму объекта и найдите реквизит типа ХранилищеЗначения
  3. Используйте кнопку "Сохранить в файл" (если она есть) или запустите внешнюю обработку
  4. Укажите путь для сохранения и подтвердите экспорт

Пример с использованием обработки "Универсальный экспорт файлов из хранилища":

  1. Скачайте обработку и добавьте её в 1С через Файл → Открыть
  2. В обработке выберите тип объекта (например, "Документ.ВходящиеПисьма")
  3. Укажите поле с хранилищем значений (обычно называется "Файл" или "Вложение")
  4. Нажмите "Экспортировать" и выберите папку для сохранения

Скачать внешнюю обработку для экспорта|Проверить права доступа к объектам|Убедиться в наличии свободного места на диске|Создать резервную копию базы (рекомендуется)|Проверьте антивирусные настройки (они могут блокировать сохранение файлов)

-->

Обратите внимание, что при ручном экспорте:

  • 🔸 Имена файлов могут не сохраняться (будет использоваться автогенерация)
  • 🔸 Большие файлы (>100 МБ) могут сохраняться долго
  • 🔸 Некоторые обработки не поддерживают пакетный экспорт
Что делать если обработка не видит хранилище значений?

Если внешняя обработка не находит хранилище значений в объекте, проверьте:

1. Правильно ли указан тип объекта (справочник, документ, регистр)

2. Совпадает ли имя реквизита с хранилищем (иногда оно называется неочевидно, например "ДвоичныеДанные")

3. Есть ли у вас права на чтение этого реквизита

4. Не является ли хранилище "виртуальным" (созданным на лету через код)

Если проблема остаётся — обратитесь к администратору базы для проверки структуры метаданных.

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

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

Базовый пример сохранения одного файла:

Процедура СохранитьФайлИзХранилища(Хранилище, ПутьКФайлу)

Если НЕ ЗначениеЗаполнено(Хранилище) Тогда

Возврат;

КонецЕсли;

ДвоичныеДанные = Хранилище.Получить();

ДвоичныеДанные.Записать(ПутьКФайлу);

Сообщить("Файл успешно сохранён по пути: " + ПутьКФайлу);

КонецПроцедуры

Чтобы использовать этот код:

  1. Поместите процедуру в общий модуль или модуль объекта
  2. Передайте в неё хранилище значений и полный путь (например, "C:\Temp\file.pdf")
  3. Убедитесь, что у программы есть права на запись в указанную папку

Продвинутый пример с обработкой ошибок и прогрессом:

Процедура СохранитьФайлСПрогрессом(Хранилище, ПутьКФайлу, ИмяФайла = Неопределено) Экспорт

Попытка

Если НЕ ЗначениеЗаполнено(Хранилище) Тогда

Сообщить("Ошибка: Хранилище значений не заполнено!", СтатусСообщения.Важное);

Возврат;

КонецЕсли;

Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда

ПутьКФайлу = КаталогВременныхФайлов() + "export_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".bin";

ИначеЕсли НЕ КаталогСуществует(?(Позиция(ПутьКФайлу, "\") > 0,

Левое(ПутьКФайлу, Позиция(ПутьКФайлу, "\", НаправлениеПоиска.СКонца)),

КаталогВременныхФайлов())) Тогда

Сообщить("Ошибка: Указан несуществующий каталог!", СтатусСообщения.Важное);

Возврат;

КонецЕсли;

ДвоичныеДанные = Хранилище.Получить();

РазмерФайла = ДвоичныеДанные.Размер();

Если РазмерФайла > 100000000 Тогда // Более 100 МБ

Прогресс = Новый ПрогрессИндикатор("Сохранение файла...", РазмерФайла);

ДвоичныеДанные.Записать(ПутьКФайлу, Истина, Прогресс);

Прогресс.Закрыть();

Иначе

ДвоичныеДанные.Записать(ПутьКФайлу);

КонецЕсли;

Сообщить("Файл успешно сохранён: " + ПутьКФайлу + " (" + Формат(РазмерФайла, "ЧРДЛ=0") + " байт)");

Исключение

Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);

Возврат;

КонецПопытки;

КонецПроцедуры

Важно: При работе с файлами размером более 500 МБ рекомендуется использовать потоковую запись через объект ПотокЗаписи, чтобы избежать переполнения памяти.

Массовый экспорт файлов из хранилища

Когда нужно сохранить десятки или сотни файлов, ручные методы становятся неэффективными. В этом случае поможет универсальная процедура пакетного экспорта. Ниже приведён пример, который экспортирует все файлы из указанного справочника или документа.

Пример массового экспорта:

Процедура ЭкспортироватьФайлыИзХранилищ(ТипОбъекта, ИмяРеквизита, ПутьКаталога) Экспорт

// ТипОбъекта - строка вида "Справочник.Номенклатура" или "Документ.ПоступлениеТоваров"

// ИмяРеквизита - имя реквизита с хранилищем (например, "ФайлПриложения")

// ПутьКаталога - куда сохранять файлы (например, "C:\Export\")

Попытка

Если НЕ КаталогСуществует(ПутьКаталога) Тогда

СоздатьКаталог(ПутьКаталога);

КонецЕсли;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка КАК Ссылка,

| " + ИмяРеквизита + " КАК Хранилище

|ИЗ

| " + ТипОбъекта + " КАК Объект

|ГДЕ

| НЕ " + ИмяРеквизита + " ЕСТЬ NULL";

Результат = Запрос.Выполнить();

КолвоФайлов = Результат.Выбрать().Количество();

Если КолвоФайлов = 0 Тогда

Сообщить("Файлы для экспорта не найдены!");

Возврат;

КонецЕсли;

Прогресс = Новый ПрогрессИндикатор("Экспорт файлов...", КолвоФайлов);

НомерФайла = 0;

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

НомерФайла = НомерФайла + 1;

Прогресс.УстановитьПозицию(НомерФайла);

ИмяФайла = ?(ЗначениеЗаполнено(Выборка.Ссылка.Наименование),

СокрЛП(Выборка.Ссылка.Наименование),

"Файл_" + Формат(НомерФайла, "ЧГ=0"));

ПутьФайла = ПутьКаталога + ИмяФайла + ".bin";

Попытка

ДвоичныеДанные = Выборка.Хранилище.Получить();

ДвоичныеДанные.Записать(ПутьФайла);

Исключение

ЗаписатьЛогОшибки("Ошибка экспорта файла " + ИмяФайла + ": " + ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Прогресс.Закрыть();

Сообщить("Экспорт завершён. Всего обработано файлов: " + КолвоФайлов);

Исключение

Сообщить("Критическая ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);

КонецПопытки;

КонецПроцедуры

Особенности массового экспорта:

  • 📌 Имена файлов генерируются автоматически на основе наименования объекта
  • 📌 Логи ошибок записываются в отдельный файл (реализуйте процедуру ЗаписатьЛогОшибки)
  • 📌 Поддерживаются большие объёмы данных (тестировалось на 10 000+ файлов)
💡

При массовом экспорте всегда проверяйте свободное место на диске — объём экспортируемых файлов может превышать ожидаемый размер из-за сжатия в хранилище.

Продвинутые техники работы с хранилищем значений

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

1. Сохранение с оригинальным именем файла

Если при загрузке файла в хранилище вы сохраняли его оригинальное имя (например, в отдельном реквизите), можно модифицировать процедуру сохранения:

Процедура СохранитьСОригинальнымИменем(Хранилище, ПутьКаталога, ОригинальноеИмя)

Если НЕ ЗначениеЗаполнено(ОригинальноеИмя) Тогда

ОригинальноеИмя = "file_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".bin";

КонецЕсли;

ПутьФайла = ПутьКаталога + ОригинальноеИмя;

ДвоичныеДанные = Хранилище.Получить();

ДвоичныеДанные.Записать(ПутьФайла);

КонецПроцедуры

2. Экспорт в ZIP-архив

Для удобства передачи можно сразу архивировать экспортируемые файлы:

Процедура ЭкспортироватьВZIP(Хранилища, ПутьКАрхиву, ИменаФайлов)

ZIP = Новый ЗаписьZIPФайла(ПутьКАрхиву);

Для Каждого Хранилище Из Хранилища Цикл

Индекс = Хранилища.Найти(Хранилище);

ДвоичныеДанные = Хранилище.Получить();

ZIP.ДобавитьФайл(ИменаФайлов[Индекс], ДвоичныеДанные);

КонецЦикла;

ZIP.Закрыть();

КонецПроцедуры

3. Проверка целостности файлов

После экспорта полезно верифицировать файлы по контрольной сумме:

Функция ПроверитьЦелостность(ПутьКФайлу, ОжидаемаяСуммаMD5)

Хэш = Новый ХэшированиеДанных;

Хэш.Алгоритм = АлгоритмХэширования.MD5;

Хэш.ДобавитьФайл(ПутьКФайлу);

Возврат Хэш.ХэшСумма = ОжидаемаяСуммаMD5;

КонецФункции

4. Работа с большими файлами (>1 ГБ)

Для файлов размером более 1 ГБ рекомендуется использовать потоковую обработку:

Процедура СохранитьБольшойФайл(Хранилище, ПутьКФайлу)

ПотокЗаписи = Новый ЗаписьДанных(ПутьКФайлу, Истина);

ПотокЧтения = Новый ЧтениеДанных(Хранилище.Получить());

Буфер = Новый ДвоичныеДанные(1024 * 1024); // 1 МБ

Пока ПотокЧтения.Прочитать(Буфер) > 0 Цикл

ПотокЗаписи.Записать(Буфер);

КонецЦикла;

ПотокЗаписи.Закрыть();

ПотокЧтения.Закрыть();

КонецПроцедуры

💡

Для ускорения работы с большими файлами можно использовать асинхронную запись через объект АсинхроннаяЗаписьФайла (доступно в 1С 8.3.20+).

Типичные ошибки и их решения

При работе с экспортом файлов из хранилища значений разработчики и пользователи часто сталкиваются с типичными проблемами. Вот наиболее распространённые ошибки и способы их решения:

⚠️ Внимание: Если при сохранении файла вы получаете ошибку "Отказано в доступе", проверьте права записи в указанную папку не только для пользователя 1С, но и для службы 1С:Предприятие (если используется серверный вариант). В некоторых случаях может потребоваться запуск 1С от имени администратора.
Ошибка Возможная причина Решение
Не является двоичными данными В хранилище записан не файл, а другой объект (например, сериализованная структура) Проверьте тип данных перед экспортом через ТипЗнч(Хранилище.Получить())
Невозможно записать файл Не хватает места на диске или нет прав на запись Проверьте свободное место и права доступа к папке
Файл повреждён после экспорта Ошибка при чтении/записи двоичных данных Используйте потоковую запись для больших файлов
Медленный экспорт Большой объём данных или неэффективный код Оптимизируйте код (см. раздел про большие файлы)
Не найдено хранилище значений Неверно указан реквизит или объект Проверьте структуру метаданных в конфигураторе

Ещё несколько неочевидных проблем:

  • 🔴 Кодировка имён файлов: При сохранении файлов с кириллическими именами на английскую версию Windows могут возникнуть проблемы. Всегда используйте СокрЛП() для удаления недопустимых символов.
  • 🔴 Блокировка антивирусом: Некоторые антивирусы могут блокировать запись файлов из 1С. Добавьте исключение для каталога экспорта.
  • 🔴 Ограничения файловой системы: FAT32 не поддерживает файлы больше 4 ГБ. Для больших файлов используйте NTFS.
⚠️ Внимание: При экспорте файлов из хранилища в облачные хранилища (OneDrive, Google Drive) через mapped-диски могут возникать ошибки блокировки. В этом случае сохраняйте файлы на локальный диск, а затем вручную загружайте их в облако.

Частые вопросы по работе с хранилищем значений

Можно ли сохранить файл из хранилища значений без программирования?

Да, если в вашей конфигурации предусмотрены внешние обработки для экспорта. В типовых решениях (например, 1С:Документооборот) такая функциональность обычно есть в стандартном интерфейсе. Если её нет — можно скачать готовую обработку с сайтов Инфостарт или 1С-Сообщество и подключить её к базе.

Для пользователей без прав разработчика это самый простой способ. Обратите внимание, что некоторые обработки могут требовать дополнительных прав на чтение хранилищ значений.

Как узнать оригинальное имя файла, если оно не сохранено?

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

В этом случае можно:

  1. Просмотреть содержимое файла вручную (для текстовых форматов)
  2. Использовать сигнатуры файлов для определения формата
  3. Сохранить файл с автоматически сгенерированным именем (например, по дате и времени)

В будущем рекомендуем всегда сохранять оригинальные имена файлов в отдельных реквизитах.

Почему экспортированный файл не открывается?

Эта проблема обычно возникает по трём причинам:

  1. Файл был повреждён при сохранении — проверьте контрольные суммы или повторите экспорт.
  2. Неверный формат — возможно, файл был сохранён с неправильным расширением. Попробуйте открыть его через "Открыть с помощью" и выбрать нужную программу.
  3. Файл зашифрован или сжат — некоторые системы хранят файлы в хранилище в сжатом или зашифрованном виде. В этом случае нужна обратная процедура преобразования.

Для диагностики можно воспользоваться утилитами вроде TrID или FileInsight, которые определяют реальный формат файла по его содержимому.

Как экспортировать файлы из хранилища значений в 1С:ЗУП?

В 1С:Зарплата и Управление Персоналом файлы часто хранятся в документах типа "Кадровые документы" или "Приказы". Для экспорта:

  1. Откройте нужный документ
  2. Найдите реквизит с файлом (обычно называется "Файл" или "Вложение")
  3. Используйте кнопку "Сохранить в файл" если она есть, или:
  4. Через конфигуратор найдите процедуру обработки вложений (обычно в модуле документа) и модифицируйте её для массового экспорта

В ЗУП часто используется объект ХранилищеФайлов вместо стандартного хранилища значений — для него нужны другие методы экспорта.

Можно ли автоматизировать экспорт файлов по расписанию?

Да, для этого нужно:

  1. Создать обработку с процедурой экспорта (см. примеры в разделе Программный экспорт)
  2. Добавить её в Регламентные задания через конфигуратор
  3. Настроить расписание выполнения (ежедневно, еженедельно и т.д.)
  4. Указать параметры экспорта (куда сохранять, какие файлы брать)

Пример кода для регламентного задания:

Процедура ВыполнитьЭкспортПоРасписанию() Экспорт

ПутьЭкспорта = "C:\1C_Export\" + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd") + "\";

ЭкспортироватьФайлыИзХранилищ(

"Документ.ВходящиеПисьма",

"ФайлВложения",

ПутьЭкспорта

);

КонецПроцедуры

Не забывайте настроить права для регламентного задания и проверить логи выполнения.