Уменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск

03.09.18

Интеграция - WEB-интеграция

Обработка демонстрирует отправку тела HTTP запроса со сжатием gzip (метод deflate) средствами платформы 1С. Демонстрация происходит на примере отправки текста или файла на Яндекс.Диск.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отправка HTTP запроса с телом сжатым GZIP
.epf 9,01Kb
101
101 Скачать (1 SM) Купить за 1 850 руб.

В одной из задач мне требовалось один раз в 10 минут отправлять из 1С на API сайта текстовую (json) информацию в теле POST запроса. При этом объем информации был достаточно значительным, и я решил его сжать распространенным в HTTP форматом gzip. В результате размер передаваемой информации сократился в 10 раз. В предоставленной здесь обработке gzip для примера используется с целью уменьшения трафика при отправке файла из 1С на Яндекс-диск методом PUT. Аналогично можно поступить при работе с Google-диском. Делал на платформе 8.3.9.2233, работоспособность также проверена на 8.3.11.3034.

Для достижения цели проделал следующее:

1. Сжал текстовый файл в архив zip встроенными в 1С средствами.
2. Извлек из zip-архива чистый deflate, без служебной информации.
3. К чистому deflate добавил служебную информацию архива gzip.

Когда gzip готов - его можно вставлять в тело http-запроса, как двоичные данные. Из логов отправки на скринах ниже видно, что без сжатия размер тела составлял 212013 байт, со сжатием - 23988 байт. На текстовых данных, в т.ч. json и xml, выигрыш довольно значительный.

 

Описание формата zip, структуру служебных заголовков взял здесь: https://www.iana.org/assignments/media-types/application/zip
Заголовки, которые нужно вставить в gzip, здесь: http://www.zlib.org/rfc-gzip.html

Токен Яндекса, встроенный в обработку, истекает 01.09.2019. После этого дня для демонстрации выгрузки на Я.диск используйте свой токен. А так же соответственно свой адрес на Я-диске для просмотра результата выгрузки файла на диск.

gzip http запрос сжатие

См. также

WEB-интеграция Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Функциональное решение для торговли на всех популярных маркетплейсах. Работает со схемами FBO и FBS. Простое в использовании и установке, не вносит изменения в код программы. Существенно упрощает работу с товарным ассортиментом, обработку заказов с площадок, работу с поставками, а также ведение аналитики по продажам и остаткам.

72000 руб.

19.07.2024    1352    52    0    

3

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    17742    49    50    

29

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14138    40    8    

16

Обмен с ГосИС Мастера заполнения WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

3900 руб.

08.11.2017    62947    403    295    

72

ККМ WEB-интеграция Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Универсальный драйвер для фискализации чеков для сервиса Бизнес.РУ. Чеки (https://online-check.business.ru/). Работает с любой кассой, подключенной к сервису, в том числе и без физической кассы (Аренда облачной ККТ в датацентре). Принцип работы аналогичен наличию физической кассы, подключенной к рабочему месту 1С. Фискализация выполняется с любого рабочего места через интернет. Нет ограничений на количество рабочих мест, касс, компьютеров. Поддерживает печать с нескольких рабочих мест на одну кассу. Работает в любой операционной системе (Windows, Linux) и в любом клиенте (Тонкий, Толстый, Web, Мобильный клиент).

6000 руб.

03.06.2021    13828    12    0    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. link.gabauer 5 11.02.21 11:14 Сейчас в теме
Спасибо за решение. То что нужно! Респект
2. Oksana_An 30.04.21 14:58 Сейчас в теме
Добрый день! Выполняю POST запрос в Fiddlere, запрос выполнился без ошибок только когда установила Transformer - GZIP.
Подскажите, пожалуйста, как можно в 1C передать через HTTP тело запроса с использованием GZIP?
4. uno-c 238 02.05.21 16:34 Сейчас в теме
(2) Передать можно так, как написано в статье:
1. Сжал текстовый файл в архив zip встроенными в 1С средствами.
2. Извлек из zip-архива чистый deflate, без служебной информации.
3. К чистому deflate добавил служебную информацию архива gzip.
Когда gzip готов - его можно вставлять в тело http-запроса, как двоичные данные.
3. Oksana_An 30.04.21 15:00 Сейчас в теме
Тело запроса содержит текстовый файл.
5. Gendelf 07.06.22 10:27 Сейчас в теме
Я правильно понимаю, что без текстового файла не обойтись?
6. uno-c 238 07.06.22 12:35 Сейчас в теме
(5) В статье в Яндекс-Диск я передавал октет-стрим. application/octet-stream: двоичный файл без указания формата (RFC 2046). Текст выбран, чтобы показать существенный выигрыш, который я получил. Когда json передавал (json передавал не в Яндекс), json это тоже текст. А так сжимать и передавать можно любые двоичные данные, но выигрыш в размерах будет разный, в зависимости от содержания двоичных данных.
7. Gendelf 08.06.22 09:00 Сейчас в теме
(6) Не совсем понял. Опишу подробнее, необходимо отправить ответ сервису в gzip (без него ответ json около 1ггб).
Какой порядок действий, что нужно сделать, чтобы сжать строку json.

Нашёл в интернете: Ответ.Заголовки.Вставить("Content-Encoding", "gzip"); - не помогло.
8. uno-c 238 08.06.22 12:17 Сейчас в теме
(7) json - это обычный текст. Т.е нужно сделать примерно то же, что делала обработка из этой публикации, когда на Яндекс сжатые данные передавала. Только заголовок вставить - недостаточно. Нужно, чтобы и тело запроса было не текстом, а гзипом, обработка из этой публикации этим и занималась - из текстового файла делала gzip.
9. SerVer1C 794 05.06.23 09:06 Сейчас в теме
Описание формата zip, структуру служебных заголовков взял здесь:

Может здесь: https://infostart.ru/public/618906/
?
10. uno-c 238 05.06.23 14:09 Сейчас в теме
(9) Предпочитаю первоисточники - спецификации RFC и т.п. А Ваша обработка gzip и не сделает, судя по описанию. Мне нужен был именно gzip, сервер не принимал чистый deflate, несмотря на соответствующий Content-encoding в POST-запросе. Пришлось обе спецификации листать, и https://www.iana.org/assignments/media-types/application/zip и http://www.zlib.org/rfc-gzip.html
11. prohorp 33 16.08.23 10:35 Сейчас в теме
Начал делать обмен 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 Тогда
			Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
		КонецЕсли;
	Исключение
		Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
	КонецПопытки;	

КонецПроцедуры
Показать
12. uno-c 238 16.08.23 11:24 Сейчас в теме
(11) Если рабочий - то точно не всегда, COM на линуксе не работает.
Оставьте свое сообщение