Работа с двоичными данными в 1С:Предприятие — одна из самых востребованных задач при интеграции с внешними системами, обработке файлов или сохранении сложных структур данных. Чаще всего разработчикам требуется получить содержимое файла в виде массива байтов (двоичные данные), чтобы затем передать его по HTTP, сохранить в базе в специальном поле или обработать с помощью внешних библиотек. Однако стандартные механизмы платформы не всегда очевидны, а альтернативные методы могут вызывать ошибки при некорректном использовании.
В этой статье мы разберём все актуальные способы получения двоичных данных файла в 1С 8.3 и 1С 8.2, включая работу с объектами ДвоичныеДанные, ЧтениеДанных, COM-объектами и внешними компонентами. Особое внимание уделим типичным ошибкам (например, несоответствие кодировок при чтении текстовых файлов или утечки памяти при работе с COM), а также нюансам производительности для крупных файлов. Если вы ищете готовое решение для конкретной задачи — используйте оглавление, чтобы быстро перейти к нужному разделу.
1. Что такое двоичные данные в 1С и зачем они нужны
В платформе 1С:Предприятие двоичные данные представляют собой объект типа ДвоичныеДанные, который хранит последовательность байтов. Этот тип данных используется для:
- 📁 Работы с содержимым файлов (PDF, изображения, архивы, исполняемые файлы).
- 🔄 Обмена данными с внешними системами через REST API или SOAP (например, отправка файлов на сервер).
- 🗄️ Хранения сложных структур в базе (например, сериализованных объектов или зашифрованных данных).
- 🔧 Интеграции с оборудованием (сканеры, принтеры, терминалы сбора данных).
Отличие двоичных данных от строковых в том, что они сохраняют исходное представление файла без преобразований. Например, если вы прочитаете PDF-файл как строку, то получите нечитаемый набор символов из-за особенностей кодировки. А при чтении в ДвоичныеДанные файл останется корректным для дальнейшей обработки.
⚠️ Внимание: Объект ДвоичныеДанные в 1С имеет ограничение на размер — до 2 ГБ в 64-разрядной версии платформы и до 1 ГБ в 32-разрядной. Для работы с более крупными файлами потребуются обходные решения (например, чтение по частям).
2. Стандартный способ: объект «ДвоичныеДанные» и «ЧтениеДанных»
Самый простой и рекомендуемый способ получения двоичных данных — использование встроенных объектов ДвоичныеДанные и ЧтениеДанных. Этот метод работает во всех версиях платформы, начиная с 1С 8.2, и не требует подключения внешних компонент.
Пример кода для чтения файла в двоичный формат:
ПутьКФайлу = "C:\Temp\example.pdf";
// Создаём объект для чтения файла
ЧтениеДанных = Новый ЧтениеДанных(ПутьКФайлу, РежимЧтенияДанных.ДвоичныеДанные);
// Читаем всё содержимое в двоичные данные
ДвоичныеДанныеФайла = ЧтениеДанных.Прочитать();
// Закрываем поток
ЧтениеДанных.Закрыть();
// Теперь ДвоичныеДанныеФайла содержит массив байтов
Альтернативный вариант — использование конструктора Новый ДвоичныеДанные() с последующим заполнением из файла:
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
Оба метода эквивалентны, но первый даёт больше контроля (например, позволяет читать файл по частям).
3. Чтение двоичных данных по частям (для крупных файлов)
Если файл имеет большой размер (например, видео или база данных), чтение его целиком может привести к переполнению памяти или замедлению работы системы. В таких случаях рекомендуется читать данные порциями с помощью метода Прочитать() с указанием размера буфера.
Пример постраничного чтения:
ПутьКФайлу = "C:\Temp\large_file.zip";
РазмерБуфера = 1024 * 1024; // 1 МБ за итерацию
ЧтениеДанных = Новый ЧтениеДанных(ПутьКФайлу, РежимЧтенияДанных.ДвоичныеДанные);
ДвоичныеДанныеФайла = Новый ДвоичныеДанные();
Пока Истина Цикл
ДанныеЧасти = ЧтениеДанных.Прочитать(РазмерБуфера);
Если ДанныеЧасти.Размер() = 0 Тогда
Прервать;
КонецЕсли;
ДвоичныеДанныеФайла.Добавить(ДанныеЧасти);
КонецЦикла;
ЧтениеДанных.Закрыть();
| Параметр | Описание | Рекомендуемое значение |
|---|---|---|
РазмерБуфера |
Количество байтов, считываемых за одну итерацию | От 1 МБ до 10 МБ (зависит от доступной памяти) |
РежимЧтенияДанных.ДвоичныеДанные |
Указывает, что файл читается в двоичном формате | Обязательный параметр |
ДвоичныеДанные.Добавить() |
Метод для объединения частей файла | Используется в цикле |
⚠️ Внимание: При чтении файлов размером более 500 МБ рекомендуется увеличивать размер буфера до 5–10 МБ, чтобы сократить количество итераций. Однако слишком большой буфер (например, 100 МБ) может вызвать ошибку нехватки памяти на слабых машинах.
Убедиться, что на диске достаточно свободного места (минимум в 2 раза больше размера файла)|
Закрыть все ненужные приложения для освобождения оперативной памяти|
Использовать буфер размером 1–10 МБ в зависимости от мощности ПК|
Проверить права доступа к файлу и папке|
Обработать исключения (например, Исключение при отсутствии файла)
-->
4. Альтернативные методы: COM-объекты и внешние компоненты
В некоторых случаях стандартные объекты 1С могут не подходить (например, при работе с OLE-объектами или специфическими форматами файлов). Тогда на помощь приходят:
- 🖥️ COM-объекты (например,
ADODB.StreamилиScripting.FileSystemObject). - 🔌 Внешние компоненты (например, 1C:Enterprise Development Tools или сторонние библиотеки).
- 📦 HTTP-Сервисы (если файл расположен на удалённом сервере).
Пример использования ADODB.Stream для чтения двоичных данных:
ПутьКФайлу = "C:\Temp\document.docx";
// Создаём COM-объект
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; // 1 = двоичный режим
Поток.Open();
Поток.LoadFromFile(ПутьКФайлу);
// Читаем данные в массив байтов
ДвоичныеДанныеФайла = Поток.Read();
// Закрываем поток и освобождаем объект
Поток.Close();
Поток = Неопределено;
Преимущества этого метода:
- ⚡ Быстрее стандартного
ЧтениеДанныхдля некоторых форматов. - 🛠️ Больше возможностей для манипуляции данными (например, конвертация кодировок).
Недостатки:
- 🚨 Риск утечек памяти при некорректном освобождении объектов.
- 🔒 Требует прав на создание COM-объектов (может быть заблокировано политиками безопасности).
Когда стоит избегать COM-объектов?
Использование ADODB.Stream и других COM-объектов не рекомендуется в следующих случаях:
1. В тонком клиенте или веб-клиенте (могут возникнуть ошибки безопасности).
2. При работе с 64-разрядной версией 1С, если COM-объект зарегистрирован только для 32-разрядной системы.
3. В управляемых формах на сервере (COM-объекты могут не поддерживаться).
5. Работа с двоичными данными в HTTP-запросах
Одной из самых распространённых задач является отправка файлов на сервер через HTTP-запросы. Для этого двоичные данные нужно правильно упаковать в тело запроса, указав корректные заголовки.
Пример отправки файла методом POST:
URL = "https://example.com/upload";
ПутьКФайлу = "C:\Temp\report.xlsx";
// Получаем двоичные данные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Создаём HTTP-соединение
HTTPСоединение = Новый HTTPСоединение(URL);
HTTPЗапрос = Новый HTTPЗапрос();
// Устанавливаем заголовки
HTTPЗапрос.УстановитьЗаголовок("Content-Type", "application/octet-stream");
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла);
// Отправляем запрос
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
// Обрабатываем ответ
Если HTTPОтвет.КодСостояния = 200 Тогда
Сообщить("Файл успешно загружен!");
Иначе
Сообщить("Ошибка: " + HTTPОтвет.КодСостояния);
КонецЕсли;
Ключевые моменты:
- 📌 Заголовок
Content-Type: application/octet-streamуказывает, что передаются двоичные данные. - 📌 Для больших файлов (>100 МБ) лучше использовать потоковую передачу (метод
УстановитьТелоИзПотока()). - 📌 Некоторые серверы требуют дополнительные заголовки (например,
AuthorizationилиContent-Disposition).
Если сервер возвращает ошибку 413 Payload Too Large, проверьте ограничения на размер загружаемых файлов в его конфигурации (например, в nginx это параметр client_max_body_size).
6. Типичные ошибки и их решения
При работе с двоичными данными в 1С разработчики часто сталкиваются с следующими проблемами:
| Ошибка | Причина | Решение |
|---|---|---|
Ошибка при чтении файла: доступ запрещён |
Недостаточно прав на файл или папку | Проверьте разрешения в ОС или запустите 1С от имени администратора |
Недостаточно памяти |
Файл слишком большой для текущей конфигурации | Читайте файл по частям или увеличьте размер виртуальной памяти |
Некорректный формат данных |
Файл был прочитан как текст, а не как двоичные данные | Используйте РежимЧтенияДанных.ДвоичныеДанные |
COM-объект не найден |
Отсутствует регистрация ADODB.Stream или других компонент | Зарегистрируйте библиотеку msado15.dll или используйте альтернативные методы |
Ещё одна распространённая ошибка — несоответствие кодировок при чтении текстовых файлов как двоичных. Например, если вы прочитаете UTF-8-файл в ДвоичныеДанные, а затем попробуете преобразовать его в строку без указания кодировки, получите кракозябры. Решение:
// Правильное преобразование двоичных данных в строку с указанием кодировки
ТекстФайла = ДвоичныеДанныеФайла.ПолучитьСтроку(КодировкаТекста.UTF8);
Всегда проверяйте размер полученных двоичных данных после чтения. Если ДвоичныеДанные.Размер() возвращает 0, это может означать, что файл пуст или не был прочитан из-за ошибки.
7. Оптимизация производительности
При работе с большими объёмами данных важно минимизировать нагрузку на систему. Вот несколько советов:
- ⚡ Читайте файлы по частям (как показано в разделе 3), а не целиком.
- 🗑️ Освобождайте ресурсы: всегда закрывайте объекты
ЧтениеДанныхиCOMОбъектпосле использования. - 🔄 Используйте буферизацию: оптимальный размер буфера — 1–10 МБ (зависит от железа).
- 📊 Избегайте лишних преобразований: если файл нужно отправить по HTTP, не конвертируйте его в строку и обратно.
Пример оптимизированного кода для чтения и отправки большого файла:
ПутьКФайлу = "C:\Temp\big_file.dat";
URL = "https://example.com/upload";
РазмерБуфера = 5 1024 1024; // 5 МБ
ЧтениеДанных = Новый ЧтениеДанных(ПутьКФайлу, РежимЧтенияДанных.ДвоичныеДанные);
HTTPСоединение = Новый HTTPСоединение(URL);
Пока Истина Цикл
ДанныеЧасти = ЧтениеДанных.Прочитать(РазмерБуфера);
Если ДанныеЧасти.Размер() = 0 Тогда
Прервать;
КонецЕсли;
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДанныеЧасти);
HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
КонецЦикла;
ЧтениеДанных.Закрыть();
⚠️ Внимание: При работе с сетевыми дисками или облачными хранилищами (например, Yandex.Disk или Google Drive) чтение файлов может занимать значительно больше времени из-за задержек сети. В таких случаях рекомендуется сначала скопировать файл на локальный диск, а затем обрабатывать его.
FAQ: Частые вопросы по работе с двоичными данными в 1С
Можно ли получить двоичные данные файла из временного хранилища 1С?
Да, для этого используйте метод ПолучитьДвоичныеДанные() у объекта ХранилищеЗначения. Пример:
ДвоичныеДанные = ХранилищеЗначения.ПолучитьДвоичныеДанные();
Это актуально, если файл был ранее сохранён во временное хранилище (например, через ПоместитьФайл()).
Как преобразовать строку в двоичные данные и обратно?
Для преобразования строки в двоичные данные используйте:
ДвоичныеДанные = Новый ДвоичныеДанные(Строка, КодировкаТекста.UTF8);
Обратно (из двоичных данных в строку):
Строка = ДвоичныеДанные.ПолучитьСтроку(КодировкаТекста.UTF8);
Указывайте кодировку явно, чтобы избежать искажений символов.
Почему при чтении PDF-файла получаются некорректные данные?
Скорее всего, файл был прочитан в текстовом режиме, а не в двоичном. Всегда используйте:
ЧтениеДанных = Новый ЧтениеДанных(ПутьКФайлу, РежимЧтенияДанных.ДвоичныеДанные);
PDF, DOCX, XLSX и другие бинарные форматы нельзя читать как текст.
Как сохранить двоичные данные обратно в файл?
Используйте объект ЗаписьДанных:
ЗаписьДанных = Новый ЗаписьДанных("C:\Temp\output.pdf");
ЗаписьДанных.Записать(ДвоичныеДанныеФайла);
ЗаписьДанных.Закрыть();
Можно ли работать с двоичными данными в мобильном приложении 1С?
Да, но с ограничениями:
- В мобильном клиенте доступны объекты
ДвоичныеДанныеиЧтениеДанных, но могут быть ограничения на размер файлов. - COM-объекты в мобильной платформе не поддерживаются.
- Для работы с файлами требуется явное разрешение пользователя на доступ к хранилищу.