Проблема работы с кодировками и декодированием данных (особенно Base64) в 1С:Предприятии 7.7 всегда стояла острее, чем в современных версиях 8.x. В «восьмерке» разработчик имеет встроенное перечисление КодировкаТекста, тогда как в «семерке» приходится полагаться на системные вызовы или внешние объекты COM/OLE. В этой статье мы подробно разберем, как реализовать декодирование и смену кодировок, используя системные компоненты Windows.
Для начала проанализируем ситуацию с кодировками. В 1С 7.7 по умолчанию используется системная кодировка ANSI (windows-1251). Если вам необходимо передавать тип кодировки в параметры процедуры или функции, как это делают в 1С 8.3, готовых констант нет. Обычно программисты используют числовые соответствия:
Однако, когда речь заходит о более сложных форматах, таких как Base64 или UTF-8, стандартных средств встроенного языка 1С 7.7 становится недостаточно. Разберем основные способы решения этой задачи.
Рассмотрим вариант реализации функции декодирования с использованием библиотеки 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, что заставляет систему выполнить обратное преобразование автоматически.
Если метод с CDO кажется избыточным или работает нестабильно, существует более «легкий» и надежный способ декодирования Base64 через объект MSXML2.DOMDocument. Этот объект эффективно работает с бинарными данными и типами данных XML.
Разберем этот алгоритм по шагам:
MSXML2.DOMDocument.bin.base64.text.nodeTypedValue.Пример реализации на встроенном языке 1С 7.7:
Функция ИзBase64(ТекстBase64)
Док = СоздатьОбъект("MSXML2.DOMDocument");
Узел = Док.createElement("base64");
Узел.dataType = "bin.base64";
Узел.text = ТекстBase64;
// nodeTypedValue возвращает массив байтов
Возврат Узел.nodeTypedValue;
КонецФункции
Этот метод возвращает двоичные данные. Чтобы превратить их в читаемую строку в кодировке Windows-1251, может потребоваться дополнительное преобразование через 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:
V7TextFile, который поддерживает разные кодировки, и методы для работы с XML/Base64.Подводя итог, можно сказать, что хотя в 1С 7.7 нет встроенного удобного перечисления кодировок, использование COM-объектов (CDO, MSXML, ADODB) позволяет решать любые задачи по декодированию и конвертации текста. Выбор конкретного метода зависит от ваших задач: для простых строк Base64 лучше использовать MSXML2.DOMDocument, а для сложной работы с кодировками файлов — ADODB.Stream.