() M_W_W, вы абсолютно правы! ИИ действительно нафантазировал встроенный метод и не учёл, что семёрка не умеет переваривать COM SafeArray (тип VT_ARRAY) напрямую во встроенном языке без костылей вроде MSScriptControl.ScriptControl. Снимаю шляпу перед вашим опытом разработки под 7.7!
Чтобы не оставлять в ветке нерабочий код, зафиксируем правильные варианты решения этой проблемы для тех, кто столкнётся с ней в будущем.
Вариант 1. Использование проверенной ВК от Ромикса (romix.dll)
Как вы верно заметили, это самое стабильное решение для 7.7. У компоненты AddIn.BinaryData от Ромикса нет проблем с утечкой памяти на больших файлах.
Код работы с ней выглядит так:
Если ЗагрузитьВнешнююКомпоненту("romix.dll") = 0 Тогда
Предупреждение("Не удалось загрузить romix.dll!");
КонецЕсли;
БД = СоздатьОбъект("AddIn.BinaryData");
// Кодирование файла в Base64
БД.ЗагрузитьИзФайла(ИмяФайлаИсточника);
СтрокаBase64 = БД.КодироватьBase64(); Показать
Вариант 2. Работа с MSXML через Windows Script Host (без внешних DLL)
Если нужно обойтись без регистрации внешних DLL, обойти ограничение 1С 7.7 на работу с бинарными COM-типами можно с помощью запуска VBScript/JScript прямо в памяти 1С:
// Функция кодирования Base64 через встроенный скрипт
Функция КодироватьВBase64_WSH(ИмяФайла)
Попытка
Sc = СоздатьОбъект("MSScriptControl.ScriptControl");
Sc.Language = "JScript";
// Передаем код преобразования на JavaScript (JScript)
Sc.AddCode("
|function FileToBase64(filePath) {
| var stream = new ActiveXObject('ADODB.Stream');
| stream.Type = 1; // Binary
| stream.Open();
| stream.LoadFromFile(filePath);
| var binaryData = stream.Read();
| stream.Close();
|
| var xmlDoc = new ActiveXObject('MSXML2.DOMDocument.6.0');
| var xmlNode = xmlDoc.createElement('bin');
| xmlNode.dataType = 'bin.base64';
| xmlNode.nodeTypedValue = binaryData;
| return xmlNode.text.replace(/[\r\n]/g, ''); // убираем переносы строк
|}
|");
Результат = Sc.Run("FileToBase64", ИмяФайла);
Возврат Результат;
Исключение
Сообщить("Ошибка преобразования: " + ОписаниеОшибки(), "!");
Возврат "";
КонецПопытки; Показать
КонецФункции
В таком виде JScript сам внутри себя считывает поток ADODB, передает его в MSXML и возвращает в 1С уже готовую обычную строку Base64, что полностью решает проблему с типами данных и утечками памяти.
Еще раз спасибо за внимательность и за то, что поделились рабочим решением с компонентой Ромикса!