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

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

1. Сохранение двоичных данных через интерфейс 1С (без программирования)

Не все задачи требуют написания кода. Если вам нужно сохранить вложение из документа или справочника (например, скан договора или фотографию товара), это можно сделать вручную за 3 клика:

  • 📁 Откройте карточку документа/справочника с вложением (например, ДоговорыКонтрагентов → выберите нужный договор).
  • 🖼️ Найдите поле с типом ХранилищеЗначения или ДвоичныеДанные (часто называется "Файлы", "Вложения", "Изображение").
  • 💾 Кликните правой кнопкой по файлу → выберите Сохранить как... (в некоторых конфигурациях опция может называться "Экспортировать").

Этот метод подходит для единичных операций, но имеет ограничения:

  • ❌ Нет возможности пакетного сохранения (придется повторять для каждого файла).
  • ❌ Не работает, если поле с данными скрыто или доступно только для чтения.
  • ❌ Нельзя автоматизировать (например, сохранять все вложения по расписанию).
💡

Если в интерфейсе нет опции "Сохранить как...", попробуйте нажать Ctrl+S при выделенном файле — в некоторых конфигурациях это срабатывает.

2. Использование метода Записать() для объекта ДвоичныеДанные

Самый универсальный способ программного сохранения — работа с объектом ДвоичныеДанные. Этот метод подходит для любых типов файлов: от текстовых TXT/CSV до бинарных PDF, ZIP или изображений. Основное преимущество — простота кода и минимальные требования к правам пользователя.

Пример кода для сохранения двоичных данных из поля справочника в файл на диске:


// Получаем двоичные данные из поля "ФайлДоговора" справочника "ДоговорыКонтрагентов"

ДвоичныеДанные = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Договор №123").ФайлДоговора;

// Сохраняем в файл на рабочем столе пользователя

ИмяФайла = "C:\Users\" + ПользовательИнформация.ИмяПользователя() + "\Desktop\Договор_123.pdf";

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

// Проверяем результат

Если НЕ ФайлСуществует(ИмяФайла) Тогда

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

КонецЕсли;

Ключевые моменты:

  • 🔹 Метод .Записать() перезаписывает файл без предупреждения. Если нужно избежать потери данных, предварительно проверьте существование файла с помощью ФайлСуществует().
  • 🔹 Путь к файлу должен быть доступен для записи. В корпоративных сетях часто блокируются системные папки (C:\Program Files).
  • 🔹 Для больших файлов (>50 МБ) лучше использовать потоки (см. следующий раздел) — это снизит нагрузку на память.
Что делать, если метод Записать() выдает ошибку "Доступ запрещен"

Проверьте:

1. Права пользователя Windows на запись в целевую папку.

2. Антивирус — он может блокировать запись "подозрительных" файлов (например, EXE или BAT).

3. Длину пути — в Windows ограничение 260 символов. Используйте короткие имена папок или сетевые пути (\\server\share\file.pdf).

4. Если файл открыт в другой программе (например, PDF в Adobe Reader), закройте его перед записью.

3. Работа с потоками: сохранение больших файлов

Когда размер двоичных данных превышает 50–100 МБ, метод .Записать() может вызывать ошибки переполнения памяти или подвисания 1С. В таких случаях рекомендуется использовать объекты Поток и ПотокВФайл, которые обрабатывают данные порциями.

Пример оптимизированного кода для сохранения большого файла (например, архива базы данных):

// Получаем двоичные данные (например, из HTTP-запроса или хранилища)

ДвоичныеДанные = ПолучитьБольшойФайлИзИсточника(); // Ваша функция

// Создаем поток для записи

ИмяФайла = "D:\Backups\database_backup.zip";

ПотокЗаписи = Новый ПотокВФайл(ИмяФайла, Истина); // Истина = перезаписать если существует

// Создаем поток для чтения исходных данных

ПотокЧтения = Новый ПотокВПамяти(ДвоичныеДанные);

// Копируем данные порциями (буфер 1 МБ)

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

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

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

КонецЦикла;

// Закрываем потоки

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

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

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

Преимущества этого подхода:

  • 📈 Минимальное потребление памяти (данные обрабатываются порциями).
  • 🛡️ Возможность отмены операции (например, по таймауту или по запросу пользователя).
  • 🔄 Поддержка прогресс-бара (можно отслеживать процент выполнения).
⚠️ Внимание: При работе с потоками всегда закрывайте их явно (.Закрыть()), иначе файл может остаться заблокированным или сохраненным не полностью. В 1С:Предприятие 8.3.20+ для этого можно использовать конструкцию Попытка...Исключение с гарантированным закрытием.
📊 Какой объем файлов вам чаще всего приходится сохранять из 1С?
До 1 МБ
1–50 МБ
50–500 МБ
Более 500 МБ

4. Сохранение двоичных данных в сетевые папки и облака

В корпоративных средах часто требуется сохранять файлы не на локальный диск, а в сетевую папку (например, \\server\shared\documents) или облачное хранилище (Yandex.Disk, Google Drive). Для этого в 1С есть два подхода:

  1. Прямая запись в сетевую папку (если есть права доступа):
ИмяФайла = "\\server\shared\documents\contract_001.pdf";

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

  1. Через API облачного хранилища (например, Yandex.Disk REST API):
// Получаем токен доступа к Yandex.Disk (заранее сохранен в настройках)

Токен = Константы.ТокенYandexDisk.Получить();

// Формируем запрос на загрузку

Запрос = Новый HTTPЗапрос("https://cloud-api.yandex.net/v1/disk/resources/upload");

Запрос.УстановитьЗаголовок("Authorization", "OAuth " + Токен);

Запрос.УстановитьТекст("path=/backups/database_2026.zip&overwrite=true");

// Получаем URL для загрузки

Ответ = Новый HTTPСоединение().Получить(Запрос);

ДанныеОтвета = JSON.Прочитать(Ответ.ПолучитьТекст());

URLЗагрузки = ДанныеОтвета.href;

// Загружаем файл

ЗапросФайла = Новый HTTPЗапрос(URLЗагрузки);

ЗапросФайла.УстановитьЗаголовок("Content-Type", "application/zip");

ЗапросФайла.УстановитьBodyИзДвоичныхДанных(ДвоичныеДанные);

ОтветЗагрузки = Новый HTTPСоединение().ОтправитьДляЗаписи(ЗапросФайла);

Если ОтветЗагрузки.КодСостояния = 201 Тогда

Сообщить("Файл успешно загружен в облако!");

Иначе

Сообщить("Ошибка: " + ОтветЗагрузки.ПолучитьТекст());

КонецЕсли;

Нюансы работы с сетевыми ресурсами:

СпособПреимуществаОграничения
Локальная сетевая папкаПростота, высокая скоростьТребуются права доступа, зависимость от сети
FTP/SFTPШироко поддерживается, безопасно (SFTP)Нужны настройки сервера, возможны таймауты
Облачные API (Yandex, Google)Доступ из любой точки, резервное копированиеОграничения по размеру файла, плата за трафик
WebDAVИнтеграция с Windows как сетевой дискСложность настройки, низкая скорость
⚠️ Внимание: При работе с облачными API может блокировать длительные операции (таймаут по умолчанию — 30 секунд). Для больших файлов увеличьте таймаут через HTTPСоединение.Таймаут = 300 (значение в секундах).

5. Сохранение двоичных данных из HTTP-запросов и ответов

Частая задача — скачивание файлов из интернета или внутренних систем по HTTP/HTTPS с последующим сохранением на диск. Например, это может быть:

  • 🌍 Скачивание курсов валют с сайта ЦБ в формате XML.
  • 📄 Получение PDF-отчетов от банка по API.
  • 🖼️ Загрузка изображений товаров с сайта поставщика.

Пример кода для скачивания файла по URL и сохранения на диск:

// URL файла (например, PDF с отчетом)

URL = "https://example.com/reports/monthly_2026.pdf";

// Создаем HTTP-запрос

Запрос = Новый HTTPЗапрос(URL);

Соединение = Новый HTTPСоединение();

Ответ = Соединение.Получить(Запрос);

// Проверяем успешность запроса

Если Ответ.КодСостояния <> 200 Тогда

Сообщить("Ошибка скачивания: код " + Ответ.КодСостояния);

Возврат;

КонецЕсли;

// Сохраняем двоичные данные ответа в файл

ДвоичныеДанные = Ответ.ПолучитьBodyКакДвоичныеДанные();

ИмяФайла = "C:\Reports\monthly_2026.pdf";

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

Сообщить("Файл успешно скачан и сохранен!");

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

Соединение.ИгнорироватьОшибкиСертификата = Истина;

Убедитесь, что URL доступен (попробуйте открыть в браузере)

Проверьте права на запись в целевую папку

Установите таймаут соединения (например, 60 секунд)

Для больших файлов используйте потоки

Если сервер требует авторизацию, добавьте заголовок Authorization

-->

6. Автоматизация сохранения: обработки и регламентные задания

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

  • 📅 Регламентные задания (встроенный механизм 1С).
  • ⚙️ Обработки с кнопкой запуска (для ручного контроля).
  • 🤖 Внешние скрипты (например, PowerShell + 1С:Предприятие через COM-соединение).

Пример создания регламентного задания для автоматического сохранения вложений из документов:

  1. Откройте Администрирование → Регламентные задания.
  2. Создайте новое задание с типом Выполнение кода.
  3. Укажите расписание (например, ежедневно в 23:00).
  4. Вставьте код (пример ниже) и сохраните.
// Код для регламентного задания: сохранение вложений из документов "ЗаказыПокупателей"

Выборка = Документы.ЗаказыПокупателей.Выбрать();

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

Если ЗначениеЗаполнено(Выборка.Вложения) Тогда

Каталог = "D:\Exports\Orders\" + Формат(Выборка.Дата, "ДФ=yyyy-MM-dd") + "\";

СоздатьКаталоги(Каталог); // Создаем папку если не существует

Для Каждого Файл Из Выборка.Вложения Цикл

ИмяФайла = Каталог + Файл.Имя;

Файл.Данные.Записать(ИмяФайла);

КонецЦикла;

КонецЕсли;

КонецЦикла;

Советы по автоматизации:

  • 🔄 Используйте СоздатьКаталоги() для создания вложенных папок — это избежит ошибок, если путь не существует.
  • 📂 Для имен файлов используйте уникальные идентификаторы (например, Дата+НомерДокумента), чтобы избежать конфликтов.
  • 📧 Настройте уведомления по email о результатах выполнения (через Почта.Отправить()).
💡

Регламентные задания в 1С выполняются в фоне и не блокируют работу пользователей. Однако они потребляют ресурсы сервера — не планируйте слишком частые запуски (например, каждую минуту).

7. Ошибки и их решения при сохранении двоичных данных

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

ОшибкаВозможная причинаРешение
Доступ запрещен (Access denied) Недостаточно прав на запись в папку или файл заблокирован
  1. Проверьте права Windows на папку.
  2. Закройте файл в других программах (Excel, PDF-ридер).
  3. Используйте сетевую папку с полными правами.
Недопустимый путь к файлу Слишком длинный путь (>260 символов) или недопустимые символы
  1. Используйте короткие имена папок.
  2. Замените в имени файла символы \ / : * ? " < > |.
  3. Для сетевых путей используйте формат \\?\UNC\server\share\file.
Недостаточно памяти Файл слишком большой для обработки в памяти Используйте потоки (ПотокВФайл) вместо .Записать().
Неверный формат данных Попытка сохранить не двоичные данные (например, строку) Проверьте тип данных с помощью ТипЗнч(). При необходимости конвертируйте: ДвоичныеДанные = ОсновныеДействия.СтрокаВДвоичныеДанные(ТекстовыеДанные).

Если ошибка не типична, используйте Попытка...Исключение для детальной диагностики:

Попытка

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

Исключение

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

// Запись в журнал регистрации для анализа

ЖурналРегистрации.ЗаписатьСобытие("ОшибкаСохраненияФайла", УровеньЖурналаОшибка, , ОписаниеОшибки());

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

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

FAQ: Частые вопросы по сохранению двоичных данных в 1С

Как сохранить картинку из справочника в файл?

Если картинка хранится в поле типа ХранилищеЗначения (например, в справочнике Номенклатура), используйте:

Картинка = Справочники.Номенклатура.НайтиПоНаименованию("Товар1").Картинка;

Картинка.ПолучитьДвоичныеДанные().Записать("C:\Images\Товар1.jpg");

Если поле типа ДвоичныеДанные, достаточно:

Справочники.Номенклатура.НайтиПоНаименованию("Товар1").Картинка.Записать("C:\Images\Товар1.jpg");
Можно ли сохранить двоичные данные в Base64 и обратно?

Да, для этого используйте функции Base64Строка() и Base64Значение():

// Двоичные данные → Base64

Base64Строка = Base64Строка(ДвоичныеДанные);

// Base64 → Двоичные данные

ДвоичныеДанныеВосстановленные = Base64Значение(Base64Строка);

Это полезно для передачи файлов через JSON или HTTP.

Как сохранить отчет в PDF без диалогового окна?

Используйте метод Сохранить() с параметром Ложь для отключения диалога:

Макет = Документы.ЗаказПокупателя.СправкаРасчеты.ПолучитьМакет("МакетОтчета");

ТабДок = Новый ТабличныйДокумент;

ТабДок.Вывести(Макет);

// Сохраняем без диалога

ТабДок.Сохранить("C:\Reports\order_123.pdf", ТипФайлаТабличногоДокумента.PDF, Ложь);

Почему сохраненный PDF открывается с ошибкой?

Частые причины:

  1. Файл сохранен не полностью (проверьте размер исходных и сохраненных данных).
  2. Неверная кодировка при генерации PDF (используйте КодировкаТекста.UTF8).
  3. Файл заблокирован антивирусом (добавьте исключение для папки).

Решение: сохраните файл в формате TXT и проверьте его содержимое — если там мусор, проблема в исходных данных.

Как сохранить двоичные данные в временный файл?

Используйте функцию ПолучитьИмяВременногоФайла():

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");

ДвоичныеДанные.Записать(ИмяВременногоФайла);

// Работаем с файлом...

// Удаляем после использования

УдалитьФайлы(ИмяВременногоФайла);

Временные файлы автоматически удаляются при перезапуске системы, но лучше очищать их явно.