Начал делать обмен 1С с ClickHouse.
По информации в интернете сделал обработку, в которую накидал методы получения и отправки данных(поэтому все так безобразно выглядит).
Команда2НаСервере - это получение данных.
ОтправитьДанныеНаСервере - это отправка сжатого GZIP-ом запроса.
Работа с GZIP была скопирована с другого тоже популярного источника 1С.
Может вариант не идеальный, но рабочий.
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
&НаСервере
Процедура Команда1НаСервере()
gzip = ПолучитьМодульGZIP();
стр64 = СтрокаВGZIP(gzip, "Hy");
сообщить(стр64);
Стр = GZIPВСтроку(gzip, стр64);
сообщить(Стр);
КонецПроцедуры
Функция ПолучитьМодульGZIP()
МодульGZIP = Новый Структура;
МодульGZIP.Вставить("NetObject", новый COMОбъект("NetObjectToIDispatch45"));
МодульGZIP.Вставить("MemoryStream", МодульGZIP.NetObject.ПолучитьТип("System.IO.MemoryStream"));
МодульGZIP.Вставить("UTF8", МодульGZIP.NetObject.ПолучитьТип("System.Text.Encoding").UTF8);
МодульGZIP.Вставить("CompressionMode", МодульGZIP.NetObject.ПолучитьТип("System.IO.Compression.CompressionMode"));
МодульGZIP.Вставить("Convert", МодульGZIP.NetObject.ПолучитьТип("System.Convert"));
Возврат МодульGZIP;
КонецФункции
Функция СтрокаВGZIP(gzip, стр)
СжатыйПоток = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream); //Поток куда запишутся сжатые данные
zipStr = gzip.NetObject.СоздатьОбъект("System.IO.Compression.GZipStream", СжатыйПоток, gzip.CompressionMode.Compress);
МассивДанных= gzip.UTF8.GetBytes(стр);// Получим массив данных используя кодировку UTF8
ПотокДляСжатия = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream,МассивДанных); // Создадим поток из массива данных
ПотокДляСжатия.CopyTo(zipStr);
zipStr.Flush(); // Сбросим данные в СжатыйПоток
zipStr.Close(); // Закроем GZipStream
compressed = СжатыйПоток.ToArray(); // Получим массив байт сжатых данных
Возврат gzip.Convert.ToBase64String(compressed); // Переведем сжатые данные в Base64
КонецФункции
Функция GZIPВСтроку(gzip, стр64)
compressed=gzip.Convert.FromBase64String(стр64);
ПотокСжатыхДанных = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream,compressed);
GZipПоток =gzip.NetObject.СоздатьОбъект("System.IO.Compression.GZipStream",ПотокСжатыхДанных, gzip.CompressionMode.Decompress);
ПотокРазжатыхДанных = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream);
GZipПоток.CopyTo(ПотокРазжатыхДанных);
Данные=ПотокРазжатыхДанных.ToArray();
Возврат gzip.UTF8.GetString(Данные);
КонецФункции // ()
&НаКлиенте
Процедура Команда2(Команда)
Команда2НаСервере();
КонецПроцедуры
&НаСервере
Процедура Команда2НаСервере()
АдресСервера = "10.0.10.140";
Порт = 8123;
ТекстЗапроса = "SEL ECT * FROM my_first_table ORDER BY timestamp";
РесурсНаСервере = "";
Попытка
Соединение = Новый HTTPСоединение(АдресСервера,Порт);
Исключение
Сообщить("Не удалось установить соединение с сервером онлайн-проверки:"
+ Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// посылаем запрос
Попытка
HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере);
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Ответ = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
сообщить(Ответ);
Соединение = Неопределено;
Если Результат.КодСостояния > 299 Тогда
Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьДанные(Команда)
ОтправитьДанныеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОтправитьДанныеНаСервере()
АдресСервера = "10.0.10.140";
Порт = 8123;
gzip = ПолучитьМодульGZIP();
ТекстЗапроса = "INS ERT IN TO my_first_table (user_id, message, timestamp, metric) VALUES (150, 'Здорова Petr fr om gzip',now(),6.6)";
ТекстЗапросаGZIP = СтрокаВGZIP(gzip, ТекстЗапроса);
ДД = Base64Значение(ТекстЗапросаGZIP);
РесурсНаСервере = "";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Encoding", "gzip");
Попытка
Соединение = Новый HTTPСоединение(АдресСервера,Порт);
Исключение
Сообщить("Не удалось установить соединение с сервером онлайн-проверки:"
+ Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// посылаем запрос
Попытка
HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере, Заголовки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДД);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Ответ = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
сообщить(Ответ);
Соединение = Неопределено;
Если Результат.КодСостояния > 299 Тогда
Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Показать