Обработка написана на обычных формах, тестировалась на платформе 8.12.1685.
Возникла передо мной задача обработкой в 1С получить XML, сгенерированный запросом с иcпользованием FOR XML RAW и FOR XML AUTO.
Есть запрос, который генерирует XML файл на SQL сервере. Его нужно было записать в файл, затем обработать.
В статье для примера я сделал запрос, который не связан с данными из базы "SELECT ‘1234567890’ as num1, ‘abcdefghijklmmopqrstuvwxyz’ as str1, ‘абвгдеёжзиклмнопрстуфхцчшщьъэюя’ as str2 for xml raw"
Сначала я использовал стандартную схему с использованием ADODB.Recordset. Дело в том, что XML так получать можно, читая Recordset, и записывая его в текстовый файл, но почему-то начальные буквы слов на кириллице изменялись не различные символы. Я думал, что это проблемы с кодировкой. Перепробовал много вариантов, но решить проблему не удалось. Желающие могут попробовать.
Основной цикл получения данных через Recordset выглядит как обычно:
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 2; //StreamTypeEnum.adTypeBinary = 1 StreamTypeEnum.adTypeText = 2
Поток.charset="UTF-8";
Поток.Open();
Пока не rs.eof() Цикл
rsval = rs.Fields(0).Value;
Поток.Write(rsval);
КонецЦикла;
Поток.SaveToFile(ПолноеИмяФайла, 2); // Записать поток в файл
При получении XML таким способом на выходе в файле получаю строку "1234567890ד abcdefghijklmmopqrstuvwxyzד אבגדהו¸זחטךכלםמןנסעףפץצקרש?422;ת?423;?424;?425;C", что явно не соответствует исходному тексту.
Гуглил, читал MSDN, смотрел примеры на C#, VB и прочее и прочее, но так и не удавалось решить проблему. Я даже точно не могу привести источники, которые привели меня к решению проблемы. Но вот эта ветка форума была одной из последних: https://www.sql.ru/forum/717172/adodb-command-object-or-provider-is-not-capable-of-performing-requested-operation-800a0cb3
В результате предлагаю вашему вниманию функцию, которая читает XML с SQL сервера и пишет его в файл:
Функция ПолучитьДанные(cn) Экспорт
QueryText = "SELECT '1234567890' as num1, 'abcdefghijklmmopqrstuvwxyz' as str1, 'абвгдеёжзиклмнопрстуфхцчшщьъэюя' as str2 for xml raw";
myCommand = Новый COMОбъект("ADODB.Command");
objADOStream = Новый COMОбъект("ADODB.Stream");
adTypeText = 2;
objADOStream.Type = adTypeText;
objADOStream.Charset = "UTF-8";
objADOStream.Open();
myCommand.ActiveConnection = cn;
myCommand.Properties("Output stream").Value = objADOStream; // Output stream связываем с ADODB потоком
adExecuteStream = 1024;
myCommand.CommandText = QueryText;
myCommand.CommandType = 1; //adCmdText
myCommand.Execute(QueryText, 0, adExecuteStream); // Передать поток adExecuteStream - Это важно!
objADOStream.SaveToFile(ПутьКФайлу, 2);
objADOStream.Close();
Сообщить("Файл записан:" +ПутьКФайлу);
КонецФункции
На вход в переменной "cn" передается установленное соединение (ADODB.Connection).
Прошу обратить особое внимание, что поток (objADOStream) два раза передается в команду.
Внимание! Для тех, кто скачает обработку, параметры подключение к SQL серверу описаны в функции GetSQLServerConnection() в модуле обработки.