Как в 1С 7.7 преобразовать строку Base64 в файл изображения (JPG, BMP, WebP)?

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

Работа с современными веб-сервисами в среде 1С:Предприятие 7.7 (так называемых «клюшках») часто сопряжена с трудностями, которые в версии 8.3 решаются одной строкой кода. Одной из таких задач является получение картинки через API в формате Base64 и её последующее сохранение или отображение. Основная проблема заключается в том, что штатные средства 1С 7.7 не умеют напрямую работать с двоичными данными (Binary Data) и воспринимают нулевой байт как символ окончания строки, что приводит к порче бинарных файлов при попытке записать их стандартными методами.

В этой статье мы подробно разберем, как обойти ограничения платформы 7.7, корректно декодировать Base64 и преобразовать полученные данные в привычные форматы изображений.

Причина проблемы: Почему обычное сохранение не работает?

Проанализируем ситуацию: когда мы получаем ответ от сервера, картинка передается в виде длинной текстовой строки. Если мы попытаемся сохранить её как обычный текст, мы получим текстовый файл с кодом. Если мы попытаемся декодировать её в «строку 1С», то при записи в файл возникнет потеря данных. Двоичные файлы (картинки) содержат байты с нулевым значением (0x00). В языке 1С 7.7 строковая переменная обрывается на первом же таком байте. Именно поэтому пользователи часто замечают, что в заголовке файла (например, в формате RIFF/WebP) не хватает байтов.

Решение 1: Декодирование Base64 с использованием COM-объектов (CDO.Message)

Один из самых надежных способов декодирования строки Base64 без использования внешних компонент — это использование системного объекта CDO.Message. Рассмотрим программный код, который позволяет выполнить это преобразование:


Функция глДекодироватьСтрокуИз_Base64(_Строка, Кодировка) Экспорт
    // Создаем объект CDO для работы с потоками данных
    ЦДО = СоздатьОбъект("CDO.Message");
    БодиПарт = ЦДО.BodyPart;
    
    // Указываем тип кодирования (Base64)
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим = БодиПарт.GetEncodedContentStream();
    
    // Настраиваем поля заголовка, чтобы объект понимал тип контента
    Поля = БодиПарт.Fields;
    Поле = Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value = "text/plain; charset=""windows-1251""";
    Поля.Update();
    
    // Записываем нашу Base64 строку в поток
    Стрим.WriteText(_Строка);
    Стрим.Flush();
    
    // Получаем декодированный поток
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    
    // Возвращаем результат (но помните про ограничение строк!)
    Возврат Стрим.ReadText();
КонецФункции

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

Решение 2: Сохранение бинарных данных через ADODB.Stream

Чтобы избежать искажения картинки при записи на диск, мы должны использовать ADODB.Stream с установленным типом adTypeBinary (значение 1). Посмотрим на пример, как можно сохранить ответ от WinHttpRequest напрямую в файл, минуя строковые переменные 1С:


// Создаем поток ADO
обСтримВыход = СоздатьОбъект("ADODB.Stream");
обСтримВыход.Type = 1; // Указываем, что данные бинарные
обСтримВыход.Mode = 3; // Разрешаем чтение и запись
обСтримВыход.Open();

// Для работы с двоичным телом ответа используем MSScriptControl
// Это необходимо, так как 1С 7.7 не может напрямую обработать ResponseBody
олеШелл = СоздатьОбъект("MSScriptControl.ScriptControl");
олеШелл.Language = "vbscript";
олеШелл.AddObject("oleADO", обСтримВыход);
олеШелл.AddObject("WinHttp", WinHttp); // WinHttp — это ваш объект запроса

// С помощью VBScript записываем двоичные данные из HTTP-ответа в поток ADO
олеШелл.Eval("oleADO.Write(WinHttp.ResponseBody)");

// Сохраняем поток в файл на диск
обСтримВыход.SaveToFile("C:\temp\image.webp", 2); 
обСтримВыход.Close();

Решение 3: Конвертация из WebP в JPG/BMP

Зачастую современные сервисы возвращают изображения в формате WebP (в заголовке файла вы увидите сигнатуру RIFF....WEBP). Платформа 1С 7.7 не умеет отображать этот формат в стандартных объектах «Картинка». Выясним причину: это формат сжатия от Google, который требует специальных библиотек.

Разберем, как выполнить конвертацию программно с помощью внешних утилит:

  1. Использование dwebp: Это консольная утилита от разработчиков Google. Скачайте пакет libwebp. Команда для запуска из 1С: КомандаСистемы("dwebp.exe image.webp -o image.jpg");
  2. Использование CertUtil: Если вам нужно только декодировать Base64, который уже сохранен как текстовый файл, можно воспользоваться встроенной в Windows утилитой: КомандаСистемы("certutil -decode encoded.txt image.webp");
  3. ImageMagick: Мощнейший инструмент для обработки графики. Позволяет конвертировать практически любые форматы: КомандаСистемы("magick convert image.webp image.bmp");

Использование внешней компоненты 1С++

Если в вашей конфигурации установлена библиотека 1С++, задача упрощается. Класс BinaryData позволяет работать с байтами напрямую без риска их искажения. Проанализируем примерный алгоритм:

Это избавляет от необходимости использовать MSScriptControl и сложные манипуляции с ADODB.Stream.

Итоговые рекомендации

Подведем итог: для успешного просмотра картинки из Base64 в 1С 7.7 мы рекомендуем следующую последовательность действий:

  1. Получите Base64-строку через WinHttp.WinHttpRequest.5.1.
  2. Используйте ADODB.Stream для записи данных на диск. Если данные уже в Base64, предварительно декодируйте их через MSXML2.DOMDocument (метод с bin.base64) или CDO.Message.
  3. Если полученный файл имеет формат WebP, запустите внешнюю консольную утилиту (например, nconvert или dwebp) для преобразования в JPG или BMP.
  4. Загрузите итоговый JPG/BMP файл в объект «Картинка» на форме 1С.

Соблюдение этой технологической цепочки гарантирует сохранность каждого байта изображения и корректную работу программы даже с самыми современными веб-форматами в среде «старой доброй» семерки.

← На главную