Совсем простой обмен HTTP, 2 функции

Публикация № 1106873

Разработка - Системная интеграция - Интеграция с WEB

http рест обмен get post

Функция для вызова рест-сервиса и функция для разбора результата. Быстро, просто, универсально.

Сам пользуюсь этими функциями, в ряде случаев чуть дорабатывая "по месту", но в основном их возможностей хватает. Позволяют быстро начать работу с большинством http-сервисов.


// Вспомогательная
Процедура СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять=Ложь) Экспорт
	Если Прав(инфо,3)="!!!" Тогда
		рСтатус=СтатусСообщения.ОченьВажное;
	ИначеЕсли Прав(инфо,2)="!!" Тогда
		рСтатус=СтатусСообщения.Важное;
	ИначеЕсли Прав(инфо,1)="!" Тогда
		рСтатус=СтатусСообщения.Внимание;
	Иначе
		рСтатус=СтатусСообщения.Информация;
	КонецЕсли;
	Если рПояснять Тогда
		Сообщить(инфо,рСтатус);
	КонецЕсли;
	//
	Если ТипЗнч(рПротокол)=Тип("ТекстовыйДокумент") Тогда
		рПротокол.ДобавитьСтроку(инфо);
	КонецЕсли;
КонецПроцедуры

// Выполняет любой запрос к соединению,при необходимости создаёт соединение,заносит в параметры ответ сервиса.
// Возвращает успешность (булево), при ошибке возвращает Ложь.
//
// Параметры:
//    рПараметры - структура:
//
//        Соединение - HTTP-соединение; заносится в этот ключ,если не было передано (создаётся в функции),и используется из этого ключа без изменений,если было передано;
//        если значение ключа Соединение не указано или имеет иной тип,то соединение создаётся согласно значениям указанных ключей:
//            Сервер -строка, обязательный (если пусто или не указано,то возвращает ошибку),если начинается с http://,то приводится к правильному виду автоматически;
//            Порт - число, обязательный (по умолчанию для незащищённых 80,для защищённых 443);
//            Пользователь - строка, необязательный;
//            Пароль - строка, необязательный;
//            Таймаут - число, необязательный (по умолчанию 0);
//            ПроксиПользователь - строка, необязательный (по умолчанию пуста); если не пуста,то это признак использования прокси,в этом случае требуется передача свойств:
//                ПроксиПароль - строка, необязательный;
//                ПроксиСервер - строка,
//                ПроксиПорт - число, необязательный (по умолчанию 0);
//            ЗащищенноеСоединение - булево, необязательный; если используется,то применяется SSL;
//            КраткийФорматВызова - булево, необязательный; если указан,то соединение НЕ защищённое и БЕЗ прокси.
//        Если Соединение не было указано,то по завершении функции в ключ Соединение вносится созданное в ней;
//
//        HTTPЗапрос - запрос с уже установленными свойствами; необязательный,если не указан,то инициализируется в функции согласно значениям указанных ключей:
//            АдресРесурса или АдресСкрипта (равнозначны оба ключа) - строка,необязательный; по умолчанию "/";
//            ЗаголовкиЗапроса - соответствие или фикс.соответствие, необязательный;
//            ПараметрыЗапроса - структура,соответствие,фикс.соответствие или список значений (где имя ключа - Представление,а значение ключа - Значение),
//                список значений используется в случае,когда важен порядок следования параметров, вносит в ком.строку строго по порядку вхождения данных в список;
//            ТелоЗапроса - строка или двоичные данные,необязательный;
//                уточнения для тела запроса,являющегося строкой: КодировкаТелаЗапроса (по умолчанию UTF-8),ИспользованиеByteOrderMark (по умолчанию НеИспользовать);
//            ИмяФайлаТелаЗапроса - строка; необязательный;
//                указание тела запроса более приоритетно, чем указание имени файла тела запроса;
//        Если HTTPЗапрос был указан, то по завершении функции из рПараметры значение с ключом HTTPЗапрос удаляется,во избежание кэширования;
//
//        МетодHTTP - строка,необязательный (по умолчанию GET), допустимы только значения "GET" и "POST";
//        
//        Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
//        Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
//    По итогам работы функции при её успешном завершении в рПараметры вставляется значение с ключом HTTPОтвет. При ошибке вставляет Неопределено.
//
// Возвращает успешность (булево).
//
Функция HTTPВыполнитьЗапрос(рПараметры) Экспорт
Попытка	
	рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
	рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);
	
	// сразу по умолчанию
	//рОтвет=Новый HTTPСервисОтвет(0,"Запрос не выполнялся"); // в релизах ниже 8.3.7 не отрабатывает
	рОтвет=Неопределено;
	рПараметры.Вставить("HTTPОтвет",рОтвет);
	
	рКраткийФормат=?(рПараметры.Свойство("КраткийФорматВызова"),рПараметры.КраткийФорматВызова,Ложь);
	рЗащищённое=?(рПараметры.Свойство("ЗащищенноеСоединение"),рПараметры.ЗащищенноеСоединение,Ложь);
	
	рПользователь=?(рПараметры.Свойство("Пользователь"),рПараметры.Пользователь,"");
	рПароль=?(рПараметры.Свойство("Пароль"),рПараметры.Пароль,"");			
	
	рСоединение=?(рПараметры.Свойство("Соединение"),рПараметры.Соединение,Неопределено);
	Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // надо его установить
		#Область УстановкаСоединения
		Если не рПараметры.Свойство("Сервер") Тогда Возврат Ложь КонецЕсли;
		рСервер=СокрЛП(рПараметры.Сервер);
		Если ПустаяСтрока(рСервер) Тогда Возврат Ложь КонецЕсли;
		рПорт=?(рПараметры.Свойство("Порт"),рПараметры.Порт,0);
		рТаймаут=?(рПараметры.Свойство("Таймаут"),рПараметры.Таймаут,0);
		рПроксиПользователь=?(рПараметры.Свойство("ПроксиПользователь"),рПараметры.ПроксиПользователь,""); // признак применения прокси именно в этом
		Если рКраткийФормат Тогда рЗащищённое=Ложь; рПроксиПользователь="" КонецЕсли;
		//
		рПрокси=Неопределено;
		Если не ПустаяСтрока(рПроксиПользователь) Тогда
			рПрокси=Новый ИнтернетПрокси;
			рПрокси.Пользователь=рПроксиПользователь;
			рПрокси.Пароль=рПараметры.ПроксиПароль;
			Если рПараметры.ПроксиПорт=0 Тогда
				рПрокси.Установить("HTTP",рПараметры.ПроксиСервер);
			Иначе	
				рПрокси.Установить("HTTP",рПараметры.ПроксиСервер,рПараметры.ПроксиПорт);
			КонецЕсли;	
		КонецЕсли;
		//
		Если СтрНачинаетсяС(НРег(рСервер),"http://") Тогда
			рСервер=Сред(рСервер,8);
		КонецЕсли;		
		Если рПорт=0 Тогда
			рПорт=?(рЗащищённое,443,80);
		КонецЕсли;
		//
		Если рЗащищённое Тогда			
			си=Новый СистемнаяИнформация;
			Если Число(СтрРазделить(си.ВерсияПриложения,".",Ложь).Получить(2))>9 Тогда
				рSSL=Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
			Иначе
				рSSL=Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровWindows);
			КонецЕсли;
		Иначе
			рSSL=Неопределено;
		КонецЕсли;
		//
		Если рКраткийФормат Тогда
			Если рЗащищённое Тогда
				рСоединение=Новый HTTPСоединение(рСервер,,,,,,рSSL);
			Иначе
				рСоединение=Новый HTTPСоединение(рСервер);
			КонецЕсли;			
		Иначе
			Если рПрокси=Неопределено Тогда
				рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,,рТаймаут,рSSL);
			Иначе
				рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,рПрокси,рТаймаут,рSSL);
			КонецЕсли;
		КонецЕсли;
		//
		Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда
			СообщитьИВнестиВПротокол("Не удалось создать объект HTTP-соединения!",рПротокол,рПояснять);
		КонецЕсли;
		//
		// вставим на будущее (это иногда имеет смысл кэшировать)
		рПараметры.Вставить("Соединение",рСоединение);
		#КонецОбласти
	Иначе
		рСервер=рСоединение.Сервер;
		рПорт=рСоединение.Порт;
		рТаймаут=рСоединение.Таймаут;
		рПроксиПользователь=рСоединение.Прокси.Пользователь;
	КонецЕсли;
	// а эти всегда берём по итогам установленного соединения
	рПроксиСервер=рСоединение.Прокси.Сервер();
	рПроксиПорт=рСоединение.Прокси.Порт();
	//
	// выводим настройки соединения
	инфо="Соединение:
	|Сервер: "+СокрЛП(рСервер)+",порт: "+Строка(рПорт)+",пользователь: "+СокрЛП(рПользователь)+",таймаут: "+рТаймаут+"
	|краткий формат: "+Строка(рКраткийФормат)+",защищённое: "+Строка(рЗащищённое)+Символы.ПС;
	Если не ПустаяСтрока(рПроксиПользователь) Тогда
		инфо=инфо+"прокси: сервер "+СокрЛП(рПроксиСервер)+",порт "+Строка(рПроксиПорт)+",пользователь "+СокрЛП(рПроксиПользователь);
	Иначе
		инфо=инфо+"прокси не используется";
	КонецЕсли;
	СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);
	//
	Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // уже без сообщения,именно выход по ошибке
		Возврат Ложь;
	КонецЕсли;	
	
	рЗапрос=?(рПараметры.Свойство("HTTPЗапрос"),рПараметры.HTTPЗапрос,Неопределено);
	Если ТипЗнч(рЗапрос)<>Тип("HTTPЗапрос") Тогда
		#Область УстановкаЗапроса
		Если рПараметры.Свойство("АдресРесурса") и не ПустаяСтрока(рПараметры.АдресРесурса) Тогда
			рАдресРесурса=рПараметры.АдресРесурса;
		ИначеЕсли рПараметры.Свойство("АдресСкрипта") и не ПустаяСтрока(рПараметры.АдресСкрипта) Тогда
			рАдресРесурса=рПараметры.АдресСкрипта;
		Иначе
			рАдресРесурса="/";
			СообщитьИВнестиВПротокол("Используется пустой адрес ресурса для запроса.",рПротокол,рПояснять);
		КонецЕсли;
		//
		рЗаголовки=Новый Соответствие;
		Если рПараметры.Свойство("ЗаголовкиЗапроса") Тогда
			Если ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("Соответствие") или ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("ФиксированноеСоответствие") Тогда
				рЗаголовки=рПараметры.ЗаголовкиЗапроса;
			КонецЕсли;
		КонецЕсли;
		//
		Если рПараметры.Свойство("ПараметрыЗапроса") Тогда
			Если ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Структура")
			или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Соответствие") 
			или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("ФиксированноеСоответствие") 
			Тогда
				Если рАдресРесурса<>"/" Тогда
					разд="?";
					Для каждого киз Из рПараметры.ПараметрыЗапроса Цикл
						рАдресРесурса=рАдресРесурса+разд+СокрЛП(киз.Ключ)+"="+СокрЛП(Строка(киз.Значение)); разд="&";
					КонецЦикла;
				КонецЕсли;
			ИначеЕсли ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("СписокЗначений") Тогда
				// случай,когда был очень важен порядок параметров,и их разместили осознанно именно так; не сортировать!
				Если рАдресРесурса<>"/" Тогда
					разд="?";
					Для каждого знч Из рПараметры.ПараметрыЗапроса Цикл
						рАдресРесурса=рАдресРесурса+разд+СокрЛП(знч.Представление)+"="+СокрЛП(Строка(знч.Значение)); разд="&";
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		//
		рЗапрос=Новый HTTPЗапрос(рАдресРесурса,рЗаголовки);
		//
		Если рПараметры.Свойство("ТелоЗапроса") Тогда
			Если ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
				рКодировка=?(рПараметры.Свойство("КодировкаТелаЗапроса"),рПараметры.КодировкаТелаЗапроса,Неопределено);
				Если не ЗначениеЗаполнено(рКодировка) Тогда рКодировка=КодировкаТекста.UTF8 КонецЕсли;
				рИспользоватьБОМ=?(рПараметры.Свойство("ИспользованиеByteOrderMark"),рПараметры.ИспользованиеByteOrderMark,Неопределено);
				Если не ЗначениеЗаполнено(рИспользоватьБОМ) Тогда рИспользоватьБОМ=ИспользованиеByteOrderMark.НеИспользовать КонецЕсли;
				рЗапрос.УстановитьТелоИзСтроки(рПараметры.ТелоЗапроса,рКодировка,рИспользоватьБОМ);
			ИначеЕсли ТипЗнч(рПараметры.ТелоЗапроса)=Тип("ДвоичныеДанные") Тогда
				рЗапрос.УстановитьТелоИзДвоичныхДанных(рПараметры.ТелоЗапроса);
			КонецЕсли;
		ИначеЕсли рПараметры.Свойство("ИмяФайлаТелаЗапроса") Тогда
			// наличие файла не проверяем,считаем,что он есть априорно
			рЗапрос.УстановитьИмяФайлаТела(рПараметры.ИмяФайлаТелаЗапроса);
		КонецЕсли;
		#КонецОбласти
	КонецЕсли;
	Если рПараметры.Свойство("HTTPЗапрос") Тогда
		// удаляем из параметров,чтобы не повторялось в будущем (кэшировать его нам не надо)
		рПараметры.Удалить("HTTPЗапрос");
	КонецЕсли;
	
	// выводим настройки запроса
	инфо="Запрос:
	|Адрес ресурса: "+рЗапрос.АдресРесурса+",заголовк"+?(рЗапрос.Заголовки.Количество()=0,"ов нет","и:");
	Для каждого киз Из рЗапрос.Заголовки Цикл
		инфо=инфо+"
		|     "+СокрЛП(киз.Ключ)+"="+СокрЛП(киз.Значение);
	КонецЦикла;
	Если рПараметры.Свойство("ТелоЗапроса") и ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
		инфо=инфо+"
		|Тело запроса:"+Символы.ПС+рПараметры.ТелоЗапроса;
	КонецЕсли;
	СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);
	
	рМетодHTTP=?(рПараметры.Свойство("МетодHTTP"),ВРег(рПараметры.МетодHTTP),"");
	Если ПустаяСтрока(рМетодHTTP) Тогда рМетодHTTP="GET" КонецЕсли;
	//
	Если рМетодHTTP="GET" Тогда
		рОтвет=рСоединение.Получить(рЗапрос);
	ИначеЕсли рМетодHTTP="POST" Тогда
		рОтвет=рСоединение.ОтправитьДляОбработки(рЗапрос);
	Иначе
		СообщитьИВнестиВПротокол("Указан не поддерживаемый метод: "+рМетодHTTP+",никакое действие не выполняется!!",рПротокол,рПояснять);
		Возврат Ложь;
	КонецЕсли;
	рПараметры.Вставить("HTTPОтвет",рОтвет);
	
	Возврат Истина;
	
Исключение
	инфо="HTTPВыполнитьЗапрос,общая ошибка: "+ОписаниеОшибки();
	Сообщить(инфо,СтатусСообщения.Важное);
	ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
	Возврат Ложь;
КонецПопытки;
КонецФункции

// Выполняет анализ ответа rest-сервиса как объекта HTTPОтвет,заносит в параметры результаты разбора.
// Возвращает успешность (булево),при ошибке возвращает Ложь.
//
// Параметры:
//    HTTPОтвет - объект типа "HTTPСервисОтвет", обязательный; собственно разбираемый ответ;
//    КодСостояния - число, вносимый;
//    Причина - строка, вносимый; если КодСостояния 200, то пуста;
//    ЗаголовкиОтвета - соответствие, вносимый;
//    ТелоКакСтрока - булево; если указан и Истина, то читается тело ответа как строка, для уточнения кодировки используется ключ:
//        КодировкаТелаОтвета - строка или КодировкаТекста, по умолчанию UTF8;
//    ТелоКакДвоичныеДанные - булево; если указан и Истина, то читается тело ответа как двоичные данные;
//    ТелоКакИмяФайла - булево; если указан и Истина, то возвращается имя файла, куда прочитано тело ответа;
//    ТелоОтвета - результат чтения тела ответа, вносимый, если способ чтения тела не указан, то Неопределено;
//    Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
//    Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
Функция HTTPРазобратьОтвет(рПараметры) Экспорт
Попытка
	рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
	рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);
	
	Если Не (рПараметры.Свойство("HTTPОтвет") и ТипЗнч(рПараметры.HTTPОтвет)=Тип("HTTPОтвет")) Тогда
		СообщитьИВнестиВПротокол("В структуре параметров не найден ответ сервиса!!",рПротокол,рПояснять);
		Возврат Ложь;
	КонецЕсли;
	рОтвет=рПараметры.HTTPОтвет;
	//
	рПараметры.Вставить("КодСостояния",рОтвет.КодСостояния);
	Если рОтвет.КодСостояния=200 Тогда
		рПараметры.Вставить("Причина","");
	Иначе
		Попытка рПараметры.Вставить("Причина",рОтвет.Причина) Исключение рПараметры.Вставить("Причина","") КонецПопытки;
	КонецЕсли;	
	рПараметры.Вставить("ЗаголовкиОтвета",рОтвет.Заголовки);
	Если рПараметры.Свойство("ТелоКакСтрока") и ТипЗнч(рПараметры.ТелоКакСтрока)=Тип("Булево") и рПараметры.ТелоКакСтрока=Истина Тогда
		рКодировка=КодировкаТекста.UTF8;
		Если рПараметры.Свойство("КодировкаТелаОтвета") и ЗначениеЗаполнено(рПараметры.КодировкаТелаОтвета) Тогда
			Если ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("Строка") или ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("КодировкаТекста") Тогда
				рКодировка=рПараметры.КодировкаТелаОтвета;
			КонецЕсли;
		КонецЕсли;		
		рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакСтроку(рКодировка));
	ИначеЕсли рПараметры.Свойство("ТелоКакДвоичныеДанные") и ТипЗнч(рПараметры.ТелоКакДвоичныеДанные)=Тип("Булево") и рПараметры.ТелоКакДвоичныеДанные=Истина Тогда
		рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакДвоичныеДанные());
	ИначеЕсли рПараметры.Свойство("ТелоКакИмяФайла") и ТипЗнч(рПараметры.ТелоКакИмяФайла)=Тип("Булево") и рПараметры.ТелоКакИмяФайла=Истина Тогда		
		рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьИмяФайлаТела());
	Иначе
		СообщитьИВнестиВПротокол("Тело ответа игнорируется,т.к. его тип и способ обработки не указаны!",рПротокол,рПояснять);
		рПараметры.Вставить("ТелоОтвета",Неопределено);
	КонецЕсли;
	//
	Возврат Истина;
Исключение
	инфо="HTTPРазобратьОтвет,общая ошибка: "+ОписаниеОшибки();
	Сообщить(инфо,СтатусСообщения.Важное);
	ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
	Возврат Ложь;
КонецПопытки;
КонецФункции

Важно обратить внимание на защищённые соединения и сертификаты, тут могут потребоваться небольшие доработки.

Применимо, начиная с 8.3.6.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 12.08.19 16:34 Сейчас в теме
не читал подробно, но приветствую.
никакой воды: лаконичное описание и код для тестирования/использования.

не то что опусы тутошних маркетологов - напишут с три короба, замылят глаза картинками, а проку пшик.
mashinist; Yashazz; varius; GreenDragon; Vanch90; +5 1 Ответить
2. Yashazz 3637 12.08.19 18:17 Сейчас в теме
Странное что-то с пробелами после запятых, взяли и исчезли... Извиняюсь, возможно, накосячил при публикации.
3. nbeliaev 13.08.19 06:11 Сейчас в теме
В попытке выполнять такой большой участок кода... сомнительное решение. Все возможные ошибки проглатываются и сводятся к одной. Такой код тяжело поддерживать.
Vladimir Litvinenko; dsdred; wowik; Yakud3a; silberRus; FreeArcher; +6 Ответить
4. Yashazz 3637 13.08.19 10:17 Сейчас в теме
(3) Соглашусь. Действительно, логичнее разбить на пошаговые попытки. Переделать?
5. AllexSoft 13.08.19 10:25 Сейчас в теме
Автор любитель условий через ?(,,), сразу видать )
Даю подсказку:
рКодировка=?(рПараметры.Свойство("КодировкаТелаЗапроса"),рПараметры.КодировкаТелаЗапроса,Неопределено);

заменяется на
рПараметры.Свойство("КодировкаТелаЗапроса", рПараметры.КодировкаТелаЗапроса);

и без всяких условий, ну и вся инициализация переменных из свойств аналогично.

А раз так много переменных параметров для запроса требуется, то лучше вынести это в структуру вообще типа
СтруктураПараметровЗапроса = новый Структура("параметр1, параметр2, параметр3", "", "", неопределено);
ну а потом ЗаполнитьЗначенияСвйоств(СтруктураПараметровЗапроса , рПараметры);
все! две строи и параметры инициализированы, и вы точно уверены в полях СтруктураПараметровЗапроса

А здесь зачем то сделано через попытку..
Попытка рПараметры.Вставить("Причина",рОтвет.Причина) Исключение рПараметры.Вставить("Причина","") КонецПопытки;

хотя то же самое что
 Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(рОтвет, "Причина") Тогда рПараметры.Вставить("Причина",рОтвет.Причина) Иначе рПараметры.Вставить("Причина","") КонецЕсли  


А вобще для ODATA неплохо бы процедурку которая умеет собирать параметр filter из структуры отбора или настройки отбора компоновщика скд.
maxopik2; +1 Ответить
6. Yashazz 3637 13.08.19 10:27 Сейчас в теме
(5) Алекс, а это я часть кода резал, неуниверсальную, перед публикацией. Вышло так. Вообще, конечно, ты прав.
7. Yashazz 3637 13.08.19 10:31 Сейчас в теме
(5) Насчёт filter'а для опен даты поищу, вроде где-то делал...
8. AllexSoft 13.08.19 10:37 Сейчас в теме
(7) вот это было бы здорово! у меня никак руки не доходят написать такое, пока использую свои наработки и получается что то типа этого

	ПутьНаСервере = СтруктураПодключения.ИмяПубликации + "/odata/standard.odata/Catalog_ДоговорыКонтрагентов?$format=json&$filter=Owner_Key eq guid'"+СтруктураКонтрагент.Ref_Key+"'";
			
	СвойстваСДатой = Новый Структура("Дата, СрокДействия", '00010101', '00010101');
			
	Результат = ПолучитьДанныеИзODATAвСтруктуру(СтруктураПодключения, ПутьНаСервере,,, СвойстваСДатой);
	
	Для каждого СтруктураДоговор Из Результат.value Цикл
		
		СтруктураПолейПоиска = Новый Структура("Дата, Номер, Контрагент", Новый Структура("ИмяПоля", "Дата"), Новый Структура("ИмяПоля", "Номер"), НайденныйКонтрагент.Ссылка);
		
		НайденныйДоговор = ПолучитьОбъектПоСтруктуреODATA(СтруктураДоговор, "Справочник.ДоговорыКонтрагентов", СтруктураПолейПоиска);
		ЗаполнитьЗначенияСвойств(НайденныйДоговор, СтруктураДоговор,,"Code");

.....
НайденныйДоговор.Записать();

КонецЦикла;


Показать


где ПолучитьДанныеИзODATAвСтруктуру - получает массив структур из ODATA, ПолучитьОбъектПоСтруктуреODATA - по структуре находит объекты в базе или создает их (подобно как ПКО в КД2). Вот сюда бы как раз универсальную замену вот этой строке
ПутьНаСервере = СтруктураПодключения.ИмяПубликации + "/odata/standard.odata/Catalog_ДоговорыКонтрагентов?$format=json&$filter=Owner_Key eq guid'"+СтруктураКонтрагент.Ref_Key+"'";
9. Yashazz 3637 13.08.19 11:02 Сейчас в теме
(8) Вечером доберусь до терминала, где делал это - скопирую и выложу. Хотя у меня это примерно на том же уровне, что и ты привёл пример... Надо вообще?
10. AllexSoft 13.08.19 11:07 Сейчас в теме
(9)
Надо вообще?

думаю в качестве дополнения к статье было бы интересно не только мне.. тем более у меня filter никак не формируется вообще (
11. user1166203 13.08.19 11:59 Сейчас в теме
Спонсор функции - производитель колесиков для мыши :(
OttoBismarck; json; reotem; fotov; Vladimir Litvinenko; +5 Ответить
12. kosmo0 99 15.08.19 10:11 Сейчас в теме
Немного не по статье (раз уж специалисты по работе 1С в интернете собрались).
Можно ли как-то прологировать действия 1с с инетом? В частности работу FTPСоединение. А то один компьютер подключается и нормально забирает и выкладывает файлы. Другой этого не может, хотя конфа одна и та же. Можно конечно потыкать пальцем в небо - давайте попробуем то или это, но хотелось бы видеть действия программы. Или это только сниффером пакеты смотреть?
13. AllexSoft 15.08.19 11:21 Сейчас в теме
(12) по идее включить тех журнал, там наверняка есть события подобного рода. Первое куда я бы смотрел это туда.
15. kosmo0 99 22.08.19 09:12 Сейчас в теме
(13)(14) Спасибо за возможные решения проблемы. Но решил отказаться от FTP в данном случае. Так как не специалист по сетевым технологиям и времени на устранение понадобится довольно много. Плюс надо проверять и изменять из места в котором я не обладаю всеми полномочиями.

зы. Для информации. FTP-сервер расположен на роутере (флешка в usb-порту). Раньше был один роутер, после поломки приобретен от того же производителя, но модель попроще. На старом роутере работало оба обмена использующие FTPСоединение. Но новом только один.

Код который работал и работает:
Соединение.НайтиФайлы("[полный путь к папке]", <ИмяФайла>);

Код который не стал работать:
Соединение.УстановитьТекущийКаталог("[полный путь к папке]");
Соединение.НайтиФайлы(,<ИмяФайла>);

Плюс оказалось что есть чувствительность к регистру букв в полном пути (особенно в наименовании корневого каталога).
14. Yashazz 3637 15.08.19 12:50 Сейчас в теме
(12) Просто ЖР для начала, и каждый шаг писать. Прям вот каждый, и код разобрать на совсем простые шаги. Ну и внимательно смотреть всё - клиент или сервер, какие права у юзера и аккаунта подключения, итд.

Алекс, мне обрубили доступ к тому терминалу. Попробую по черновикам восстановить.
AllexSoft; +1 Ответить
Оставьте свое сообщение

См. также

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

Практика программирования WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    56708    Serginio    33    

Как отправить сообщение Telegram в группу?

WEB v8 Россия Бесплатно (free)

Отправка сообщения в группу Telegram.

вчера в 11:30    148    kite2    0    

Альфа-Авто 5.0 и современные HTTP сервисы

WEB v8 1cv8.cf Автомобили, автосервисы УУ Бесплатно (free)

Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.

вчера в 08:30    112    osivv    0    

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

WEB v8 Россия Бесплатно (free)

Есть база, с пользователем/паролем, нужно подключиться к Odata из другой базы 1С, получить элементы справочника.

24.02.2021    396    user823999    6    

Online телефонный справочник из 1С: Зарплата и управление персоналом Промо

WEB Управление персоналом (HRM) Управление персоналом (HRM) v8 ЗУП3.x Россия Бесплатно (free)

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

10.03.2017    26410    ruha    16    

Интеграция с API WB (Wildberries). Создание карточки товара (спецификации)

WEB v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Опыт интеграции с API WB (Wildberries), опыт создания карточки товара, получение токенов API WB.

18.01.2021    3841    jenyavp    29    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

WEB Интеграция v8 v8::УФ 1cv8.cf Бесплатно (free)

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    1750    SizovE    23    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

Практика программирования WEB Универсальные функции v8 v8::УФ 1cv8.cf Бесплатно (free)

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    684    SizovE    2    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    42045    YPermitin    41    

Как сделать интеграцию (обмен) с интернет-магазином? Пошаговый план действий (Часть 1)

WEB v8 1cv8.cf УУ Бесплатно (free)

C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.

19.11.2020    3289    markbraer    9    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    1624    SizovE    2    

Web Dashboard (мобильная и десктопная версия): оптимальная схема организации взаимодействия с зоопарком систем

WEB v8 Бесплатно (free)

Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.

10.11.2020    4958    SizovE    2    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    30768    anig99    6    

Отладка модуля ДиадокПро

WEB v8 1cv8.cf Бесплатно (free)

В обработке ДиадокПро все дополнительные модули встроены во внешние обработки, которые хранятся в макетах. Это усложняет процесс самостоятельной интеграции, так как теряется возможность попасть в них в режиме отладки. Но не всё так страшно, поэтому ниже инструкция)

30.10.2020    1820    Максим-777    13    

JSON примеры меню B2B web-приложения "Личный кабинет" на движке EDIbot для телефона/десктопа

WEB v8 Бесплатно (free)

Рассмотрим на примерах работу движка EDIbot при организации меню B2B "Личного кабинета" (мобильная версия, версия десктоп) грузовладельца WMS-системы.

29.10.2020    869    SizovE    0    

Обмен с сайтом посредством Post-запроса, json

WEB v8 1cv8.cf Бесплатно (free)

Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.

29.10.2020    4138    John_d    26    

Организация HTTP публикации каталога товаров используя PostgREST

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу порядок установки настройки и использования PostgREST на примере организации каталога товаров.

05.10.2020    916    malikov_pro    2    

Интеграционная прослойка(middleware) на Golang. Часть 5 - Обмен с 1С через HTTP-сервисы платформы

WEB v8 Бесплатно (free)

В этой статье научим прослойку отправлять данные в 1С, для этого используем HTTP-сервисы платформы. Обменяемся данными с новым справочником Клиенты. Но главное создадим HTTP-сервис для получения сообщений из очереди RabbitMQ.

28.09.2020    1528    dmitry-irk38    4    

Отладка http сервиса

WEB v8 Бесплатно (free)

При разработке http сервиса возникает ситуация, а как протестировать http сервис? Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?

23.09.2020    2538    hpi    10    

Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

WEB v8 1cv8.cf Бесплатно (free)

Пошаговое руководство по созданию http-сервиса (часть вторая). Передача параметра в http сервис.

22.09.2020    5399    hpi    6    

Организация данных и вариант обработки для организации обмена с сайтом

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант организации данных и обработки для обмена с сайтом.

22.09.2020    1392    malikov_pro    4    

Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

Практика программирования Обмен данными 1С WEB v8 1cv8.cf Бесплатно (free)

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

18.09.2020    1029    R_o_n_n_y    3    

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант формирования запроса

11.09.2020    3048    malikov_pro    11    

Ферма приложений на Kubernetes

WEB v8 Бесплатно (free)

При эксплуатации большого количества информационных систем 1С, предоставляющих интернет-сервисы, возникают проблемы, связанные с зависимостью от производительности и стабильности веб-сервера. Как объединить отдельно стоящие веб-сервера с помощью платформы Kubernetes для централизованного мониторинга всех опубликованных интернет-сервисов на конференции Infostart Event 2019 Inception рассказал программист компании BIA Technologies Владимир Кирбаба.

24.08.2020    1550    ComboBoy    0    

Использование шаблонного процессора для формирования HTML страниц

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу использование шаблонного процессора Handlebars запущенного на Node.js

24.08.2020    1637    malikov_pro    26    

Загрузка или обновление файла на яндекс диске через rest-api

Практика программирования Файловые протоколы обмена, FTP WEB v8 Бесплатно (free)

Коллеги, в данной публикации я хочу поделиться кодом, с помощью которого можно загрузить файл на яндекс диск или обновить существующий.

12.08.2020    2573    pavelpribytkin96    10    

Самый простой парсинг и обработка веб-страниц в 1С

WEB Универсальные функции v8 1cv8.cf Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    6732    YPermitin    18    

Загрузка или обновление файла на гугл диске

Практика программирования Файловые протоколы обмена, FTP WEB v8 1cv8.cf Бесплатно (free)

Коллеги, в данной публикации я хочу поделиться кодом, с помощью которого можно загрузить файл на гугл диск или обновить существующий.

06.08.2020    1712    pavelpribytkin96    6    

Использование Yandex Translate (Яндекс.Переводчик)

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант подключения и использования Yandex Translate.

08.07.2020    4340    malikov_pro    8    

Когда хотим знать IP клиента...

WEB v8 Бесплатно (free)

В процессе разработки web приложения на 1С, и это не шутка))), а пожелание заказчика, возникла ситуации когда понадобилось знать, с какого IP подключался клиент.

03.07.2020    5901    IMihalev    10    

Ограничение доступа к HTTP публикациям 1С сервера используя NGINX

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант ограничения доступа к HTTP публикациям 1С сервера используя NGINX.

02.07.2020    7293    malikov_pro    7    

Структура обработки загрузки цен и остатков поставщика с примерами и комментариями

Внешние источники данных WEB v8 1cv8.cf Россия Бесплатно (free)

В статье опишу структуру обработки по загрузке цен и остатков от поставщика с примерами.

27.06.2020    1877    malikov_pro    0    

Вариант использования документа "Операция по Яндекс.Кассе" для других сервисов по оплате через интернет

WEB v8 1cv8.cf Россия Бесплатно (free)

В статье рассмотрю организацию эквайринга в УТ 11.4 и доработки для создания заказов на оплату к стороннему сервису, как пример Сбербанк.

24.06.2020    1497    malikov_pro    3    

Работа с AliExpress через API

WEB v8 Бесплатно (free)

В публикации опишу подход работы с API AliExpress и примеры кода.

23.06.2020    5801    malikov_pro    23    

История создания успешной системы чат-ботов на 1С

WEB v8 Бесплатно (free)

Использование чат-ботов в мессенджерах позволяет автоматизировать многие сложные бизнес-процессы путем диалога с системой через виртуального собеседника. О том, как создать универсальную систему ботов с бэкендом на 1С, работающую в Telegram, Viber и Facebook Messenger одновременно, на конференции Infostart Event 2019 Inception рассказал программист-фрилансер Константин Гейнрих.

21.05.2020    8292    CyberCerber    15    

Парсинг html страниц с выводом информации через JavaScript с использованием Selenium

WEB v8 1cv8.cf Бесплатно (free)

Есть девочки как девочки, есть мальчики как мальчики, есть сайтики как сайтики, но странички их обманщики. В целях сохранить информацию, от автоматизированного сбора, многие ресурсы пытаются защитить ее. Один из таких способов - вывод информации на странице через JavaScript. При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные, и в 1с получаем практически пустую страницу. В статье приведу пример разработки, для парсинга таких страниц, без регистрации и смс.

20.05.2020    5653    platonov.e    25    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг третий, WooCommerce, публикация категорий товаров

WEB v8 1cv8.cf Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции публикации категорий товаров в магазин WooCommerce, с комментариями внутри.

13.05.2020    3644    osivv    3    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг второй, публикация картинок

WEB v8 Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции передачи фото из 1С, с комментариями внутри.

13.05.2020    2451    osivv    0    

Интеграция Camunda BPM и 1С

WEB Интеграция v8 Бесплатно (free)

Быстрый старт. Только практические примеры. Установка, запуск и публикация бизнес-процесса на сервере Camunda BPM. Управление бизнес-процессами из 1С при помощи Camunda REST API.

12.05.2020    4472    zhichkin    30    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Первый шаг

WEB v8 Россия Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции 1С с комментариями внутри.

28.04.2020    5469    osivv    23    

Выразительный Web API

WEB v8 Бесплатно (free)

Теория разработки Web API с ожидаемым поведением, за который не будет стыдно за пределами мира 1С.

27.04.2020    7611    nbeliaev    22    

Хранение статистики публикаций автора сообщества Инфостарт ® (мобильное приложение И ++)

Мобильная разработка WEB v8 1cv8.cf Бесплатно (free)

Инфостарт ® достаточно удобный в плане работы со своим личным кабинетом сайт. Но программисты тем и отличаются от большинства людей, что им хочется знать больше. Поэтому появилась конфигурация 1С (она же мобильное приложение 1С) для более подробного учета статистики публикаций: рейтинг, количество просмотров, количество комментариев в динамике и в разрезах.

24.04.2020    2451    capitan    15    

Интеграция УАТ с топливными сервисами

WEB v8 1cv8.cf Автомобили, автосервисы Бесплатно (free)

Интеграция конфигурации Управление автотранспортом с топливными веб-сервисами.

21.04.2020    7676    RPGrigorev    2    

Интеграция 1С с веб-сервисами Лукойл ЛИКАРД

WEB v8 1cv8.cf Россия Бесплатно (free)

Описание интерфейса взаимодействия сервиса Лукойл- ЛИКАРД с информационной системой 1С.

20.04.2020    5699    RPGrigorev    0