Как в 1С преобразовать двоичные данные в строку без сохранения файла на диск?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование встроенной функции ПолучитьСтрокуИзДвоичныхДанных

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

Рассмотрим пример кода, реализующий этот подход:


// Предположим, ДвоичныеДанныеОбъект уже получен из ХранилищаЗначений или файла
Попытка
    СтрокаРезультат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеОбъект, КодировкаТекста.UTF8);
    Сообщить("Данные успешно прочитаны: " + СтрокаРезультат);
Исключение
    Сообщить("Ошибка при преобразовании данных: " + ОписаниеОшибки());
КонецПопытки;

Проанализируем этот код. Важнейшим параметром здесь является КодировкаТекста. Если вы ошибетесь с кодировкой (например, укажете UTF8 для файла в кодировке ANSI), в полученной строке могут появиться некорректные символы («кракозябры»). Если кодировка неизвестна, платформа попытается определить её автоматически, но явное указание всегда надежнее.

Метод 2: Работа через объект ПотокВПамяти и ЧтениеДанных

Если ваша версия платформы выше 8.3.6, но ниже 8.3.9, или если требуется более тонкая обработка данных (например, чтение больших файлов по частям), следует использовать механизм потоков — для этого подойдёт обработка распознавания текста из двоичных данных. Этот способ позволяет работать с данными в памяти так же, как если бы они были файлом на диске.

Разберем пошагово процесс трансформации данных (поможет универсальная загрузка и трансформация данных для 1С) через потоки:

  1. Создаем объект ПотокВПамяти на основании имеющихся двоичных данных.
  2. Используем объект ЧтениеДанных для извлечения текста из этого потока.
  3. Считываем строку и закрываем потоки для освобождения ресурсов.

Посмотрим на практическую реализацию:


// Создаем поток в оперативной памяти на базе двоичных данных
Поток = Новый ПотокВПамяти(ДвоичныеДанныеОбъект);

// Оборачиваем поток в объект для чтения
Чтение = Новый ЧтениеДанных(Поток, КодировкаТекста.UTF8);

// Читаем всё содержимое в одну строку
ТекстИзПамяти = Чтение.ПрочитатьСтроку();

// Закрываем чтение и поток
Чтение.Закрыть();
Поток.Закрыть();

Этот метод считается наиболее универсальным для платформы 8.3, так как объект ЧтениеДанных предоставляет гибкие инструменты для работы с маркерами порядка байтов (BOM) и различными форматами окончаний строк.

Метод 3: Использование COM-объекта ADODB.Stream (для старых систем)

В случаях, когда разработка ведется на устаревших версиях платформы (например, 8.2) и использование современных потоков невозможно, программисты часто прибегают к помощи системных библиотек Windows. Одним из самых надежных способов является использование объекта ADODB.Stream.

Выясним, как реализовать этот алгоритм:


// Создаем COM-объект
Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 1; // Binary
Stream.Open();
Stream.Write(ДвоичныеДанныеОбъект); // Записываем двоичные данные в поток

// Переключаем режим на чтение текста
Stream.Position = 0;
Stream.Type = 2; // Text
Stream.Charset = "utf-8"; // Указываем нужную кодировку

// Получаем строку
Результат = Stream.ReadText();
Stream.Close();

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

Почему стоит избегать временных файлов?

Рассмотрим причины, по которым работа в памяти предпочтительнее использования диска:

Особенности работы с памятью и кодировками

Проанализируем важный нюанс: объем данных. При преобразовании двоичных данных в строку нужно помнить, что строки в 1С хранятся в формате Unicode. Это означает, что текстовая строка может занимать в памяти в два раза больше места, чем исходный массив двоичных данных (особенно если исходник был в кодировке ANSI или UTF-8 без символов национальных алфавитов). Если вы работаете с файлами размером в несколько сотен мегабайт, получение прямой строки может привести к ошибке "Недостаточно памяти". В таких ситуациях рекомендуется обрабатывать данные порциями, используя объект ЧтениеДанных — поможет автоматизация извлечения реквизитов из PDF и сканов.

Также обратите внимание на символ BOM (Byte Order Mark). Это невидимый символ в начале файла, который указывает на кодировку. Современные методы 1С (особенно через ЧтениеДанных) умеют автоматически распознавать и отсекать этот символ. Если же вы используете старые методы или некорректно указываете кодировку, в начале вашей строки могут появиться странные символы, мешающие дальнейшей обработке текста (например, парсингу XML или JSON).

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

← На главную