К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как закодировать строку в Base64 в 1С

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

Кодирование строки в Base64 в 1С чаще всего требуется при обмене данными с веб-сервисами, REST API, при передаче файлов внутри JSON или XML, а также при формировании заголовков авторизации (например, Basic Auth). Встроенной функции «в одну строку» для строк в платформе нет, поэтому задача решается через промежуточное преобразование строки в двоичные данные и последующее кодирование их в Base64.

Стандартный подход одинаков для большинства версий платформы 1С:Предприятие 8.3: строка сначала помещается в объект ДвоичныеДанные (через временный файл или поток в памяти), затем применяется функция Base64Строка(). Обратное преобразование выполняется функцией Base64Значение().

Ниже приведены готовые универсальные функции, которые можно вставить в общий модуль, а также варианты для тонкого клиента без вызова сервера, работа с файлами и разбор типичных ошибок — неверной кодировки, лишних переносов строк и путаницы между кодированием и шифрованием.

Базовый принцип: строка → двоичные данные → Base64

Функции Base64Строка() и Base64Значение() работают не с текстом напрямую, а с объектом типа ДвоичныеДанные. Поэтому ключевой вопрос при кодировании строки — в какой кодировке записать её байты. Чаще всего внешние сервисы ожидают UTF-8, и именно эту кодировку следует использовать по умолчанию.

Самый чистый способ без создания временных файлов — использовать поток в памяти:

Функция СтрокаВBase64(Строка, Кодировка = Неопределено) Экспорт

Если Кодировка = Неопределено Тогда

Кодировка = КодировкаТекста.UTF8;

КонецЕсли;

Поток = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(Поток, Кодировка);

ЗаписьДанных.ЗаписатьСтроку(Строка);

ЗаписьДанных.Закрыть();

Возврат Base64Строка(Поток.ПолучитьДвоичныеДанные());

КонецФункции

Обратное преобразование выглядит симметрично:

Функция Base64ВСтроку(СтрокаBase64, Кодировка = Неопределено) Экспорт

Если Кодировка = Неопределено Тогда

Кодировка = КодировкаТекста.UTF8;

КонецЕсли;

ДвоичныеДанные = Base64Значение(СтрокаBase64);

Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();

ЧтениеДанных = Новый ЧтениеДанных(Поток, Кодировка);

Результат = ЧтениеДанных.ПрочитатьСимволы();

ЧтениеДанных.Закрыть();

Возврат Результат;

КонецФункции

Кодирование через временный файл — простой вариант

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

Функция СтрокаВBase64ЧерезФайл(Строка) Экспорт

ИмяФайла = ПолучитьИмяВременногоФайла("txt");

ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

ЗаписьТекста.Записать(Строка);

ЗаписьТекста.Закрыть();

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);

Результат = Base64Строка(ДвоичныеДанные);

УдалитьФайлы(ИмяФайла);

Возврат Результат;

КонецФункции

Этот вариант нагляден и работает практически везде, но создаёт файловые операции, что медленнее при массовой обработке и требует прав на запись в каталог временных файлов. Для разовых задач и отладки он вполне приемлем, для пакетной обработки тысяч строк лучше использовать поток в памяти.

Кодирование на клиенте без вызова сервера

В тонком и веб-клиенте не всегда удобно делать серверный вызов ради одной строки. Потоки в памяти и функции Base64Строка() доступны и на клиенте в управляемом приложении, поэтому функцию из первого раздела можно разместить в клиентском общем модуле.

Для файлов на клиенте действует ограничение: прямой доступ к файловой системе требует расширения работы с файлами. Если нужно закодировать выбранный пользователем файл, используйте НачатьПомещениеФайла() или НачатьПомещениеФайлаНаСервер() — помещённый файл передаётся как двоичные данные, которые затем кодируются стандартно.

В обычном приложении (толстый клиент) все описанные способы работают без ограничений, включая прямое создание ДвоичныеДанные из файла.

Кодирование файлов и картинок

Когда требуется передать файл (например, изображение или PDF) внутри JSON, двоичные данные получают напрямую из файла, минуя этап со строкой:

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Docs\akt.pdf");

СтрокаBase64 = Base64Строка(ДвоичныеДанные);

Если файл хранится в информационной базе (в реквизите типа ХранилищеЗначения), сначала извлеките его содержимое методом Получить(), при необходимости сохраните во временный файл и далее закодируйте тем же способом.

Учитывайте, что Base64 увеличивает объём данных примерно на треть. Файл в 3 Мбайт превратится примерно в 4 Мбайт текста. Для больших вложений проверьте ограничения принимающего API на размер тела запроса — многие сервисы ограничивают его несколькими мегабайтами.

Способы получения двоичных данных

Поток в памяти

Быстро, без файловых операций; подходит для строк и массовой обработки. Требует аккуратной работы с объектами ЗаписьДанных/ЧтениеДанных.

Временный файл

Простой и наглядный код; медленнее при пакетной обработке и требует прав на каталог временных файлов.

ДвоичныеДанные из файла

Единственный прямой способ для готовых файлов (картинки, PDF); на клиенте требует расширения работы с файлами.

Проверка результата и контроль кодировки

Самая частая причина «неправильного» Base64 — несовпадение кодировки на этапе преобразования строки в байты. Если внешний сервис декодирует вашу строку и получает иероглифы или вопросительные знаки, почти наверняка вы записали строку в ANSI (windows-1251), а сервис ожидал UTF-8.

Простой способ самопроверки — выполнить полный цикл: закодировать строку и сразу декодировать её той же парой функций. Если исходная и итоговая строки совпадают, механизм работает корректно, и проблему следует искать на стороне приёмника.

Дополнительно можно сверить результат с эталоном: небольшую строку закодируйте любым независимым онлайн-кодировщиком Base64 (с выбором UTF-8) и сравните с выводом вашей функции. Совпадение подтверждает корректность кодировки и отсутствие лишних байтов.

Контрольные точки

Как проверить результат

Декодирование своей строки обратно
Норма

Полученная строка полностью совпадает с исходной

Тревожный признак

Появляются иероглифы, знаки вопроса или обрезанный текст

Сравнение с независимым кодировщиком (UTF-8)
Норма

Строки Base64 совпадают посимвольно

Тревожный признак

Различия в начале строки — вероятен BOM или другая кодировка

Ответ внешнего API
Норма

Сервис принимает данные и возвращает ожидаемый результат

Тревожный признак

Ошибка формата или неверные данные после декодирования на стороне сервиса

Типичные ошибки и ограничения

Первая ошибка — попытка передать строку напрямую в Base64Строка(). Функция ожидает двоичные данные, и неявное преобразование приведёт либо к ошибке, либо к непредсказуемому результату.

Вторая ошибка — смешение кодировок в цепочке: строка записана в UTF-8, а прочитана при декодировании в windows-1251. Кириллица при этом безвозвратно искажается. Правило простое: кодировка записи и чтения должна совпадать, а для обмена с внешними системами почти всегда выбирают UTF-8.

Третья группа проблем связана с ожиданиями принимающей стороны: некоторые сервисы требуют вариант Base64URL (где «+» и «/» заменены на «-» и «_»), другие — строгое отсутствие символов-заполнителей «=». Уточните требования в документации API и при необходимости выполните замену символов после кодирования.

Типичные ошибки
01
Кодирование строки в windows-1251 вместо UTF-8 — внешний сервис получает нечитаемый текст
02
Попытка передать строку напрямую в Base64Строка() без преобразования в двоичные данные — ошибка типа или неверный результат
03
Использование Base64 для «защиты» паролей — это кодирование, а не шифрование, строка декодируется без ключа
04
Игнорирование требования Base64URL у внешнего API — символы «+» и «/» ломают передачу в URL
05
Потеря временного файла при кодировании через файл — мусор в каталоге временных файлов и ошибки прав доступа

Готовая пара функций для общего модуля

Для повседневного использования удобно оформить кодирование и декодирование как пару функций в серверном общем модуле с явным параметром кодировки и значением UTF-8 по умолчанию — как показано в первом разделе. Такой модуль затем вызывается из любого места конфигурации: обменов, HTTP-запросов, формирования заголовков авторизации.

Пример применения для заголовка Basic Auth:

ЛогинИПароль = "user:password";

ЗаголовокАвторизации = "Basic " + СтрокаВBase64(ЛогинИПароль);

При массовой обработке избегайте варианта с временными файлами: создание и удаление тысяч файлов заметно замедляет выполнение и нагружает дисковую подсистему сервера. Поток в памяти выполняет ту же задачу без файловых операций.

Порядок действий
  1. 1
    Определите кодировку, которую ожидает принимающая сторона (по умолчанию — UTF-8)
  2. 2
    Добавьте в общий модуль функции СтрокаВBase64 и Base64ВСтроку на основе потока в памяти
  3. 3
    Закодируйте тестовую строку с кириллицей и сразу декодируйте её обратно
  4. 4
    Сверьте результат кодирования с независимым кодировщиком Base64 в UTF-8
  5. 5
    Проверьте требования внешнего API: Base64URL, заполнители «=», ограничение на размер

Часто задаваемые вопросы

Есть ли в 1С встроенная функция для кодирования строки в Base64 напрямую?

Нет. Функция Base64Строка() принимает только двоичные данные, поэтому строку сначала преобразуют в байты через поток в памяти или временный файл с указанием кодировки. Готовая пара функций из статьи закрывает эту задачу.

Почему после декодирования на стороне сервиса появляются иероглифы?

Почти всегда причина в несовпадении кодировки: строка была записана в байты в windows-1251, а принимающая сторона читает UTF-8. Записывайте строку в UTF-8 и проверяйте результат полным циклом «кодирование → декодирование» на кириллическом тексте.

Можно ли закодировать в Base64 на тонком клиенте?

Да, в управляемом приложении потоки в памяти и Base64Строка() доступны на клиенте. Ограничение касается только прямого чтения файлов с диска — для этого понадобится расширение работы с файлами или помещение файла через специальные методы.

Чем Base64URL отличается от обычного Base64?

В Base64URL символы «+» и «/» заменены на «-» и «_», а заполнители «=» в конце часто опускаются — так строку можно безопасно передавать в URL. Если API требует Base64URL, выполните замену символов после стандартного кодирования.

Насколько увеличивается размер данных при кодировании?

Объём вырастает примерно на треть: каждые 3 байта исходных данных превращаются в 4 символа Base64. Учитывайте это при передаче больших файлов и проверяйте лимиты размера запроса у принимающего сервиса.

Подходит ли Base64 для хранения паролей в базе?

Нет. Base64 — обратимое кодирование без ключа, строка восстанавливается мгновенно. Для паролей используйте хеширование, а для конфиденциальных данных — шифрование; Base64 применяйте только как формат передачи байтов в текстовом виде.

Итог

Что важно запомнить

Строка кодируется в Base64 через двоичные данные: поток в памяти или временный файл, затем Base64Строка(). Всегда используйте UTF-8, проверяйте результат полным циклом кодирования-декодирования и помните: Base64 — это формат передачи, а не защита данных.