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

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

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

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

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

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

60

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

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

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

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

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

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

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

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


А вобще для ODATA неплохо бы процедурку которая умеет собирать параметр filter из структуры отбора или настройки отбора компоновщика скд.
maxopik2; +1 Ответить
6. Yashazz 2908 13.08.19 10:27 Сейчас в теме
(5) Алекс, а это я часть кода резал, неуниверсальную, перед публикацией. Вышло так. Вообще, конечно, ты прав.
7. Yashazz 2908 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 2908 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 91 15.08.19 10:11 Сейчас в теме
Немного не по статье (раз уж специалисты по работе 1С в интернете собрались).
Можно ли как-то прологировать действия 1с с инетом? В частности работу FTPСоединение. А то один компьютер подключается и нормально забирает и выкладывает файлы. Другой этого не может, хотя конфа одна и та же. Можно конечно потыкать пальцем в небо - давайте попробуем то или это, но хотелось бы видеть действия программы. Или это только сниффером пакеты смотреть?
13. AllexSoft 15.08.19 11:21 Сейчас в теме
(12) по идее включить тех журнал, там наверняка есть события подобного рода. Первое куда я бы смотрел это туда.
15. kosmo0 91 22.08.19 09:12 Сейчас в теме
(13)(14) Спасибо за возможные решения проблемы. Но решил отказаться от FTP в данном случае. Так как не специалист по сетевым технологиям и времени на устранение понадобится довольно много. Плюс надо проверять и изменять из места в котором я не обладаю всеми полномочиями.

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

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

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

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

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

См. также

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Немного о интеграции с CRM AMO 7

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) WEB

Немного информации о том, как настроить интеграцию с CRM AMO. Пример функций для подключения к АМО и обновления заказа. Пример на основе API авторизации.

15.11.2019    1042    xxxAndricxxx    6       

Ещё немного о ИНН и сервисе DaData 24

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) WEB

Об использовании сервиса dadata и немного информации о возможностях получать данные по ИНН. Возможно, кому-то будет полезным.

14.11.2019    2724    xxxAndricxxx    20       

Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо

Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.

29700 руб.

Вариант реализации клиента SOAP на примере получения остатков из MERLION 3

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) WEB

В статье приведу пример клиента к сервису SOAP, функции которого принимают несколько значений типа строка или массив строк.

14.11.2019    931    malikov_pro    0       

Разбор любого JSON-объекта в соответствующую структуру 9

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Инструментарий разработчика WEB

Данная публикация предназначена разработчикам 1С, которым приходиться разбирать данные формата JSON. Выложенный пример кода создает объект типа Структура, полностью повторяющий структуру данных формата JSON.

13.11.2019    2071    user665435_al.windstorm    13       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

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

19700 руб.

Проверка reCAPTCHA от Google на стороне HTTP-Сервиса 12

Статья Программист Нет файла v8 Россия Бесплатно (free) WEB

Код проверяет переданный токен reCAPTCHA от Google при вызове HTTP-Сервиса. Таким образом проверяем, отправил ли данные на наш HTTP-Сервис робот или реальный пользователь.

06.11.2019    1752    AVR    0       

Простой способ опубликовать базу 1C из дома в интернет, когда Ваш провайдер этого не обеспечивает (3G, 4G модем и т.п.) 53

Статья Системный администратор Нет файла v8 1cv8.cf Бесплатно (free) WEB Облачные сервисы, хостинг

Если у Вас возникла потребность опубликовать из дома во всемирную паутину базу 1С (например, для тестирования), в т.ч. интерфейс OData, HTTP или Web-сервисы, а интернет-провайдер (например, 3G Мегафон) не предоставляет возможности инициировать соединения извне, то в конце статьи Вы найдете простой, быстрый и условно-бесплатный способ это сделать.

14.10.2019    4983    uno-c    25       

Новогодние скидки на авторское ПО Промо

В преддверии праздника в Маркетплейсе на Инфостарт действует скидка на все платные авторские программы. Размер скидок начинается от 10%. Советуем не откладывать покупки, многие наши партнеры повышают цены на свои продукты именно в начале нового года.

Самый примитивный HTTP-сервис в мире 175

Статья Программист Нет файла v8 Бесплатно (free) WEB

Пошаговый пример создания простейшего HTTP-сервиса, который генерирует HTML-страницу для поиска товара, а также реализует асинхронное получение данных из базы.

12.09.2019    9507    YPermitin    26       

Свой веб интерфейс к 1С: побеждаем CORS на IIS, сохраняя авторизацию 57

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) WEB Администрирование данных 1С

Если "веб морда" расположена не по тому же адресу, что и публикация 1С (что часто бывает, например, при разработке, публикация 1С на http://localhost/1c, а разрабатываемое веб-приложение на http://localhost:8080) или, например, мы заходим на веб приложение то по ip адресу, то по имени сервера, или просто веб сервер и сервер, на котором опубликована 1С - это разные сервера, то для большинства запросов от браузера к 1С срабатывает политика CORS, которая заключается в том, что браузер сначала посылает запрос OPTIONS, на который сервер должен ответить определенным образом, заголовками, содержащими разрешения, а потом уже (если разрешение есть), браузер посылает основной запрос. В случае, когда в публикации 1С (default.vrd) жестко прописан логин и пароль, разрулить ситуацию можно средствами 1С. В случае же, когда нужно сохранить авторизацию (или используется стандартный интерфейс odata), начинаются проблемы.

20.08.2019    4280    Fragster    7       

Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо

Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.

9000 рублей

Вывод отчетов из Штрих-М Торговое предприятие 5 на кассовое ПО Кассир 5 через веб-сервис 3

Статья Системный администратор Программист Нет файла v8 1cv8.cf Розничная и сетевая торговля (FMCG) Россия УУ Windows Розничная торговля Бесплатно (free) WEB

Универсальный механизм вывода отчетов товароучетной системы Штрих-М Торговое предприятие в кассовое ПО Кассир 5 посредством веб-сервиса.

14.08.2019    2180    Van2507    1       

Использование HTTP-сервиса для создания "фронтенда" HTML/CSS/jQuery. Продолжение 53

Статья Программист Расширение (cfe) v8 1cv8.cf Бесплатно (free) WEB

Получение изображений из информационной базы и отправка файлов через "фронт" на HTML/CSS/JS.

08.08.2019    4418    Sedaiko    1       

Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо

Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.

29700 руб.

1Script.Web. Интернет-приложения на языке 1С 121

Статья Программист Нет файла v8 Бесплатно (free) WEB OneScript

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    13779    Evil Beaver    32       

Неверные остатки на сайте битрикс 2

Статья Программист Нет файла v8 УТ11 Бесплатно (free) WEB

Исправление процедуры выгрузки остатков на сайт битрикс из УТ 11

25.04.2019    2804    distorshion    4       

Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо

Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.

24700 руб.

Отправка файлов через SOAP. SOAP with attachments, MTOM 38

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) WEB

В продолжение «своеобразной» поддержки 1С протокола SOAP, описанной в https://infostart.ru/public/965259/, опишу еще одну особенность. 1С не поддерживает возможность отправки файлов-вложений. Для решения этой проблемы пришлось самостоятельно писать формирование пакетов SOAP и разбор ответов сервера.

18.04.2019    4072    mysm    2       

HTML-клиент у конфигурации 1С 146

Статья Программист Нет файла v8 Бесплатно (free) WEB

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    12280    Smaylukk    119       

Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.

29700 руб.

Парсинг сайтов из 1С на примере ломбарды.рф с помощью XPATH для ДокументDOM 67

Статья Программист Нет файла v8 Бесплатно (free) WEB

На всякую хитрую гайку всегда найдется болт с резьбой (с)

01.04.2019    9087    starik-2005    33       

Логируй больше! 1С + UPD + GELF + Graylog 28

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Практика программирования Администрирование данных 1С WEB Разработка

Наличие производительной платформы управления логами - это жизненно важный элемент в ландшафте систем с высокой активностью. Рассмотрим один из подходов логирования активности систем на платформе 1С в Graylog.

26.02.2019    6773    Lars Ulrich    15       

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

Создание телеграм бота с гугл авторизацией, обратными вызовами и уведомлениями об обновлении через сервер-маршрутизатор 159

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) WEB

Статья детально рассказывает обо всех аспектах настройки телеграм бота, работающего через сервер-маршрутизатор посредством обратных вызовов. Приведены примеры работы отправки/исправления сообщений, отправки файлов, работы с внутренними и встроенными запросами. Создание клавиатуры. Авторизация пользователей через gmail.

07.11.2018    19948    🅵🅾️🆇    40       

Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!

29700 руб.

Мой опыт небольшого проекта с веб-сервисами (Часть 2) 20

Статья Программист Нет файла v8 Windows Бесплатно (free) WEB

Продолжение публикации по веб-сервису для реализации странички с выводом данных.

05.10.2018    5076    alex_bitti    0       

Как запустить работу Google Maps в поле HTML формы 1С? 25

Статья Программист Нет файла v8 Россия Бесплатно (free) Практика программирования WEB

Как справиться с передачей события в поле HTML, если надо передать данные. Переход на новую версию Google Maps.

26.09.2018    7304    Green2    10       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Мой опыт небольшого проекта с веб-сервисами (Часть 1) 23

Статья Программист Нет файла v8 Windows Бесплатно (free) WEB

Хочу поделиться своим опытом использования веб-сервисов на небольшом проекте, который в принципе расширяем до чего-нибудь более существенного.

08.08.2018    7444    alex_bitti    33       

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

Создание web-площадки на технологиях 1С, или как Водоканал сделал "Личный кабинет потребителя" 56

Статья Программист Нет файла v8 Энергетика и ЖКХ УУ Управление взаимоотношениями с клиентами (СRM) Дебиторская и кредиторская задолженность Бесплатно (free) WEB

Гончаров Максим делится опытом создания «Личного кабинета потребителя» на сайте водоканала. Он описывает архитектуру системы и объясняет, какую роль в ней играют технологии: «Битрикс», OData, веб-сервисы, «1С:БСП». Также в статье раскрываются возможности использования подсистемы «Анкетирование» в «1С:БСП» как конструктора документов.

25.06.2018    12418    maxx    31       

На что действительно способны HTTP-сервисы 176

Статья Программист Нет файла v8 Бесплатно (free) WEB

В статье я собираюсь не только рассказать вам про HTTP-сервисы 1С, но и показать много прикольных слайдов с картинками. Я думаю, будет весело, и вы найдете для себя что-то полезное.

14.06.2018    26499    dalgaso2010    45