В процессе разработки в системе 1С:Предприятие (удобно через инструменты разработки и анализа кода 1С) часто возникает задача извлечения текстовой информации из объекта типа ДвоичныеДанные. Традиционный подход с записью файла на диск и его последующим чтением через ТекстовыйДокумент или ЧтениеТекста является рабочим, но не самым оптимальным с точки зрения производительности и чистоты кода. В данной статье мы разберем, как выполнить это преобразование в оперативной памяти, минимизируя нагрузку на дисковую подсистему и избегая проблем с временными файлами.
Начиная с версии платформы 8.3.9, разработчикам стал доступен наиболее лаконичный и эффективный метод — использование глобальной функции ПолучитьСтрокуИзДвоичныхДанных(). Этот метод позволяет мгновенно конвертировать содержимое объекта ДвоичныеДанные в обычную строку 1С.
Рассмотрим пример кода, реализующий этот подход:
// Предположим, ДвоичныеДанныеОбъект уже получен из ХранилищаЗначений или файла
Попытка
СтрокаРезультат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеОбъект, КодировкаТекста.UTF8);
Сообщить("Данные успешно прочитаны: " + СтрокаРезультат);
Исключение
Сообщить("Ошибка при преобразовании данных: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем этот код. Важнейшим параметром здесь является КодировкаТекста. Если вы ошибетесь с кодировкой (например, укажете UTF8 для файла в кодировке ANSI), в полученной строке могут появиться некорректные символы («кракозябры»). Если кодировка неизвестна, платформа попытается определить её автоматически, но явное указание всегда надежнее.
Если ваша версия платформы выше 8.3.6, но ниже 8.3.9, или если требуется более тонкая обработка данных (например, чтение больших файлов по частям), следует использовать механизм потоков — для этого подойдёт обработка распознавания текста из двоичных данных. Этот способ позволяет работать с данными в памяти так же, как если бы они были файлом на диске.
Разберем пошагово процесс трансформации данных (поможет универсальная загрузка и трансформация данных для 1С) через потоки:
ПотокВПамяти на основании имеющихся двоичных данных.ЧтениеДанных для извлечения текста из этого потока.Посмотрим на практическую реализацию:
// Создаем поток в оперативной памяти на базе двоичных данных
Поток = Новый ПотокВПамяти(ДвоичныеДанныеОбъект);
// Оборачиваем поток в объект для чтения
Чтение = Новый ЧтениеДанных(Поток, КодировкаТекста.UTF8);
// Читаем всё содержимое в одну строку
ТекстИзПамяти = Чтение.ПрочитатьСтроку();
// Закрываем чтение и поток
Чтение.Закрыть();
Поток.Закрыть();
Этот метод считается наиболее универсальным для платформы 8.3, так как объект ЧтениеДанных предоставляет гибкие инструменты для работы с маркерами порядка байтов (BOM) и различными форматами окончаний строк.
В случаях, когда разработка ведется на устаревших версиях платформы (например, 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.
Рассмотрим причины, по которым работа в памяти предпочтительнее использования диска:
ПолучитьИмяВременногоФайла() система лишь генерирует путь. Если программа аварийно завершится до вызова УдалитьФайлы(), «мусор» останется в системной папке temp. При интенсивной работе сервера это может привести к переполнению дискового пространства.Проанализируем важный нюанс: объем данных. При преобразовании двоичных данных в строку нужно помнить, что строки в 1С хранятся в формате Unicode. Это означает, что текстовая строка может занимать в памяти в два раза больше места, чем исходный массив двоичных данных (особенно если исходник был в кодировке ANSI или UTF-8 без символов национальных алфавитов). Если вы работаете с файлами размером в несколько сотен мегабайт, получение прямой строки может привести к ошибке "Недостаточно памяти". В таких ситуациях рекомендуется обрабатывать данные порциями, используя объект ЧтениеДанных — поможет автоматизация извлечения реквизитов из PDF и сканов.
Также обратите внимание на символ BOM (Byte Order Mark). Это невидимый символ в начале файла, который указывает на кодировку. Современные методы 1С (особенно через ЧтениеДанных) умеют автоматически распознавать и отсекать этот символ. Если же вы используете старые методы или некорректно указываете кодировку, в начале вашей строки могут появиться странные символы, мешающие дальнейшей обработке текста (например, парсингу XML или JSON).
Таким образом, для современных конфигураций на базе 1С 8.3 оптимальным выбором будет функция ПолучитьСтрокуИзДвоичныхДанных, а для сложных задач манипуляции данными — использование ПотокВПамяти. Для этой задачи есть система распознавания и загрузки документов в 1С.