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

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

1. Что такое двоичные данные в 1С и где они хранятся

В 1С:Предприятие 8 двоичные данные представляют собой неструктурированную последовательность байтов, которая может содержать любой файл — от текстового документа до исполнимого EXE. Основные места их хранения:

  • 📁 Реквизиты справочников/документов типа ХранилищеЗначения или ДвоичныеДанные (например, поле "ФайлПриложения" в документе "Заявка").
  • 🗃️ Табличные части с колонками типа ДвоичныеДанные (часто используется для хранения сканов в бухгалтерских базах).
  • 💾 Временные файлы, созданные методами ЗаписатьФайл() или ПолучитьИзВременногоХранилища().
  • 🔄 Результаты обмена данными (например, XML/JSON с вложенными файлами, полученные через REST API или WEB-сервисы).

Важно понимать, что двоичные данные в 1С не имеют расширения — это просто массив байтов. Расширение файла (например, .pdf или .xlsx) определяется контекстом: либо оно хранится в отдельном реквизите (например, "ИмяФайла"), либо его нужно угадать по сигнатуре (первым байтам). Например, PDF-файлы всегда начинаются с последовательности %PDF-, а ZIP-архивы — с PK.

💡

Если вы не уверены в формате двоичных данных, сохраните их в файл с расширением .bin и откройте в шестнадцатеричном редакторе (например, HxD или 010 Editor). Первые 8-16 байтов обычно достаточно, чтобы определить тип файла.

2. Способ 1: Извлечение через конфигуратор (для администраторов)

Самый простой метод, не требующий написания кода — использование встроенных инструментов конфигуратора. Он подходит для разовых операций, когда нужно быстро достать 1-2 файла. Инструкция:

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

Ограничения метода:

  • ❌ Не работает для данных, хранящихся в табличных частях (придётся писать код).
  • ❌ Нет возможности пакетной обработки (например, извлечь все файлы из 100 документов).
  • ❌ В некоторых версиях платформы (например, 1С:Предприятие 8.3.20 и ниже) может не отображаться кнопка Сохранить в файл для больших объектов (>50 МБ).
Что делать, если кнопка "Сохранить в файл" неактивна?

Это означает, что данные заблокированы на уровне СУБД или платформы. Попробуйте:

1. Перезапустить конфигуратор с правами администратора ОС.

2. Выгрузить данные в .dt файл через Администрирование → Выгрузить информационную базу, затем открыть его в текстовом редакторе и найти шестнадцатеричный дамп.

3. Использовать внешнюю обработку (см. Способ 4).

3. Способ 2: Встроенный язык 1С (универсальный скрипт)

Для автоматизации извлечения файлов из двоичных данных используйте встроенный язык. Ниже приведён универсальный код, который работает в большинстве конфигураций (включая 1С:Бухгалтерия 3.0, 1С:ERP, 1С:ЗУП):

Процедура ИзвлечьФайлИзДвоичныхДанных(ДвоичныеДанные, ПутьКФайлу) Экспорт

Если ТипЗнч(ДвоичныеДанные) <> Тип("ДвоичныеДанные") Тогда

Сообщить("Ошибка: передан неверный тип данных!");

Возврат Ложь;

КонецЕсли;

Попытка

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

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

Возврат Истина;

Исключение

Сообщить("Ошибка сохранения: " + ОписаниеОшибки());

Возврат Ложь;

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

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

// Пример использования:

// ИзвлечьФайлИзДвоичныхДанных(Документ.ФайлПриложения.Получить(), "C:\Temp\file.pdf");

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

  • 🔹 Метод .Записать() автоматически определяет формат файла по сигнатуре (если данные корректны).
  • 🔹 Для больших файлов (>100 МБ) рекомендуется использовать ПотокЗаписи:
Процедура СохранитьБольшойФайл(ДвоичныеДанные, ПутьКФайлу)

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

Поток.Записать(ДвоичныеДанные);

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

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

Имя файла не содержит запрещённых символов (?, *, :, \)|Папка для сохранения существует и доступна для записи|Двоичные данные не пустые (проверить через ДвоичныеДанные.Размер() > 0)|Расширение файла соответствует его реальному формату-->

4. Способ 3: Работа с ХранилищемЗначения

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

  1. Получить объект ХранилищеЗначения из реквизита.
  2. Извлечь двоичные данные методом .Получить().
  3. Сохранить их в файл (см. Способ 2).

Пример кода для документа с реквизитом ФайлХранилище:

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

Если ДвоичныеДанные.Размер() > 0 Тогда

ИзвлечьФайлИзДвоичныхДанных(ДвоичныеДанные, "C:\Temp\extracted_file.dat");

Иначе

Сообщить("Хранилище пустое!");

КонецЕсли;

Особенности работы с ХранилищеЗначения:

СcenarioМетодПримечание
Данные — это файл.Получить()Возвращает ДвоичныеДанные
Данные — это объект 1С (например, документ).Восстановить()Возвращает ссылку на объект
Нужно проверить тип данных.ТипЗнч()Вернёт строку, например "ДвоичныеДанные"
Данные сжаты.Разжать()Требует предварительной проверки на сжатие
📊 Какой способ извлечения файлов вы используете чаще?
Через конфигуратор
На встроенном языке
Внешние обработки
API/HTTP-сервисы
Другой вариант

5. Способ 4: Внешние обработки для пакетного извлечения

Если нужно извлечь файлы из сотен записей (например, все сканы договоров за год), ручные методы не подойдут. В этом случае используйте внешние обработки. Готовые решения:

  • 📥 Обработка "Экспорт файлов из двоичных данных" (Infostart) — поддерживает фильтрацию по датам и типам документов.
  • 🔍 "Пакетное извлечение вложений" (от 1С-Софт) — сохраняет оригинальные имена файлов из реквизитов.
  • 🛠️ "Универсальный экспорт данных" (входит в 1С:Рарус) — позволяет настраивать шаблоны имён файлов.

Пример кода для пакетного извлечения из справочника Договора:

Выборка = Справочники.Договора.Выбрать();

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

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

ИмяФайла = "Скан_Договор_" + Выборка.Номер + ".pdf";

ИзвлечьФайлИзДвоичныхДанных(Выборка.СканДоговора.Получить(), ИмяФайла);

КонецЕсли;

КонецЦикла;

💡

При пакетной обработке всегда проверяйте свободное место на диске! Например, извлечение 1000 PDF-файлов по 5 МБ займёт ~5 ГБ.

6. Способ 5: Использование HTTP-сервисов и API

Для интеграции с внешними системами (например, загрузки файлов в облако или отправки по email) удобно использовать HTTP-сервисы или REST API. Пример отправки двоичных данных на сервер:

Функция ОтправитьФайлНаСервер(ДвоичныеДанные, URL)

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

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

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

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

Возврат Ответ.КодСостояния = 200;

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

Популярные сценарии:

  • 🌐 Загрузка файлов в Google Drive/Yandex Disk через их API.
  • 📧 Отправка вложений в письмах (например, через SMTP или Mail.ru API).
  • 🔗 Передача файлов в другие системы (например, в Bitrix24 или Атлас).
💡

Для работы с API обязательно настройте Политику безопасности HTTP-соединений в конфигураторе (раздел Администрирование → Настройки HTTP-сервисов). Без этого запросы будут блокироваться.

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

При работе с двоичными данными в 1С часто возникают специфические ошибки. Рассмотрим самые распространённые:

ОшибкаПричинаРешение
Недопустимый тип данных (параметр 1) Передан неверный тип (например, строка вместо ДвоичныеДанные) Проверьте тип через ТипЗнч() перед сохранением
Нет доступа к файлу Не хватает прав на запись в папку или файл заблокирован Запустите 1С от имени администратора или выберите другую папку
Файл открывается как "битый" Неверная кодировка или сигнатура Проверьте первые байты файла в шестнадцатеричном редакторе
Размер данных превышает максимально допустимый Ограничение платформы (обычно 2 ГБ) Разбейте файл на части или используйте ПотокЗаписи
Как восстановить файл, если он сохранился битым?

1. Проверьте, что расширение файла соответствует его реальному типу (например, не сохраняйте PDF как .docx).

2. Откройте файл в шестнадцатеричном редакторе и сравните сигнатуру с эталонной (например, для ZIP это 50 4B 03 04).

3. Если файл текстовой (TXT, CSV), попробуйте открыть его в Notepad++ с разными кодировками (UTF-8, Windows-1251).

4. Для изображений (JPG, PNG) используйте утилиты вроде IrfanView с опцией "Восстановить повреждённый файл".

8. Безопасность при работе с двоичными данными

Двоичные данные могут содержать вредоносный код (например, если они были загружены из ненадёжного источника). Следуйте правилам:

  • 🛡️ Проверяйте файлы антивирусом перед открытием, особенно если они получены из интернета или от контрагентов.
  • 🔒 Ограничивайте доступ к реквизитам с двоичными данными в ролях пользователей (настройка в конфигураторе: Администрирование → Пользователи и права).
  • 🗑️ Удаляйте временные файлы после обработки, чтобы не засорять диск (используйте УдалитьФайлы()).
  • 🔄 Архивируйте старые данные: двоичные файлы быстро разрастаются. Для экономии места настройте автоматическое архивирование в 1С:Документооборот.
💡

Для хранения конфиденциальных файлов (например, сканов паспортов) используйте шифрование. В 1С это реализуется через методы Зашифровать()/Расшифровать() из объекта Криптография (требует лицензии на шифрование).

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

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

Да, если у вас есть права на чтение объекта (документа/справочника) с этими данными. Используйте встроенный язык (Способ 2) или попросите администратора выгрузить данные через конфигуратор. Права администратора нужны только для доступа к служебным функциям платформы.

Как узнать реальный тип файла, если расширение неизвестно?

Есть несколько способов:

  1. Посмотреть первые байты в шестнадцатеричном редакторе (см. таблицу сигнатур на Википедии).
  2. Использовать утилиту TrID (определяет тип по сигнатуре).
  3. В 1С: проверить MIME-тип через ПолучитьMIMEТипИзДвоичныхДанных() (доступно в последних версиях платформы).

Почему при сохранении PDF из 1С он открывается как текстовый файл?

Это типичная проблема с кодировкой. PDF — бинарный формат, и если сохранить его как текст (например, через ЗаписатьТекст() вместо Записать()), он повредится. Всегда используйте методы для работы с двоичными данными, а не текстовыми.

Как извлечь файлы из табличной части документа?

Для табличных частей нужно обходить строки в цикле. Пример:

Для Каждого Строка Из Документ.ТабличнаяЧастьЦикл

Если ЗначениеЗаполнено(Строка.Файл) Тогда

ИзвлечьФайлИзДвоичныхДанных(Строка.Файл.Получить(), "C:\Temp\" + Строка.НомерСтроки + ".pdf");

КонецЕсли;

КонецЦикла;

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

Да, для этого используйте регламентные задания:

  1. Создайте обработку с кодом извлечения (см. Способ 2 или 4).
  2. Настройте регламентное задание в Администрирование → Регламентные и фоновые задания.
  3. Укажите расписание (например, ежедневно в 2:00).

Для сложных сценариев (например, отправка файлов по FTP) лучше использовать 1С:Рарус:Автоматизация или 1С:EDT.