Работа с современными веб-сервисами в среде 1С:Предприятие 7.7 (так называемых «клюшках») часто сопряжена с трудностями, которые в версии 8.3 решаются одной строкой кода. Одной из таких задач является получение картинки через API в формате Base64 и её последующее сохранение или отображение. Основная проблема заключается в том, что штатные средства 1С 7.7 не умеют напрямую работать с двоичными данными (Binary Data) и воспринимают нулевой байт как символ окончания строки, что приводит к порче бинарных файлов при попытке записать их стандартными методами.
В этой статье мы подробно разберем, как обойти ограничения платформы 7.7, корректно декодировать Base64 и преобразовать полученные данные в привычные форматы изображений.
Проанализируем ситуацию: когда мы получаем ответ от сервера, картинка передается в виде длинной текстовой строки. Если мы попытаемся сохранить её как обычный текст, мы получим текстовый файл с кодом. Если мы попытаемся декодировать её в «строку 1С», то при записи в файл возникнет потеря данных. Двоичные файлы (картинки) содержат байты с нулевым значением (0x00). В языке 1С 7.7 строковая переменная обрывается на первом же таком байте. Именно поэтому пользователи часто замечают, что в заголовке файла (например, в формате RIFF/WebP) не хватает байтов.
Один из самых надежных способов декодирования строки 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 для непосредственного сохранения на диск.
Чтобы избежать искажения картинки при записи на диск, мы должны использовать 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();
Зачастую современные сервисы возвращают изображения в формате WebP (в заголовке файла вы увидите сигнатуру RIFF....WEBP). Платформа 1С 7.7 не умеет отображать этот формат в стандартных объектах «Картинка». Выясним причину: это формат сжатия от Google, который требует специальных библиотек.
Разберем, как выполнить конвертацию программно с помощью внешних утилит:
libwebp.
Команда для запуска из 1С:
КомандаСистемы("dwebp.exe image.webp -o image.jpg");КомандаСистемы("certutil -decode encoded.txt image.webp");КомандаСистемы("magick convert image.webp image.bmp");Если в вашей конфигурации установлена библиотека 1С++, задача упрощается. Класс BinaryData позволяет работать с байтами напрямую без риска их искажения. Проанализируем примерный алгоритм:
BinaryData.Это избавляет от необходимости использовать MSScriptControl и сложные манипуляции с ADODB.Stream.
Подведем итог: для успешного просмотра картинки из Base64 в 1С 7.7 мы рекомендуем следующую последовательность действий:
WinHttp.WinHttpRequest.5.1.bin.base64) или CDO.Message.Соблюдение этой технологической цепочки гарантирует сохранность каждого байта изображения и корректную работу программы даже с самыми современными веб-форматами в среде «старой доброй» семерки.