Как в 1С 7.7 преобразовать строку Base64 в изображение и сохранить его в файл

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции 1С 7.7 с современными веб-сервисами, такими как Разрешительный режим Честного Знака или Wildberries API, разработчики часто сталкиваются с необходимостью обработки данных в формате Base64. В этом формате передаются этикетки заказов, штрихкоды и другие графические объекты. Основная сложность заключается в том, что платформа 1С 7.7, в отличие от 8.x, не обладает встроенными методами для прямого декодирования таких строк. В этой статье мы подробно разберем, как обойти это ограничение, используя системные возможности Windows (аналогично работе с ZIP-архивами штатными средствами).

Почему стандартные методы 1С 7.7 не работают напрямую

Проанализируем ситуацию: в платформе 7.7 отсутствуют типы данных ДвоичныеДанные в том виде, в котором они представлены в более новых версиях. Попытки использовать объект BinaryData или Scripting.FileSystemObject для записи текстовой строки напрямую в файл с расширением .png не приведут к успеху, так как файл останется текстовым, а не бинарным. Для решения задачи нам потребуется задействовать внешние COM-объекты, которые умеют работать с потоками байтов и алгоритмами кодирования.

Решение 1: Использование объекта CDO.Message

Рассмотрим один из самых надежных способов, основанный на использовании библиотеки CDO (Collaboration Data Objects). Этот метод хитро использует механизм обработки почтовых вложений для декодирования Base64, полученного через внешнюю компоненту HTTP(S) клиента. Разберем по шагам, как это реализовать в коде.

Для начала создадим функцию, которая будет принимать строку Base64 и сохранять её в файл нужного нам формата:


Функция глДекодироватьBase64_CDO(СтрокаИсточник, Расширение = "png") Экспорт
    // Создаем объект для работы с почтовыми сообщениями
    ЦДО = СоздатьОбъект("CDO.Message");
    ФСО = СоздатьОбъект("Scripting.FileSystemObject");
    
    // Формируем пути к временным файлам
    ИмяФайла = КаталогВременныхФайлов() + ФСО.GetTempName() + "." + Расширение;
    Пустышка = КаталогВременныхФайлов() + ФСО.GetTempName();
    
    // Создаем пустой файл для инициализации вложения
    ЗначениеВФайл(Пустышка, "");
    
    // Добавляем вложение и настраиваем его кодировку
    Вложение = ЦДО.AddAttachment(Пустышка);
    Вложение.ContentTransferEncoding = "base64";
    
    // Получаем поток данных вложения
    Стрим = Вложение.GetEncodedContentStream();
    
    // Записываем нашу Base64 строку во временный текстовый файл, 
    // чтобы потом загрузить её в поток
    Текст = СоздатьОбъект("Текст");
    Текст.ДобавитьСтроку(СтрокаИсточник);
    Текст.Записать(ИмяФайла);
    
    // Загружаем данные в поток и сохраняем результат
    Стрим.LoadFromFile(ИмяФайла);
    Стрим.Flush();
    Вложение.SaveToFile(ИмяФайла);
    
    // Удаляем вспомогательный файл
    ФС.УдалитьФайл(Пустышка);
    
    Возврат ИмяФайла;
КонецФункции

В этом примере мы создаем фиктивное почтовое вложение, устанавливаем ему тип кодирования base64 и через метод SaveToFile заставляем систему выполнить декодирование "на лету". Это проверенный временем метод, который работает практически на всех конфигурациях Windows.

Решение 2: Использование связки MSXML2 и ADODB.Stream

Разберем более современный и элегантный способ, который считается "золотым стандартом" для 1С 7.7. Мы будем использовать объект MSXML2.DOMDocument (применяемый также для загрузки курсов валют) для самой расшифровки и ADODB.Stream для работы с бинарным потоком. Этот метод работает быстрее и не требует создания лишних временных файлов для инициализации вложений.

Посмотрим на пример реализации процедуры декодирования:


Процедура глBase64ToFile(СтрокаBase64, ПутьКФайлу)
    // 1. Используем XML объект для преобразования текста в массив байтов
    xml = СоздатьОбъект("MSXML2.DOMDocument");
    Элемент = xml.createElement("Base64Data");
    Элемент.dataType = "bin.base64"; // Указываем тип данных
    Элемент.text = СтрокаBase64;
    
    // 2. Используем ADODB.Stream для сохранения бинарных данных на диск
    Stream = СоздатьОбъект("ADODB.Stream");
    Stream.Type = 1; // adTypeBinary (работаем с двоичными данными)
    Stream.Open();
    
    // Записываем значение из XML узла в поток
    Stream.Write(Элемент.nodeTypedValue);
    
    // Сохраняем поток в файл. Параметр 2 означает перезапись файла, если он существует.
    Stream.SaveToFile(ПутьКФайлу, 2); 
    Stream.Close();
КонецПроцедуры

Выясним причину, по которой этот метод предпочтительнее: объект nodeTypedValue возвращает массив байтов (SafeArray), который ADODB.Stream понимает и может корректно записать в файл без текстовых искажений, характерных для обычных методов 1С 7.7.

Обратная задача: Преобразование файла в Base64

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


Функция глFileToBase64(ПутьКФайлу)
    // Читаем файл в бинарный поток
    Stream = СоздатьОбъект("ADODB.Stream");
    Stream.Type = 1; // adTypeBinary
    Stream.Open();
    Stream.LoadFromFile(ПутьКФайлу);
    БинарныеДанные = Stream.Read();
    Stream.Close();
    
    // Помещаем бинарные данные в XML элемент для кодирования
    xml = СоздатьОбъект("MSXML2.DOMDocument");
    Элемент = xml.createElement("Base64Data");
    Элемент.dataType = "bin.base64";
    Элемент.nodeTypedValue = БинарныеДанные;
    
    // Получаем текстовое представление в формате Base64
    Возврат Элемент.text;
КонецФункции

Важные нюансы при работе с Wildberries API и другими сервисами

Рассмотрим специфические моменты, которые могут помешать правильной работе кода, даже если алгоритм реализован верно:

  1. Префикс Data URI. Часто строка Base64 приходит с заголовком вида data:image/png;base64,. Если попытаться декодировать строку вместе с этим префиксом, файл будет поврежден. Перед обработкой обязательно удаляйте эту часть строки.
  2. Спецсимволы в HTTP. При передаче данных через HTTP-запросы символ + может быть ошибочно заменен на пробел. Рекомендуется выполнять обратную замену: СтрЗаменить(СтрокаBase64, " ", "+") перед началом декодирования.
  3. Формат файлов. Wildberries может возвращать этикетки в форматах PNG, SVG или PDF. Убедитесь, что вы сохраняете файл с правильным расширением, иначе внешние просмотрщики не смогут его открыть.
  4. Объем данных. При работе с очень большими изображениями COM-объекты могут потреблять значительный объем оперативной памяти. В таких случаях стоит рассмотреть использование внешних компонент, таких как Base64.dll или DialMail.dll.

Использование внешних компонент

Если по каким-то причинам использование системных COM-объектов невозможно (например, из-за ограничений прав доступа в терминальной сессии), проанализируем альтернативные варианты. Для 1С 7.7 существуют специализированные библиотеки:

Подведем итог: несмотря на почтенный возраст платформы 1С 7.7, она сохраняет гибкость благодаря поддержке COM-технологий. Использование ADODB.Stream и MSXML2 позволяет бесшовно интегрировать старые системы с современными Marketplace API, обеспечивая полноценную работу с изображениями и штрихкодами.

← На главную