Как декодировать файл из Base64 в изображение с помощью командной строки и 1С

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

В практике разработчика 1С часто возникает задача обмена данными с внешними системами. Одной из типичных ситуаций является получение изображения, закодированного в строку Base64, внутри текстового файла или XML/JSON пакета. Если встроенных средств платформы недостаточно (что часто бывает в версии 7.7), на помощь приходят системные утилиты Windows. В этой статье мы подробно разберем, как автоматизировать процесс декодирования с помощью утилиты certutil.exe, как правильно сформировать пакетный файл (.bat) и как интегрировать это решение непосредственно в код 1С.

Использование системной утилиты certutil для декодирования

Для начала разберем инструмент, который мы будем использовать. В составе современных ОС Windows (начиная с Windows 7 и выше) присутствует мощная утилита для работы с сертификатами — certutil.exe. Несмотря на свое название, она обладает отличным функционалом для кодирования и декодирования данных.

Рассмотрим базовый синтаксис команды, который обсуждался в теме:

C:\Windows\System32\certutil.exe -decode "путь_к_исходному_файлу" "путь_к_результирующему_файлу"

Проанализируем ситуацию, когда нам нужно превратить текстовый файл IMG64.txt в картинку IMG65.jpg. Если мы просто выполним эту команду в командной строке, система прочитает содержимое текстового файла, интерпретирует его как Base64 и создаст бинарный файл изображения.

Создание пакетного файла (.bat) и решение проблем с путями

Многие начинающие разработчики сталкиваются с тем, что простое копирование строки в текстовый файл с расширением .bat не всегда дает нужный результат. Разберем по шагам, как сделать это правильно:

  1. Создайте текстовый файл (например, в Блокноте).
  2. Вставьте туда команду декодирования.
  3. Сохраните файл с расширением .bat или .cmd.
  4. Важный нюанс: Если в путях к файлам присутствуют пробелы (например, "Новая папка"), пути обязательно должны быть заключены в двойные кавычки.

Чтобы понять, почему батник может не срабатывать, рекомендуется добавить второй строкой команду pause. Это не даст окну консоли закрыться мгновенно, и мы сможем прочитать сообщение об ошибке. Рассмотрим пример правильного содержимого бат-файла:


C:\Windows\System32\certutil.exe -decode "C:\Users\user\Desktop\Новая папка\IMG64.txt" "C:\Users\user\Desktop\Новая папка\IMG65.jpg"
pause

Проблема кодировки в пакетных файлах

Выясним причину, по которой батник может выдавать ошибку «Системе не удается найти указанный путь», даже если путь указан верно. Командная строка Windows (CMD) по умолчанию работает в кодировке CP866 (OEM). Если вы сохранили бат-файл в обычной кодировке Windows-1251 (ANSI), то русские буквы в слове "Новая папка" превратятся в нечитаемые символы для системы.

Для решения этой проблемы мы можем либо сохранять файл в кодировке OEM, либо добавить в начало скрипта команду переключения кодовой страницы:


chcp 1251 > nul
C:\Windows\System32\certutil.exe -decode "C:\МоиКартинки\файл.txt" "C:\МоиКартинки\картинка.jpg"

Интеграция в 1С 7.7: работа с кавычками

В платформе 1С 7.7 для запуска внешних программ используется функция КомандаСистемы(). Основная сложность здесь заключается в том, что сама команда внутри 1С передается как строковый литерал, который тоже ограничивается кавычками. Если нам нужно передать кавычки внутри строки, мы должны использовать функцию Симв(34).

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


ПутьКПрограмме = "C:\Windows\System32\certutil.exe";
ФайлИсточник = "C:\Users\user\Desktop\Новая папка\IMG64.txt";
ФайлПриемник = "C:\Users\user\Desktop\Новая папка\IMG65.jpg";

Кавычка = Симв(34);
Команда = ПутьКПрограмме + " -decode " + Кавычка + ФайлИсточник + Кавычка + " " + Кавычка + ФайлПриемник + Кавычка;

КомандаСистемы(Команда);

Такой подход позволяет динамически подставлять пути к файлам и гарантирует, что Windows правильно обработает пробелы в именах каталогов.

Улучшенный метод запуска через WScript.Shell

Использование КомандаСистемы() имеет существенный недостаток: во время выполнения на экране "мигает" черное окно консоли, что может раздражать пользователя. Более профессиональный способ — использование COM-объекта WScript.Shell. Проанализируем этот метод:


// Создаем объект оболочки Windows
Shell = СоздатьОбъект("WScript.Shell");

// Формируем команду (аналогично предыдущему примеру)
Команда = "certutil -f -decode " + Симв(34) + ПутьИсточник + Симв(34) + " " + Симв(34) + ПутьВыход + Симв(34);

// Запускаем
// Параметр 0 — скрывает окно
// Параметр 1 — заставляет 1С ждать завершения выполнения команды
Shell.Run(Команда, 0, 1);

Обратите внимание на флаг -f в команде certutil. Мы добавили его для того, чтобы утилита принудительно перезаписывала целевой файл, если он уже существует. Без этого флага команда может остановиться в ожидании подтверждения от пользователя, что в фоновом режиме приведет к "зависанию" процесса.

Особенности подготовки данных Base64

Важно помнить, что certutil ожидает "чистую" строку Base64. Если ваш текстовый файл начинается с префикса заголовка (например, data:image/jpeg;base64,), декодирование завершится с ошибкой "Input contains invalid characters". Перед вызовом команды декодирования необходимо программно очистить текст от подобных заголовков.

Также стоит учитывать объемы данных. Если вы работаете в 1С 7.7 с очень большими файлами (более 10-20 Мб), стандартные строковые переменные могут работать медленно. В этом случае запись очищенного текста на диск перед вызовом certutil лучше выполнять через объект Текст.

Краткие выводы для платформы 1С 8.x

Если вы решаете подобную задачу на платформе 1С 8.2 или 8.3, использование внешних утилит вроде certutil обычно является избыточным. Платформа имеет мощные встроенные средства для работы с двоичными данными. Рассмотрим современный аналог решения задачи:


// Читаем строку Base64 из файла
ТекстBase64 = ЧтениеТекста.Прочитать();

// Преобразуем строку в ДвоичныеДанные
ДвоичныеДанные = Base64Значение(ТекстBase64);

// Записываем файл на диск
ДвоичныеДанные.Записать("C:\Temp\result.jpg");

Этот код работает кроссплатформенно (и на Windows, и на Linux) и значительно быстрее, так как не требует запуска сторонних процессов ОС. Однако для старых конфигураций на 1С 7.7 метод с certutil остается одним из самых надежных и простых в реализации.

← На главную