Разработка и Конфигурация · 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) и сравните с выводом вашей функции. Совпадение подтверждает корректность кодировки и отсутствие лишних байтов.
Как проверить результат
Полученная строка полностью совпадает с исходной
Появляются иероглифы, знаки вопроса или обрезанный текст
Строки Base64 совпадают посимвольно
Различия в начале строки — вероятен BOM или другая кодировка
Сервис принимает данные и возвращает ожидаемый результат
Ошибка формата или неверные данные после декодирования на стороне сервиса
Типичные ошибки и ограничения
Первая ошибка — попытка передать строку напрямую в Base64Строка(). Функция ожидает двоичные данные, и неявное преобразование приведёт либо к ошибке, либо к непредсказуемому результату.
Вторая ошибка — смешение кодировок в цепочке: строка записана в UTF-8, а прочитана при декодировании в windows-1251. Кириллица при этом безвозвратно искажается. Правило простое: кодировка записи и чтения должна совпадать, а для обмена с внешними системами почти всегда выбирают UTF-8.
Третья группа проблем связана с ожиданиями принимающей стороны: некоторые сервисы требуют вариант Base64URL (где «+» и «/» заменены на «-» и «_»), другие — строгое отсутствие символов-заполнителей «=». Уточните требования в документации API и при необходимости выполните замену символов после кодирования.
Готовая пара функций для общего модуля
Для повседневного использования удобно оформить кодирование и декодирование как пару функций в серверном общем модуле с явным параметром кодировки и значением UTF-8 по умолчанию — как показано в первом разделе. Такой модуль затем вызывается из любого места конфигурации: обменов, HTTP-запросов, формирования заголовков авторизации.
Пример применения для заголовка Basic Auth:
ЛогинИПароль = "user:password";
ЗаголовокАвторизации = "Basic " + СтрокаВBase64(ЛогинИПароль);
При массовой обработке избегайте варианта с временными файлами: создание и удаление тысяч файлов заметно замедляет выполнение и нагружает дисковую подсистему сервера. Поток в памяти выполняет ту же задачу без файловых операций.
- 1Определите кодировку, которую ожидает принимающая сторона (по умолчанию — UTF-8)
- 2Добавьте в общий модуль функции СтрокаВBase64 и Base64ВСтроку на основе потока в памяти
- 3Закодируйте тестовую строку с кириллицей и сразу декодируйте её обратно
- 4Сверьте результат кодирования с независимым кодировщиком Base64 в UTF-8
- 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 — это формат передачи, а не защита данных.