1c 8.3 주문 수신 요청을 게시합니다. http 요청 리디렉션 처리

주요 전자문서관리시스템(EDF)으로 사용할 예정인 1C(개발 및 구성은 아웃소싱)와 PHP(Symfony)로 작성된 B2B 시스템(내부 개발) 간 데이터 전송에 대한 작업이 발생했고, 기업에 입력되는 1차 정보의 기능을 수행합니다.

저는 이미 B2B를 다른 B2B와 통합한 경험이 있습니다. 아이디어는 cURL을 사용하여 JSON을 전송하는 것이었습니다. 그런 다음 Oracle 기반 Borlas 시스템을 통합하는 작업이 발생했으며 이 접근 방식도 적용되었습니다. 그러나 Oracle 측에서는 PHP의 cURL과 유사한 자체 패키지를 사용했습니다(관심이 있는 경우 새 기사에서 설명할 수 있습니다).

내가 알아낸 대로 1C 8.2는 GET 및 POST 요청도 보낼 수 있습니다. 모든 것이 이미 구성되어 있고 다른 시스템에서 작동한다면 여기에서도 작동할 것이라고 가정했습니다. 1C 개발자는 형식이 부적절하고 XML만 인식한다는 이유로 JSON을 거부했습니다. 이를 통해 최소한의 데이터 전송량을 얻을 수 있지만 실제로는 많은 데이터를 수신했다는 의견은 거부되었습니다. 그 결과 우리는 2개의 XML 기반 시스템을 준비하기 시작했습니다.

저는 1C의 요청 수락자를 작성하고 결과를 반환했습니다. 1Sniki가 XML을 대체해야 했던 POST에서 변수를 수신하는 함수입니다.
형식은 대략 다음과 같습니다.

123ABC456//인증 키 get_last_orders// 수행하려는 작업 4000//선택하려는 레코드의 제한

조건에 따라 이미 선택된 레코드를 반환하고 다음과 같은 XML을 생성하는 핸들러입니다.

1 O.P.S. 4853352 01.01.2013 1 b2b에서 업로드됨 스닐스 999999999 고객의 이름 미하일로프 미하일 예브게니예비치 신청일 01.01.2013 ...

데이터는 HTTPS 연결을 통해서만 전송할 수 있습니다.

언뜻 보면 모든 것이 단순해 보이지만 그 과정에서 몇 가지 문제가 발생했습니다.
1) 아웃소싱 업체는 이러한 종류의 요청에 익숙하지 않다고 보고하고 오래되고 입증된 계획을 제공하려고 했습니다.
1. B2B에서 파일 가져오기,
2. 1C에 로딩,
3. 처리할 수 있었던 내용, 1C에서 처리되지 않은 내용을 나타내는 파일을 내보냅니다.
4. B2B로 가져오기,
5. 그리고 처음부터...
이 계획은 사람의 개입이나 "버튼" 없이 신속하게 수행되어야 했기 때문에 거부되었습니다.

그런 다음 그들은 코드 예제를 요청했습니다. 인터넷에서 다음 예를 검색했습니다.

서버 = "test.com"; 포트 = "443"; HTTPTry = 새 HTTPConnection(서버, 포트, True); 그렇지 않으면 HTTP = 새 HTTPConnection(서버, 포트); endIf; ScriptAddress = "/gateway/GetData1C/"; HTTP.SendForProcessing(SendFileName, ScriptAddress, ResponseFileName, HTTPHeader) 시도; Exception Report("연결 시도 실패: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "연결 시도 실패: " + ErrorDescription()); EndIf 반환; 시도 종료;

데이터가 서버에 도착하기 시작했지만 비어 있었습니다. 즉, GET 및 POST가 비어 있었습니다. 로그에 항목을 추가했는데 해당 항목을 잊어버렸습니다. 4개월 후, 통합을 결과로 가져오는 긴급 작업이 주어졌습니다. (많은 시간이 지났기 때문에 1C 개발자가 일하고 일하고 있지만 응답이 없습니다.) 그들은 나를 위해 1C를 설치했고 나는 여기저기 둘러보기 시작했습니다.

먼저, 무슨 일이 일어나고 있는지 이해하기 위해 Fiddler를 설치하기로 결정했습니다. HTTP를 통해 연결한 다음 서버가 HTTPS로 리디렉션되는 것을 확인했습니다. 이런 이유로 데이터가 비어 있다고 가정했습니다. Chrome에서 재현을 시도했는데 리디렉션 중에 POST 요청의 데이터가 손실된다는 확인을 받았습니다.

HTTP를 통한 작업을 허용하는 것이 불가능하기 때문에 나는 그 이유를 연구하기 시작했습니다. 그 이유는 다음과 같습니다.

HTTP = 새 HTTPConnection(서버, 포트, True); "True" 매개변수는 HTTPS를 사용한다는 의미이며, HTTP = New HTTPConnection(Server, Port);

결과적으로 이 "Otherwise"는 폐기되었고 인증서가 잘못되었다는 오류가 발생했습니다. 인증서가 자체 서명되었습니다. 통합 개발은 PROD 서버와 달리 "Thawte SSL CA"의 인증서를 공식 구매한 내부 서버에서 수행되었습니다. 가능한 모든 저장소로 인증서를 가져왔지만 결과가 나오지 않았습니다.

리소스를 검색한 결과 1C에 자체 루트 인증서가 있으며 이를 기반으로 이미 다른 인증서를 확인하고 있다는 사실이 밝혀졌습니다. 1C가 있는 "bin" 폴더에 있는 "cacert.pem" 파일에 테스트 형식으로 있습니다. 가져오기는 생각보다 간단하지 않습니다.

먼저 필요한 인증서를 파일로 내보내야 합니다(이미 개인 저장소에 보관되어 있습니다). 인증서를 찾은 후 “certmgr.msc”를 실행하여 이를 *.cer 파일로 내보냅니다.

C:\OpenSSL-Win64\bin>openssl x509 -inform der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 경고: 구성 파일을 열 수 없습니다: /usr/local/ ssl/openssl.cnf MD5 지문=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
MD5를 저장하면 필요합니다.
다음으로 "cacert.pem" 파일을 엽니다.
맨 아래로 내려가 먼저 MD5를 추가한 다음 "fiddler.pem" 파일에 나온 모든 내용을 추가합니다.
파일을 저장합니다.
1C를 다시 시작합니다. (필요하지 않을 수도 있지만 작동하지 않아서 모든 것을 다시 시작했습니다.

1C의 소스 파일에는 다음 형식이 제공되었습니다.

절차 SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefine Then Report("Exchange 설정에 지정된 서버에 연결할 수 없습니다! 처리가 중단되었습니다!"); 그렇지 않으면 소스 = FileAddress; endIf; 파일명 = 파일결과; PostFileName = 포스트파일; PostFile = 새 파일(PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); 헤더 = 새 일치(); Headers.Insert("콘텐츠 유형", "application/x-www-form-urlencoded"); Headers.Insert("콘텐츠 길이", SubmissionFileSize); Connection.SendForProcessing(PostFileName, Source, FileName, Headers) 시도; 예외 보고서(ErrorDescription()); EndAttempts EndProcedures 함수 GetHTTPConnection() 내보내기 AttemptConnection = New HTTPConnection(HTTPServer,"443",True); 예외 보고서(ErrorDescription()); 연결 = 정의되지 않음; 시도 종료; 반환 연결; EndFunctions 프로시저 OnOpen() HTTPServer = "test.com"; 파일주소 = "/gateway/GetData1C"; 포스트파일 = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; 절차 종료

버튼을 클릭하면 HTTPS를 통해 요청이 전송되고 올바른 XML이 출력으로 수신됩니다.

1C가 HTTPS를 통해 어떻게 작동하는지 많은 자료를 찾아봤지만 자체 서명 인증서를 사용하여 작업하는 방법을 찾을 수 없었습니다.

1C에서 플랫폼 버전 8.3.9.2170을 사용하는 사이트로 정보를 전송하는 절차를 개발할 때 문제가 발생했습니다. 사이트 개발자가 PUT 메서드를 사용하는 HTTP 요청을 통해서만 필요한 정보를 기록하는 기능을 제공했습니다.

두 번 생각하지 않고 간단한 코드를 작성했습니다.

연결 = 새 HTTPConnection("www.mysite.ru"); 헤더 = 새 경기; 헤더["Content-Type"] = "application/x-www-form-urlencoded"; 요청 = 새 HTTPRequest("/api/order_items/93076?order_item=30", 헤더); 연결.쓰기(요청);

실행 결과에 따라 창고에 입고된 상품의 수량은 웹사이트의 구매자 주문 해당 라인에 입력되어야 합니다.

그러나 이미 이해하셨겠지만 아무 일도 일어나지 않았습니다. (Chrome 플러그인을 통해 유사한 요청을 보내) 사이트에 오류가 없는지 확인한 후 내 사이트에서 해당 사이트를 시작했습니다. 로컬 컴퓨터웹 서버를 테스트하고 실험을 시작했습니다.

이상한 점이 즉시 분명해졌습니다. 위 코드는 PUT을 생성하지 않고 HEAD 요청을 생성합니다!

Apache 로그에서 다음을 확인했습니다.

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

저는 조금 놀랐지만(결국 설명서에는 PUT이 흑백으로 적혀 있었습니다) 당황하지 않았습니다. 메소드를 직접 호출할 수 있습니다.

Connection.CallHTTPMethod("PUT",요청);

로그에는 동일한 내용이 표시됩니다.

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

"내가 뭔가 잘못하고 있는 게 아닐까?" - 나 자신에게 질문을 했어요. 하지만 인터넷이나 매뉴얼에는 힌트가 없었습니다. 글쎄, 아직 아무도 과학적 찌르기 방법을 취소하지 않았습니다. 우선, 나는 이렇게 하려고 했습니다:

Connection.CallHTTPMethod("fyvfyv",요청);

내가 받은 로그에서:

127.0.0.1 - - "???????? /api/order_items/93076?order_item=30 HTTP/1.1"

흥미롭게도 이는 1C가 PUT 방법을 구체적으로 대체한다는 것을 의미합니다(1C가 왜 그것을 좋아하지 않았습니까?).

몇 번 더 시도한 후에 나는 이것을 생각해 냈습니다.

Connection.CallHTTPMethod("PUT",요청);

내가 받은 로그에서:

127.0.0.1 - - "PUT /api/order_items/93076?order_item=30 HTTP/1.1"

그리고 이 옵션은 이미 사이트에서 작동했으며 모두가 만족했습니다.

그는 문제에 대한 보다 정확한 해결책을 제안했습니다. 즉, 요청 본문, 모든 본문, 심지어 비어 있는 본문을 지정해야 합니다. 예를 들어 다음 옵션이 작동합니다.

연결 = 새 HTTPConnection("www.mysite.ru"); 헤더 = 새 경기; 헤더["Content-Type"] = "application/x-www-form-urlencoded"; 요청 = 새 HTTPRequest("/api/order_items/93076?order_item=30", 헤더); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); 연결.쓰기(요청);

그리고 요청 본문에 매개변수 값 자체를 전달하는 것이 아마도 꽤 정확할 것입니다.

결론은 다음과 같습니다. 1C 플랫폼은 본문이 없는 PUT 요청을 잘못된 것으로 간주하고 해당 메서드를 HEAD로 대체합니다.

1C가 본문 없이 POST 요청을 추적하지 않고 GET으로 변환하지 않는 것이 궁금하여 재미로 확인해 보았습니다.

잘 알려진 Vovochka는 유명한 농담에서 다음과 같이 말했습니다. "논리는 어디에 있습니까?"

내 출판물이 누군가의 답을 찾는 데 몇 시간의 시간을 절약할 수 있기를 바랍니다. =)))

인쇄(Ctrl+P)

두 번째 부분을 볼 수 있습니다

일반 정보

플랫폼 버전에서 8.3.5.1068 , 2015년 9월에 게시됨, 1C를 다음과 통합하는 메커니즘 외부 프로그램기술을 통해 REST 인터페이스. 플랫폼은 OData 프로토콜을 액세스 프로토콜로 사용합니다. 데이터를 쿼리하고 업데이트하기 위한 개방형 웹 프로토콜입니다. HTTP 명령을 요청으로 사용하여 데이터를 조작할 수 있습니다. 버전 8.3.5.1068에서는 다음 형식으로만 답변을 받을 수 있었습니다. 원자/XML . 그러나 2017년 8월 릴리스 8.3.8.1652부터 JSON(JavaScript Object Notation) 형식으로 데이터를 수신하기 위한 두 번째 옵션이 나타났습니다. . XML에 비해 읽기 쉽고 공간을 덜 차지합니다. 또한 모든 브라우저에는 JSON 작업을 위한 도구가 내장되어 있습니다.

1C: Enterprise 플랫폼에서 OData 프로토콜 작업은 17장의 1C: 개발자 가이드에서 찾을 수 있습니다. 인터넷 서비스의 메커니즘, 단락 17.2.1 표준 OData 인터페이스. OData 프로토콜에 대한 지원 확장의 예를 볼 수도 있습니다.

사용의 이점 REST 인터페이스. 외부 애플리케이션에서 시스템 데이터에 액세스하기 위해 애플리케이션 솔루션 코드 수정이 필요하지 않다는 결론을 내렸습니다(예: 애플리케이션 솔루션이 지원되는 경우). 이 액세스 권한을 얻으려면 특정 방식으로 웹 서버에 애플리케이션을 게시하고 이 방식으로 사용될 구성 개체를 지정해야 합니다. 그러면 타사 시스템이 HTTP 요청을 사용하여 애플리케이션에 액세스할 수 있습니다.

표준 OData 인터페이스 게시는 웹 서버의 게시 대화 상자(관리 - 게시)를 사용하여 수행됩니다. 웹 서버) 및 1C:Enterprise 8.3 책에 설명되어 있습니다. “관리자 가이드”.
중요한!표준 OData 인터페이스를 통해 구성 개체에 액세스하려면 전역 컨텍스트 메서드를 사용하여 이를 활성화해야 합니다. StandardInterfaceOData()의 구성 설정.
표준 OData 인터페이스를 사용하여 사용 가능한 개체 구성을 설정하는 메커니즘은 다음 형식으로 수행할 수 있습니다. 외부 처리. 이를 위해서는 애플리케이션 솔루션을 수정할 필요가 없습니다.

1C:Enterprise의 외부 REST 웹 서버와 상호 작용하기 위해 HTTP: 개체 작업을 위해 플랫폼에서 사용할 수 있는 도구를 사용합니다. HTTPConnection, HTTPRequest 및 HTTPResponse.

이 기사 시리즈에서는 해당 HTTP 메서드를 사용하는 일반적인 작업의 예를 보여 드리겠습니다.

  • 데이터 수신 - 방법 얻다;
  • 객체 생성 - 방법 우편;
  • 데이터 업데이트: 방법 반점– 이 경우 업데이트해야 하는 속성만 지정할 수 있습니다. 방법 놓다– 이 경우 해당 법인의 모든 속성을 표시해야 합니다.
  • 데이터 삭제 - 방법 삭제.

1. 데이터 수집의 예. HTTP GET 방식

서버는 다음과 같은 이름으로 웹 서버에 게시된 데이터베이스입니다. WebBuh(데모 데이터베이스 "Enterprise Accounting 3.0"). 데이터 교환 형식으로 JSON 형식을 사용하겠습니다. JSON 작업에 대한 자세한 내용은 사용 가능한 문서에 기록되어 있습니다. HTTP GET 메소드를 사용하여 서버로부터 데이터를 수신하려면 객체를 생성해야 합니다. JSON 읽기파일이나 문자열에서 JSON 데이터를 순차적으로 읽습니다. HTTP POST PATCH PUT 메소드를 사용하여 서버에 객체와 텍스트의 순차적 기록을 구성하려면 객체를 생성해야 합니다. JSON 항목. DELETE 메서드에는 JSON이 필요하지 않습니다.

REST 인터페이스에 액세스할 때 JSON을 읽고 쓰는 흐름을 설명하기 위해 다음 사용자 정의 함수를 호출하겠습니다. 범용 HTTPMethodOnServer 호출 :

&서버에서 // <Описание функции>// // 옵션: // - 요청에 대한 HTTP 메서드 이름이 포함된 문자열("POST"."PATCH", "PUT" ,"GET","DELETE" // - HTTPConnection 객체 //<АдресРесурса>- HTTP 요청이 전송될 http 리소스의 문자열입니다. //<ОтправляемыеДанные>- 지정된 HTTP 메서드 "POST", "PATCH" 또는 "PUT"을 사용하여 // 서버에서 처리하기 위해 지정된 주소로 전송된 데이터가 포함된 구조 또는 일치 // 반환 값: // 서버 응답의 구조는 다음에 따라 달라집니다. HTTP메소드// 기능 HTTPMethodOnServer(HTTPMethod, HTTPConnection, ResourceAddress, SentData = 호출)한정되지 않은 ) // HTTP 요청 생성헤더 = new Match(); 제목.삽입("콘텐츠 유형", "응용 프로그램/json"); HTTP 요청 = 새 HTTP 요청( 리소스 주소, 헤더 ); // 데이터를 생성하고 업데이트하기 위해 Json을 작성합니다. HTTPMethod = "POST" 또는 HTTPMethod = "PATCH" 또는 HTTPMethod = "PUT"인 경우 JSON 레코드 = 새 JSON 레코드입니다. 매개변수JSON = 신규 매개변수RecordsJSON(라인 WrapJSON.Auto,"",True); RecordJSON.SetString(매개변수JSON); 쓰기JSON(쓰기JSON, 전송된 데이터 ); // 전송된 데이터이 경우 LineForBody =가 필요합니다. RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, 텍스트인코딩.UTF8, ByteOrderMark 사용.사용하지 않음); endIf; // HTTPConnection 메서드 호출 ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMethod, HTTPRequest) ; 답변 구조= 새로운 구조 ; 답변 구조.Insert("상태 코드", 응답HTTP.StatusCode); // GET 메소드에 대해서만 JSON을 읽습니다.만약에 HTTP메소드="GET"그런 다음 TryReadJSON = NewReadJSON ; 서버응답 = 응답HTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); 일치 = JSON 읽기(JSON 읽기,진실); 응답 구조.삽입("서버응답",일치) ; 답변 구조.삽입(" 서버 응답복호화되지 않음", ServerResponse); 예외 보고서(오류설명()); 정의되지 않은 반환;시도 종료; 종료If ; 반품 답변 구조 ; EndFunction // HTTPMethodOnServer() 호출

서버로부터 수신하려면 JSON 형식애플리케이션 솔루션의 REST 인터페이스에 접근할 때 리소스 주소에 지정해야 합니다. $형식=json.또는 MIME 유형을 지정하십시오 "응용프로그램/json"제목에서:

헤더 = new Match(); Headings.Insert("콘텐츠 유형", "애플리케이션/json") ; 자원주소 = " WebBuh/odata/standard.odata/ ?$format=json" 요청HTTP = 신규 HTTPRequest(리소스 주소, 헤더);

글로벌 컨텍스트의 특징 ReadJSON(ReadJSON, 참)

  • 두 번째 매개변수가 True로 설정된 경우 객체를 읽습니다. JSON에 완료됩니다 일치.False로 설정하면 객체를 다음 유형의 객체로 읽어옵니다. 구조.
  • JSON 개체를 구조로 역직렬화할 때 구조 키 요구 사항을 알고 있어야 합니다. 객체를 역직렬화할 때 구조 키에 유효하지 않은 속성 이름이 발견되면 예외가 발생합니다.

1. 1 HTTP 연결 매개변수 구성

외부 REST 웹 서버와의 상호 작용의 클라이언트 부분을 구성하기 위해 처음부터 BSP를 기반으로 클라이언트 구성을 만들었습니다. 이 구성을 사용하여 연결 매개변수 설정을 위한 참조를 만들었습니다(그림 1 참조).

그림 1 나머지 인터페이스를 통한 외부 정보 보안에 대한 HTTP 연결을 위한 매개 변수 설정 디렉터리

버튼을 누른 후 서버 응답을 확인하고, 클라이언트가 서버로부터 응답을 수신하려고 시도하는 프로시저가 호출됩니다. 프로그램 코드절차는 아래와 같습니다.

&OnClient 프로시저 CheckConnection(명령) 주소 = 개체.서버 주소; 사용자 = 개체.사용자; 비밀번호 = 개체.비밀번호; 데이터베이스 이름 = 개체.이름; 포트 = ? (객체.포트<>0,객체.포트,80); HTTPConnection = 신규 HTTPConnection(주소, 포트, 사용자, 비밀번호); ResourceAddress = 데이터베이스 이름 + "/odata/standard.odata/ $메타데이터 "; //부르다 맞춤 기능 답변 구조=B HTTPMethodOnServer 호출("얻다" , HTTPConnection, 리소스 주소) ; 만약에 답변 구조 <> 정의되지 않음 범용ClientServer.NotifyUser("상태 코드"+응답 구조.상태 코드); 끝없는; 절차 종료

이 절차의 목적은 다음과 같습니다. 서비스를 확인하고사용자가 연결 매개변수를 올바르게 입력했는지 여부. 이렇게 하려면 GET 요청을 수행하면 됩니다.
HTTPConnection.CallHTTPMethod( "얻다", HTTP 요청);
리소스 주소 사용:
자원주소 =기본 이름+ /odata/standard.odata/ “;
다음을 사용하여 브라우저에서 서비스를 확인할 수도 있습니다.
URL
http://host/WebBuh/odata/standard.odata. 이러한 쿼리의 결과는 엔터티 목록일 뿐입니다. 표준 OData 인터페이스(사용 가능한 엔터티 목록, XML 형식의 해당 속성 및 기능)에 대한 완전한 설명을 얻으려면
문서.) 매개변수를 사용하여 GET 요청을 수행해야 합니다. $메타데이터. URL http://host/WebBuh/odata/standard.odata/$metadata. 상세 설명이 문서는 http://www.odata.org/documentation/(영문)에서 얻을 수 있습니다.
형식으로 답변을 받으실 수 있습니다. 원자/XML또는 JSON. HTTP 응답 상태 코드는 다음 범위의 응답을 볼 수 있습니다.

  • 100-199 – 클라이언트의 요청이 수락되었으며 처리 중임을 나타내는 정보 응답.
  • 200-299 – 클라이언트의 요청이 성공적으로 처리되었음을 의미합니다.
  • 300-399 이는 요청이 완료되지 않았으며 클라이언트가 요청을 만족시키기 위해 어떤 조치를 취해야 함을 의미합니다.
  • 400-499 – 클라이언트 애플리케이션 측의 오류에 대해 알려줍니다. 이 코드는 클라이언트에게 추가 정보가 필요함을 나타낼 수도 있습니다.
  • 500-599 - 서버 측 오류에 대해 알리며, 이는 서버에 오류가 발생하여 클라이언트 요청을 이행할 수 없음을 나타냅니다.

1.2 ID로 객체 검색하기

다음 기능은 서버의 고유 식별자로 디렉터리나 문서를 검색하도록 설계되었습니다. 객체가 발견되면 함수는 식별자(Ref_Key)의 문자열 값을 반환하고, 그렇지 않으면 반환합니다. 한정되지 않은.다음 매개변수가 함수에 전달됩니다.

  • HTTPConnection – HTTPConnection 유형의 객체
  • PublicationName – 게시된 서버 데이터베이스의 이름
  • 요소 – 객체 개체 식별자(예: 카탈로그_조직또는 Document_- 조직의 디렉토리.
  • 식별자 – 서버에서 검색할 개체의 식별자입니다. 조직.고유식별자()
&OnServer 기능 GUID별 개체 검색 (HTTPConnection,출판 이름,요소,고유 식별자) GUID = 문자열(고유 식별자); // 문자열로 변환 ResourceAddress = + 요소+ "(guid""+ GUID+ "")?$format=json" ; 답변 구조 =BHTTPMethodOnServer 호출("얻다" , HTTPConnection, 리소스 주소) ; 만약에 답변 구조 .StatusCode >= 400 그런 다음 //범용ClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); 정의되지 않은 반환; 종료If ; 일치 = 답변 구조. 응답서버a; 배열 = 일치["값"]; 배열 = 정의되지 않은 경우 일치 항목을 반환합니다["Ref_Key"] 그렇지 않으면 배열 반환["Ref_Key"]; endIf; EndFunction

매개변수 자원주소 REST 서비스에 액세스하는 데 사용됩니다. 서비스 작동을 확인하려면 다음과 같이 브라우저에서 리소스를 지정하면 됩니다.

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(요소)?(매개변수) ,어디

  • 웹서버 주소– 서비스가 게시되는 웹 서버의 주소(예: Localhost)
  • 이름출판물- 이름 정보 기반결정을 게시할 때 표시됨
  • /odata/standard.odata/ – 표준 OData 인터페이스에 대한 액세스 신호
  • 요소 – 자원 식별자 또는 사전 정의된 자원. 예를 들어 Catalog_Account(guid'값')입니다.
  • 옵션– 자원 매개변수. 예를 들어 HTTP 요청에 대해 허용되는 방식으로 선택에 사용됩니다. ?key=value&key2=value2

1.3 검색 필드를 사용하여 개체 검색

다음 사용자 정의 기능은 개체가 식별번호에 의한 경우 검색 필드로 개체를 검색하도록 설계되었습니다. 함수 객체 문자열 Ref_Key -식별 번호.

&OnServer 함수 P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields)조건 = "" ;검색 필드 루프의 각 KeyValue에 대해 상태 = 상태 + 키값.키+ "eq"" + 키값.값+ "" 및 "; EndCycle; 요청 텍스트 =Lev(조건, StrLength(조건)-5); // 마지막 5자를 제거합니다. 자원주소= PublicationName+ "/odata/standard.odata/" +요소+ "?$filter=" + 요청 텍스트+ "&$format=json& $select=Ref_Key" ; //내 맞춤 함수 호출 답변 구조= CallHTTPMethodOnServer( "얻다",HTTPConnection,ResourceAddress);만약에 답변 구조 .StatusCode >= 400 그런 다음 //일반 목적ClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //일반 목적ClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); 정의되지 않은 반환; endIf; 일치 = 답변 구조. 응답서버a; 배열 = 일치["값"]; 배열 = 정의되지 않은 경우 일치 항목을 반환합니다. ["Ref_Key" ] 그렇지 않으면 배열 반환 ["Ref_Key" ]; endIf; EndFunction

절차 본문에서 볼 수 있듯이피 searchObjectBySearchFields, 선택은 키워드로 시작됩니다.$filter리소스 주소에 형식적 매개변수검색 필드 –이는 세부사항의 이름과 값을 포함하는 서신입니다.

세부사항의 이름이 명확하지 않은 경우도 있다는 점을 참고하세요. 참고 도서의 경우 다음 사항을 기억해야 합니다.

  • 코드-코드,
  • 설명 – 이름
  • DeletionMark - 삭제 표시,
  • IsFolder – 그룹 서명,
  • Parent_Key – 부모.
  • 속성이 참조 유형인 경우 해당 이름에 _Key 접미사를 추가해야 합니다(예: Account_Key).

문서의 경우:

  • 번호 - 문서 번호,
  • 날짜 – 문서 날짜.

논리적 선택 작업

  • eq - 같음; /Catalog_Cities?$filter=이름 eq '기본';
  • ne - 같지 않음; /Catalog_Cities?$filter=이름 네 '페름';
  • gt - 기타; /Catalog_Products?$filter=가격 gt 10;
  • ge - 크거나 같음; /Catalog_Products?$filter=가격 ge 10;
  • lt - 덜; /Catalog_Products?$filter=가격 lt 10;
  • 르 - 작거나 같음; /Catalog_Products?$filter=가격 le 10;
  • 또는 - 논리적 OR; /Catalog_ 제품 ?$filter= 가격 lt 10 또는 가격 gt 100;
  • 그리고 - 논리 AND; / 카탈로그 _제품?$ 필터 =가격 g t 10 및 가격 l t 100;
  • 아님 - 부정; /Catalog_ 제품 ?$filter=not(가격은 10);

실제 매개변수의 값도 참고하세요. 요소(또는 엔터티)) 함수에 전달합니다. 다음 규칙에 따라 구성됩니다.

이름 Prefix_ConfigurationObjectName_Name 접미사.

표준 OData 인터페이스를 사용하면 다음 개체에 액세스할 수 있습니다( 이름 접두사):

  • 디렉토리 - 카탈로그;
  • 문서 - 문서;
  • 문서 저널 - DocumentJournal;
  • 상수 - 상수;
  • 교환 계획 - ExchangePlan;
  • 계정과목표 - ChartOfAccounts
  • 계산 유형 차트 - ChartOfCalculationTypes;
  • 특성 유형 차트 - ChartOfCharacteristicTypes;
  • 정보 등록 - 정보 등록;
  • 누적 레지스터 - AccumulationRegister;
  • 계산 레지스터 - CalculationRegister;
  • 회계 등록 - AccountingRegister;
  • 비즈니스 프로세스 - BusinessProcess;
  • 작업 - 작업.

구성객체 이름- 구성자에 지정된 구성 개체의 "이름" 속성입니다.

이름 접미사- 리소스 이름을 명확히 하는 데 필요하며 선택 사항이며 다음 값을 사용할 수 있습니다.

  • 개체의 표 형식 부분의 이름입니다.
  • 이름 가상 테이블물체;
  • RowType - 개체의 표 형식 부분의 행입니다.
  • RecordType - 별도의 레지스터 항목입니다.

리소스 액세스를 위한 매개변수

리소스 이름을 구성한 후에는 리소스에 액세스하기 위한 매개변수를 정의해야 합니다. 예를 들면 다음과 같습니다. ?$필터= 의미 &$format=json& $select= Ref_Key ,

  • $filter- 데이터 수신 시 선택
  • $format- 반환된 데이터의 형식을 나타냅니다.
  • $select- 쿼리 결과에 포함될 엔터티 속성 목록
  • $메타데이터- 표준 OData 인터페이스에 대한 설명을 반환합니다(위 이미지 중 하나에서 이름 접미사를 지정하지 않고 사용됨).
  • $top- 반환되는 기록의 수를 제한합니다.
  • $건너뛰기- 쿼리 결과에서 지정된 수의 레코드를 제거합니다.
  • $count- 쿼리 선택 항목의 레코드 수를 반환합니다.
  • $inlinecount=모든페이지(=없음)- 쿼리 결과에 레코드 수에 대한 정보를 추가합니다.
  • $orderby=<Реквизит1>오름차순,<Реквизит2>설명- 쿼리 결과 정렬
  • 허용만- 허용되는 항목만 있습니다("$" 기호 없이 사용).

1.4 정보 레지스터 항목의 배열 가져오기

개인의 전체 이름에 대한 정보(예: 전체 이름 변경 내역)에 대한 등록 항목 배열을 얻는 예를 살펴보겠습니다. 개인

이름출판물 = "웹부";요소 = "정보등록_개인명"; 기간 = 정의되지 않음; 참조 유형 데이터= 새로운 구조(); 디 데이터참조 유형.Insert("개인",개인_키); DataNON 참조 유형= 새로운 구조(); DataNON 참조 유형.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") 배열 = GetRegisterInfoSet(HTTP연결, 출판 이름, 요소, 기간, 치수참조 유형, 비참조 유형 치수)

이 예제에서 호출되는 GetInfoRegisterRecordSet 함수의 본문은 다음과 같습니다.

&OnServer 기능 GetSetRecordRegister정보(HTTPConnection,PublicationName,Element,Period =정의되지 않음, 치수참조 유형= 정의되지 않음 비참조 유형 치수= 정의되지 않음) RequestText = "" ;기간이 있는 경우<>정의되지 않음 형식화된 기간= 형식(기간,"DF=yyyy-MM-ddTHH:mm:ss"); RequestText = "기간 = 날짜/시간"" + FormattedPeriod + """ ; endIf; 만약에 치수참조 유형 <>다음의 각 KeyValue에 대해 정의되지 않음 치수참조 유형사이클 전원 = ? ( 값이 채워짐(QueryText), "," ,""); 요청 텍스트 = 요청 텍스트+ 전원이 켜졌습니다 + 키값.키+ "=안내(""+ 키값.값+ "")"; EndCycle; EndIf; If 비참조 유형 치수<> 정의되지 않음각 키의 의미 비참조 유형 치수 주기 질문 = ? ( 값이 채워짐(QueryText), "," ,""); QueryText = QueryText + Fed+ K 키의미.키 + "=" + 키값.값; 엔드사이클; endIf; ResourceAddress=출판 이름 + " /odata/standard.odata/" + 요소 + "("+ 쿼리 텍스트 + + ") ?$format=json"; //내 맞춤 함수 호출 답변 구조 = HTTPMethodOnServer 호출("GET",HTTPConnection,ResourceAddress); 만약에 답변 구조.StatusCode >= 400 그런 다음//일반 목적ClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //일반 목적ClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); 정의되지 않은 반환; endIf; 일치 = 0

플랫폼의 두 번째 버전 8부터 사용자와 개발자는 1C에서 직접 http 요청을 사용할 수 있습니다. 이 프로그램은 두 가지 유형의 요청을 지원합니다.

  • POST 요청;
  • GET 요청.

따라서 데이터를 교환하고 http를 통해 운영되는 웹 서비스 및 서비스와 상호 작용하기 위한 매우 편리한 도구가 만들어졌습니다.

GET 요청

물론 쿼리를 사용하는 가장 간단한 예는 여러 줄의 설명보다 해당 기능을 훨씬 더 잘 보여줍니다. 그럼 시도해 봅시다:

  1. 우리 사이트의 메인 페이지 본문을 가져오겠습니다.
  2. 요청을 리디렉션하는 작업을 진행하겠습니다.
  3. 사이트에서 사진을 찍어보겠습니다.

사이트 본문 가져오기

간단한 것부터 시작해 보겠습니다. 그림에서..

이 코드 섹션을 실행한 결과는 상당히 큰 텍스트이며, 그 마지막 섹션은 그림 2에 표시됩니다.

그림 2

코드의 첫 번째 줄에서는 http 리소스에 대한 연결 개체를 만듭니다. 객체에는 다음 속성이 포함될 수 있습니다.

  • 서버 - 서버 주소를 포함하는 연결 문자열입니다.
  • 포트 – 서버 포트를 나타내는 숫자가 포함되어 있으며 기본적으로 연결 유형에 따라 보안되지 않은 연결의 경우 80을 지정하고 SSL 보안 연결의 경우 443을 지정할 수 있습니다.
  • 사용자 이름 - 서버에 대한 인증이 필요한 경우 표시됩니다.
  • 비밀번호 – 지정된 리소스에 대한 사용자 비밀번호입니다.
  • 프록시 – 프록시가 서버와 통신하는 데 사용될 때 표시되는 InternetProxy 유형의 개체를 포함할 수 있습니다.
  • 보안 연결 – 기본값은 FALSE이며, TRUE로 전환하면 https 프로토콜이 사용됨을 나타냅니다.

또한 HTTPConnection 객체에는 핸들러 실행 알고리즘을 더 완벽하게 설명할 수 있는 자체 메서드 호출이 있습니다.

  • CallHTTPmethod – 두 개의 필수 매개변수인 HTTPmethod와 HTTPrequest가 포함되어 있으며 세 번째 매개변수에 지정된 파일에 응답 본문을 쓰는 기능을 지원합니다.
  • 쓰기 – PUT 요청을 사용하여 서버에 데이터를 보냅니다.
  • 수정 – PATCH 요청을 처리하여 객체를 수정합니다.
  • SendForProcessing – 이전의 모든 메서드와 마찬가지로 POST 요청 사용을 나타내는 메서드는 요청 텍스트를 포함해야 하며 데이터 기록을 위한 응답 파일의 주소를 전송할 수도 있습니다.
  • 수신 - 이에 대해서는 아래에서 더 자세히 설명합니다.
  • GetHeadings는 기사에서 사용될 또 다른 방법입니다.
  • 삭제는 실제로 서버의 요청에 전달된 리소스를 제거하는 삭제 요청입니다.

두 번째 줄에서는 선택한 사이트에 대한 요청을 생성합니다. 요청 텍스트에는 슬래시가 하나 포함되어 있습니다. 홈페이지. 슬래시 뒤에 "page2" 또는 "news"와 같은 표현식이 오면 다른 페이지가 표시됩니다.

세 번째 줄은 서버에 대한 요청을 실행합니다.

네 번째에서는 결과를 보여줍니다.

http 요청 리디렉션 처리

프로그래밍 방식으로 검색 결과를 얻어야 하는 상황을 상상해 봅시다. 검색 엔진'1초 안에 요청'이라는 키를 사용합니다. GOOGLE에 액세스하는 데 필요한 코드 섹션은 그림 3에 나와 있습니다.

그림 3

여기에는 이미 우리에게 익숙한 구조 외에도 헤더와 상태 코드가 있습니다. 그들을 처리합시다.

상태 코드 - "의견 요청"에 지정된 표준 값은 다음 값을 사용할 수 있습니다.

  1. 모든 것이 정상이면 값은 100에서 299 사이의 범위로 반환됩니다.
  2. 리디렉션의 경우 300에서 399 범위의 코드가 반환되며, 이 경우 리소스에 대한 성공적인 영구 리디렉션은 코드 301에 의해 결정됩니다.
  3. 요청에 오류가 있는 경우 매개변수는 400에서 499 사이의 값을 갖습니다.
  4. 500-599 범위의 값은 서버에 문제가 있음을 나타냅니다.

각 페이지에는 여러 매개변수를 구별할 수 있는 텍스트의 제목이 있습니다(그림 4).

  1. 연결 다이어그램(두 개의 슬래시 "//" 앞에 오는 모든 것)
  2. 주소 표시 줄사이;
  3. 사용자 이름과 비밀번호;
  4. 연결할 포트와 호스트입니다.

이는 SplitAddressLine 함수에 의해 수행되는 분할입니다. 이렇게 해서 받은 새 주소, 페이지를 컴퓨터에 저장하고 기본 브라우저에서 열 수 있습니다(GetPage 프로시저).

그림 5

여기에는 요청을 처리하는 새로운 기능이나 방법이 없습니다. 실제로 만들고 있습니다. 텍스트 문서사이트 본문에서 브라우저에서 페이지를 실행합니다.

파일을 D 드라이브의 루트에 배치하고 테스트라고 부릅니다.

우리는 사이트에서 이미지를 가져옵니다

자연스러운 질문이 생깁니다. 전체 사이트가 필요하지 않고 개별 요소만 확보하면 되는 경우 이를 수행할 수 있으며 어떻게 수행할 수 있습니까? 그래 넌 할수있어. 이를 수행할 수 있는 프로그램 코드는 그림 6에 나와 있습니다.

그림 6

그림에서 볼 수 있듯이 요청 본문에는 수신해야 하는 사이트 구조 요소의 코드가 있습니다. 이 부분은 이전 설명에는 없었으며 이 점에 대해 더 자세히 설명해야 합니다.

우리는 브라우저를 사용했습니다오페라 사이트에 접속합니다. 여기에는 중요한 도구가 하나 있습니다. 요소를 마우스 오른쪽 버튼으로 클릭하면 "요소 코드 보기" 항목 중 하나인 컨텍스트 메뉴를 불러올 수 있습니다.

그 덕분에 요청에 사용될 주소를 얻을 수 있었습니다. 그림 7.

POST 요청

간단한 Get 요청과 달리 POST http 요청에는 일반 텍스트처럼 저장할 수 있는 텍스트 본문이 있습니다. 텍스트 형식, 확장자가 xml, Soap, json인 파일 형식입니다. 특정 요청의 실행을 디버깅하고 모니터링할 수 있는 요청 텍스트를 생성하기 위한 도구가 네트워크에 많이 있습니다.

1C에서는 특정 텍스트로 요청을 시작하기 위해 HTTP 요청 객체에 SetBodyFromString 프로시저가 있습니다.