Как в 1С 7.7 декодировать Base64 и работать с кодировками текста

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

Проблема работы с кодировками и декодированием данных (особенно Base64) в 1С:Предприятии 7.7 всегда стояла острее, чем в современных версиях 8.x. В «восьмерке» разработчик имеет встроенное перечисление КодировкаТекста, тогда как в «семерке» приходится полагаться на системные вызовы или внешние объекты COM/OLE. В этой статье мы подробно разберем, как реализовать декодирование и смену кодировок, используя системные компоненты Windows.

Особенности кодировок в 1С 7.7

Для начала проанализируем ситуацию с кодировками. В 1С 7.7 по умолчанию используется системная кодировка ANSI (windows-1251). Если вам необходимо передавать тип кодировки в параметры процедуры или функции, как это делают в 1С 8.3, готовых констант нет. Обычно программисты используют числовые соответствия:

Однако, когда речь заходит о более сложных форматах, таких как Base64 или UTF-8, стандартных средств встроенного языка 1С 7.7 становится недостаточно. Разберем основные способы решения этой задачи.

Метод 1: Декодирование через объект CDO.Message

Рассмотрим вариант реализации функции декодирования с использованием библиотеки CDO (Collaboration Data Objects). Этот метод часто применяется для работы с почтовыми вложениями, но его можно адаптировать и для обычных строк.

Проанализируем программный код функции:


Функция Декодировать(Стр, Кодировка)
    ЦДО = СоздатьОбъект("CDO.Message");
    БодиПарт = ЦДО.BodyPart;
    // Указываем тип кодирования передачи, например "base64"
    БодиПарт.ContentTransferEncoding = Кодировка;
    
    Стрим = БодиПарт.GetEncodedContentStream();
    Поля = БодиПарт.Fields;
    Поле = Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value = "text/plain; charset=""windows-1251""";
    Поля.Update();
    
    Стрим.WriteText(Стр);
    Стрим.Flush();
    
    // Получаем декодированный поток
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.Charset = "windows-1251";
    Возврат Стрим.ReadText();
КонецФункции

Важное замечание: В параметре Кодировка для декодирования Base64 необходимо передавать строковое значение "base64". Объект CDO.Message работает с данными как с MIME-сообщением. Мы записываем закодированный текст в EncodedContentStream, а затем считываем его через GetDecodedContentStream, что заставляет систему выполнить обратное преобразование автоматически.

Метод 2: Декодирование через Microsoft XML DOM

Если метод с CDO кажется избыточным или работает нестабильно, существует более «легкий» и надежный способ декодирования Base64 через объект MSXML2.DOMDocument. Этот объект эффективно работает с бинарными данными и типами данных XML.

Разберем этот алгоритм по шагам:

  1. Создаем объект MSXML2.DOMDocument.
  2. Создаем элемент, который будет служить контейнером.
  3. Устанавливаем тип данных элемента как bin.base64.
  4. Помещаем закодированную строку в свойство text.
  5. Извлекаем результат из свойства nodeTypedValue.

Пример реализации на встроенном языке 1С 7.7:


Функция ИзBase64(ТекстBase64)
    Док = СоздатьОбъект("MSXML2.DOMDocument");
    Узел = Док.createElement("base64");
    Узел.dataType = "bin.base64";
    Узел.text = ТекстBase64;
    // nodeTypedValue возвращает массив байтов
    Возврат Узел.nodeTypedValue; 
КонецФункции

Этот метод возвращает двоичные данные. Чтобы превратить их в читаемую строку в кодировке Windows-1251, может потребоваться дополнительное преобразование через ADODB.Stream.

Метод 3: Использование ADODB.Stream для управления кодировками

Выясним причину, почему обычное чтение файлов в 1С 7.7 часто приводит к появлению «кракозябр». Встроенный объект Текст не умеет работать с UTF-8. Для полноценной конвертации между UTF-8, ANSI и другими кодировками идеально подходит объект ADODB.Stream.

Рассмотрим пример преобразования текста:


// Пример перекодировки из UTF-8 в Windows-1251
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type = 2; // adTypeText
Стрим.Charset = "utf-8";
Стрим.Open();
Стрим.WriteText(ЗакодированнаяСтрока);

Стрим.Position = 0;
Стрим.Charset = "windows-1251";
Результат = Стрим.ReadText();
Стрим.Close();

Здесь мы используем свойство Charset для указания исходной и целевой кодировок. Это универсальный способ для 1С 7.7 работать с любыми современными текстовыми форматами без использования внешних DLL.

Использование внешних компонент

Если стандартных OLE-объектов Windows недостаточно или требуется высокая скорость обработки больших объемов данных, стоит обратить внимание на проверенные временем внешние компоненты для 1С 7.7:

Подводя итог, можно сказать, что хотя в 1С 7.7 нет встроенного удобного перечисления кодировок, использование COM-объектов (CDO, MSXML, ADODB) позволяет решать любые задачи по декодированию и конвертации текста. Выбор конкретного метода зависит от ваших задач: для простых строк Base64 лучше использовать MSXML2.DOMDocument, а для сложной работы с кодировками файлов — ADODB.Stream.

← На главную