В практике разработчика 1С часто возникает задача обмена данными с внешними системами. Одной из типичных ситуаций является получение изображения, закодированного в строку Base64, внутри текстового файла или XML/JSON пакета. Если встроенных средств платформы недостаточно (что часто бывает в версии 7.7), на помощь приходят системные утилиты Windows. В этой статье мы подробно разберем, как автоматизировать процесс декодирования с помощью утилиты certutil.exe, как правильно сформировать пакетный файл (.bat) и как интегрировать это решение непосредственно в код 1С.
Для начала разберем инструмент, который мы будем использовать. В составе современных ОС Windows (начиная с Windows 7 и выше) присутствует мощная утилита для работы с сертификатами — certutil.exe. Несмотря на свое название, она обладает отличным функционалом для кодирования и декодирования данных.
Рассмотрим базовый синтаксис команды, который обсуждался в теме:
C:\Windows\System32\certutil.exe -decode "путь_к_исходному_файлу" "путь_к_результирующему_файлу"
Проанализируем ситуацию, когда нам нужно превратить текстовый файл IMG64.txt в картинку IMG65.jpg. Если мы просто выполним эту команду в командной строке, система прочитает содержимое текстового файла, интерпретирует его как Base64 и создаст бинарный файл изображения.
Многие начинающие разработчики сталкиваются с тем, что простое копирование строки в текстовый файл с расширением .bat не всегда дает нужный результат. Разберем по шагам, как сделать это правильно:
Чтобы понять, почему батник может не срабатывать, рекомендуется добавить второй строкой команду 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С передается как строковый литерал, который тоже ограничивается кавычками. Если нам нужно передать кавычки внутри строки, мы должны использовать функцию Симв(34).
Разберем пример кода, который формирует правильную строку для исполнения:
ПутьКПрограмме = "C:\Windows\System32\certutil.exe";
ФайлИсточник = "C:\Users\user\Desktop\Новая папка\IMG64.txt";
ФайлПриемник = "C:\Users\user\Desktop\Новая папка\IMG65.jpg";
Кавычка = Симв(34);
Команда = ПутьКПрограмме + " -decode " + Кавычка + ФайлИсточник + Кавычка + " " + Кавычка + ФайлПриемник + Кавычка;
КомандаСистемы(Команда);
Такой подход позволяет динамически подставлять пути к файлам и гарантирует, что Windows правильно обработает пробелы в именах каталогов.
Использование КомандаСистемы() имеет существенный недостаток: во время выполнения на экране "мигает" черное окно консоли, что может раздражать пользователя. Более профессиональный способ — использование COM-объекта WScript.Shell. Проанализируем этот метод:
// Создаем объект оболочки Windows
Shell = СоздатьОбъект("WScript.Shell");
// Формируем команду (аналогично предыдущему примеру)
Команда = "certutil -f -decode " + Симв(34) + ПутьИсточник + Симв(34) + " " + Симв(34) + ПутьВыход + Симв(34);
// Запускаем
// Параметр 0 — скрывает окно
// Параметр 1 — заставляет 1С ждать завершения выполнения команды
Shell.Run(Команда, 0, 1);
Обратите внимание на флаг -f в команде certutil. Мы добавили его для того, чтобы утилита принудительно перезаписывала целевой файл, если он уже существует. Без этого флага команда может остановиться в ожидании подтверждения от пользователя, что в фоновом режиме приведет к "зависанию" процесса.
Важно помнить, что certutil ожидает "чистую" строку Base64. Если ваш текстовый файл начинается с префикса заголовка (например, data:image/jpeg;base64,), декодирование завершится с ошибкой "Input contains invalid characters". Перед вызовом команды декодирования необходимо программно очистить текст от подобных заголовков.
Также стоит учитывать объемы данных. Если вы работаете в 1С 7.7 с очень большими файлами (более 10-20 Мб), стандартные строковые переменные могут работать медленно. В этом случае запись очищенного текста на диск перед вызовом certutil лучше выполнять через объект Текст.
Если вы решаете подобную задачу на платформе 1С 8.2 или 8.3, использование внешних утилит вроде certutil обычно является избыточным. Платформа имеет мощные встроенные средства для работы с двоичными данными. Рассмотрим современный аналог решения задачи:
// Читаем строку Base64 из файла
ТекстBase64 = ЧтениеТекста.Прочитать();
// Преобразуем строку в ДвоичныеДанные
ДвоичныеДанные = Base64Значение(ТекстBase64);
// Записываем файл на диск
ДвоичныеДанные.Записать("C:\Temp\result.jpg");
Этот код работает кроссплатформенно (и на Windows, и на Linux) и значительно быстрее, так как не требует запуска сторонних процессов ОС. Однако для старых конфигураций на 1С 7.7 метод с certutil остается одним из самых надежных и простых в реализации.