Работа с двоичными данными в 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 файла. Инструкция:
- Откройте базу в режиме Конфигуратор (с правами администратора).
- Перейдите в меню
Файл → Открытьи выберите объект (например, документ или справочник), содержащий двоичные данные. - Найдите реквизит типа
ХранилищеЗначенияилиДвоичныеДанные, кликните по нему правой кнопкой и выберитеПросмотреть значение. - В открывшемся окне нажмите
Сохранить в файли укажите путь для сохранения.
Ограничения метода:
- ❌ Не работает для данных, хранящихся в табличных частях (придётся писать код).
- ❌ Нет возможности пакетной обработки (например, извлечь все файлы из 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С, который может содержать не только двоичные данные, но и произвольные объекты (например, таблицы значений или документы). Чтобы извлечь файл из такого хранилища, нужно:
- Получить объект
ХранилищеЗначенияиз реквизита. - Извлечь двоичные данные методом
.Получить(). - Сохранить их в файл (см. Способ 2).
Пример кода для документа с реквизитом ФайлХранилище:
ДвоичныеДанные = Документ.ФайлХранилище.Получить();
Если ДвоичныеДанные.Размер() > 0 Тогда
ИзвлечьФайлИзДвоичныхДанных(ДвоичныеДанные, "C:\Temp\extracted_file.dat");
Иначе
Сообщить("Хранилище пустое!");
КонецЕсли;
Особенности работы с ХранилищеЗначения:
| Сcenario | Метод | Примечание |
|---|---|---|
| Данные — это файл | .Получить() | Возвращает ДвоичныеДанные |
| Данные — это объект 1С (например, документ) | .Восстановить() | Возвращает ссылку на объект |
| Нужно проверить тип данных | .ТипЗнч() | Вернёт строку, например "ДвоичныеДанные" |
| Данные сжаты | .Разжать() | Требует предварительной проверки на сжатие |
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) или попросите администратора выгрузить данные через конфигуратор. Права администратора нужны только для доступа к служебным функциям платформы.
Как узнать реальный тип файла, если расширение неизвестно?
Есть несколько способов:
- Посмотреть первые байты в шестнадцатеричном редакторе (см. таблицу сигнатур на Википедии).
- Использовать утилиту TrID (определяет тип по сигнатуре).
- В 1С: проверить MIME-тип через
ПолучитьMIMEТипИзДвоичныхДанных()(доступно в последних версиях платформы).
Почему при сохранении PDF из 1С он открывается как текстовый файл?
Это типичная проблема с кодировкой. PDF — бинарный формат, и если сохранить его как текст (например, через ЗаписатьТекст() вместо Записать()), он повредится. Всегда используйте методы для работы с двоичными данными, а не текстовыми.
Как извлечь файлы из табличной части документа?
Для табличных частей нужно обходить строки в цикле. Пример:
Для Каждого Строка Из Документ.ТабличнаяЧастьЦикл
Если ЗначениеЗаполнено(Строка.Файл) Тогда
ИзвлечьФайлИзДвоичныхДанных(Строка.Файл.Получить(), "C:\Temp\" + Строка.НомерСтроки + ".pdf");
КонецЕсли;
КонецЦикла;
Можно ли автоматизировать извлечение файлов по расписанию?
Да, для этого используйте регламентные задания:
- Создайте обработку с кодом извлечения (см. Способ 2 или 4).
- Настройте регламентное задание в
Администрирование → Регламентные и фоновые задания. - Укажите расписание (например, ежедневно в 2:00).
Для сложных сценариев (например, отправка файлов по FTP) лучше использовать 1С:Рарус:Автоматизация или 1С:EDT.