1C 웹 서비스 운영 계획. 웹 서비스. 웹 서비스를 통한 기능 제공


이 기사의 목적– WEB 서비스가 1C에서 "어떻게" 구성되어 있는지 이해하고 "메커니즘이 작동하는 방식"과 "어떤 작업에 대해" 이러한 메커니즘을 사용하는 것이 합리적인지 이해하는 데 도움이 됩니다.

기사의 특징그것은:

  • 1C, WEB(php), 모바일(Ios, Android) 애플리케이션을 통합할 때 사용할 수 있는 다양한 방법과 기법을 고려(비교)합니다.
다른 방법들장단점이 있으므로 특정 작업에 대해 가장 간단하고 컴팩트한 것을 선택하는 것이 합리적입니다.
  • 동시에 1C 측과 웹 서버(PHP) 측 모두에서 솔루션의 예가 제공됩니다.
솔루션의 예는 영역 교차점에서 일하는 1C 프로그래머와 웹 전문가 모두에게 유용할 수 있습니다.
  • 필요한 모든 정보가 함께 수집되었습니다 ( 단계별 지침) "빠른 시작"을 하고 개발을 시작합니다. 즉, WEB 서버, 창, "싸움"을 연구하고 구성하는 데 많은 시간을 낭비하지 않기 위해서입니다. 시스템 오류등.
기사의 주소는 다음과 같습니다.
  • 1C: 웹 서비스 기술을 사용하여 통합을 연구하는 프로그래머 및 WEB 전문가;
  • 디자이너와 IT 분석가는 프로젝트를 만들 때 '본질'을 이해하고 합리적인 기술 선택을 해야 합니다.
소개 부분을 마치며 이미 COM/Ole 기술 작업 경험이 있다면 WEB 서비스 기술을 이해하는 데 도움이 될 것입니다.

1.1 기술 기능, 1C 플랫폼 지원

1.2 클라이언트-서버 상호작용 작업을 위한 기술의 적용 가능성.


2. 빠른 시작. 어디서부터 시작해야 할까요?


포인트 번호 0.
우선, 통합 기술을 선택(결정)하고 "본질", 즉 작동 방식을 이해해야 합니다.
즉, 다음 두 가지 질문에 답해야 합니다.

  • 클라이언트 역할을 하는 1C 데이터베이스(또는 기타 프로그램)와 서버 역할을 하는 프로그램
클라이언트가 될 것과 서버가 될 것을 결정할 때 다음을 사용할 수 있습니다. 간단한 규칙: 클라이언트는 서버를 "호출"(제어)할 수 있지만 콜백은 불가능합니다.
  • 귀하에게 가장 적합하고 사용될 클라이언트-서버 상호 작용 기술은 무엇입니까?
위에서 기술 선택에 대한 권장 사항을 설명했습니다.

포인트 1번.
따라서 클라이언트-서버 상호 작용의 "본질"이 이해됩니다. 상호작용 기술이 결정되었습니다. 이제 개발이 진행될 "테스트 그라운드"를 만들어야 합니다.

이 기사에서는 예제를 사용하여 두 가지 기술에 대해 설명합니다.

웹 서비스 메커니즘으로 작업합니다.

1C 8 및 PHP의 작업 예가 고려됩니다.

http 요청 메커니즘(REST 웹 서비스)으로 작업합니다.

1C 8 및 PHP의 작업 예도 고려됩니다.
WEB 개발과 관련된 작업에서는 전통적으로 다음이 허용됩니다.

  • 프로그래머의 로컬 웹 서버(localhost)에서 개발 및 디버깅을 위한 "테스트 그라운드"를 만듭니다.
  • 개발이 완료된 후 결과는 "전투" 웹 서버로 전송되어야 합니다.

실제로(특히 WEB 서비스 기술에 대해 "익숙해지기" 시작할 때) "테스트 장"을 만들 때뿐만 아니라 프로젝트를 "전투" 서버로 전송할 때 많은 "갈퀴"가 발생합니다.

따라서 설정과의 "싸움"에 많은 시간을 "낭비"하지 않기 위해 IIS(인터넷 정보 서버) / 서버 마스터링 아파치및 권한 설정 윈도우 액세스, 다음을 권장합니다.

  • (1) 로컬 작업 컴퓨터에 "Polygon"을 만듭니다. 운영 체제 - Windows 7(Professional 또는 최대). 모든 작업은 아래에서 수행되어야 합니다. 계정관리자.
  • (2) 클라이언트-서버 모드로 1C 8 데이터베이스 배포(MS SQL 서버, 2008 R2를 권장합니다). 클라이언트-서버 모드에서 1C 8을 사용하면 추가 작업을 수행할 필요가 없습니다. 웹 서버에서 1C 데이터베이스에 대한 액세스 권한 설정.
  • (3) 설치 IIS, 누락된 경우. Windows에서는 정기적으로 "다시 설치"할 수 있습니다.

IIS 구성 요소의 설치 옵션에 대한 확인란은 기본적으로 설정될 수 있습니다.
주의해야 할 필수 사항은 다음 옵션입니다(ISAPI 확장 - 웹 서비스에서 비누 연결이 작동하는 데 필요하고 CGI - PHP가 작동하는 데 필요함).

설치가 완료된 후 IIS제대로 작동하는지 확인해 보겠습니다. 이를 위해, 주소 표시 줄웹 브라우저에 입력:

(4) WEB 서버에 1C 데이터베이스 게시(연결).

그래서 웹서버는 IIS설치하고 작동 중입니다. 1C 데이터베이스를 게시하고 이제 웹 클라이언트를 통해서도 이에 대한 액세스가 가능한지 확인해 보겠습니다.

관리되는 애플리케이션(씬 클라이언트) 모드에서 작업을 제공하는 1C 데이터베이스를 웹 서버에 게시하는 것이 좋습니다.

1C 데이터베이스 게시는 다음과 같이 수행됩니다.
구성 모드에서는 "웹 서버에 게시" 항목을 호출해야 합니다.

b) 출판 매개변수를 지정합니다:

즉, 디렉터리(폴더)에 wwwroot너의 그의 IIS 1C 데이터베이스를 게시하려면 별도의 폴더(디렉토리)를 만들어야 합니다.

IIS가 설치되면 wwwroot 디렉터리가 자동으로 생성됩니다.
이러한 폴더(wsBase10)를 만들고 선택하고 게시 이름을 지정합니다(wsBase10이라고도 함).

갑자기 답장이 온다면,

그렇다면 두려워하지 마십시오.

1C 게시 메커니즘은 매우 변덕스럽습니다. '게시'를 다시 클릭해 보세요.

결과적으로 메시지를 받으면,

그것은 모든 것이 작동했다는 것을 의미합니다.

1C 데이터베이스 및 해당 웹 서비스를 "전투"서버(예: Windows 2008 R2)에 게시할 때 웹 서버를 사용하기로 결정하면 오류가 자주 발생한다는 점을 이해하는 것이 매우 중요합니다. IIS.

조언: "전투" 서버에 설치하지 마세요 IIS! 설치하다 아파치.

이렇게 하면 많은 시스템 오류로부터 사용자를 보호할 수 있습니다. 그리고 게시(재게시 - 구성 변경 포함)는 다음에 대해 수행됩니다. 아파치 vrd 파일 및 설정을 수정할 필요 없이 원활하게 IIS.

이 기사에서는 설치 프로세스와 아파치 설정. 이 주제에 대한 다른 출처가 있습니다.

그러나 협업을 위해서는 아파치 1C 데이터베이스(및 웹 서비스)에는 알아야 할 몇 가지 매우 중요한 요구 사항이 있습니다(이를 시스템 관리자에게 가져가십시오).

1. 설치시 아파치 ISAPI 확장에 대한 지원을 활성화해야 합니다.

2. PHP로 작업할 경우 cgi-bin 지원을 활성화하십시오.

3. 1C 데이터베이스에 특별한 "사용자"를 입력해야 합니다...

이 사용자는 인증을 받아야 합니다. 운영 체제. 그리고 이름이 시작된 사용자를 지정해야 합니다. 아파치.

... 아파치는 끝났고 다시 "다각형"으로 돌아가겠습니다.

여기에서 볼 수 있습니다. 1C가 시작됩니다. 1C와 함께 WEB 서버가 작동 중입니다.
4. WINDOWS용 PHP 서비스를 설치합니다.

작업의 일부로 PHP에서 클라이언트(1C에 액세스하기 위한 웹 페이지) 또는 서버(1C의 http 요청을 처리하기 위한 시나리오)를 개발해야 하는 경우 이 기능이 필요합니다.

5 PHP 스크립트가 실행될 IIS에 wsClient10 디렉터리를 추가해 보겠습니다.

우리가 사용할 PHP 스크립트는 다음과 같습니다:

  • 1C WEB 서비스를 개발할 때 클라이언트 부분을 생성합니다.
  • 서버 부분 개발을 위해 REST 웹 서비스(http 요청) 개발 시.

6. Notepap++ 프로그램을 설치해 보겠습니다. 이 컴팩트하고 편리한 프로그램 PHP 스크립트를 편집하는 데 사용하는 것이 좋습니다.

Notepad++를 설치한 후 PHP가 작동하는지 즉시 확인합니다. 이를 위해 간단한 hello.php 스크립트를 만들어 보겠습니다. 이를 wsClient 디렉터리에 배치하고 브라우저에서 스크립트를 실행해 보겠습니다.

다 괜찮아. PHP가 작동 중입니다. 테스트 사이트가 완전히 준비되었습니다.

3. 웹 서비스, SOAP 요청, XDTO 및 JSON 생성. 예제 1C 및 PHP. 이 단계에서는 “Polygon”이 준비되어야 하며 WEB 서비스 개발을 시작할 수 있습니다.

- 이 기술을 어디서부터 연구해야 할까요? 물론 “안녕하세요”와 같은 고전적인 문제도 포함됩니다!

1. 가장 단순한 것을 만드는 작업 웹 서비스. 1C와 PHP의 예를 살펴 보겠습니다..

1.1. 데이터베이스(wsBase10)에 웹 서비스 "_Calculations by Tariffs"를 추가해 보겠습니다.

발행물 파일 이름을 "calcOrder10.1cws"로 설정하겠습니다. URI 네임스페이스도 지정해야 합니다. 원칙적으로 임의의 이름을 지정할 수 있습니다.

1.2. 웹 서비스 "_Calculations by Tariffs" 내에 "getHello" 작업을 추가해 보겠습니다.

작업의 본질은 가장 간단합니다. 세 개의 매개변수(문자열, 숫자)를 입력(클라이언트로부터)으로 취하고 통합 문자열을 그에게 반환합니다(결과적으로). 반환 값 유형은 기본 문자열입니다.

작업이 1C 데이터베이스 자체의 데이터를 변경하지 않으므로 "거래 중"확인란을 선택하지 않습니다.

작업이 1C 데이터베이스의 데이터를 변경한 경우 이 상자를 선택하는 것이 좋습니다.
들어오는 데이터를 처리하고 결과를 반환하는 메서드(함수)의 이름은 "getHello"입니다.

1.3. "getHello" 작업에 대한 수신 매개변수를 추가해 보겠습니다.

전송 방향은 "입력"입니다. 즉, 클라이언트에서 서버로 전송됩니다.

1.4. 웹 서비스 모듈에서 "getHello" 작업을 위한 핸들러를 작성해 보겠습니다.
///////////////////

함수 getHello(strParametr, floatParametr, IntegerParametr)
strParametr+string(floatParametr+integerParametr)을 반환합니다.
EndFunction

////////

1.5. 이제 간단한 WEB 서비스를 만드는 작업이 완료되었습니다. 이제 WEB 서비스 "_Calculations by Tariffs"를 게시해야 합니다.

테스트 사이트에 웹 서비스를 게시하기 전에 우리는 사용자 목록에서 모든 사용자를 제거합니다. 정보 기반. 즉, 사용자 목록을 "비어 있음"으로 만듭니다.

- 왜 이러는 걸까요?

테스트 사이트에서는 개발자만이 WEB 서비스에 연결할 수 있으므로 WEB 서비스에 연결할 때 사용자 인증을 제공하는 것은 의미가 없습니다.

즉, 테스트 사이트에서 WEB 서비스 작업을 의도적으로 단순화하겠습니다.

연결을 설정할 때 로그인과 비밀번호를 지정할 필요가 없습니다.
하지만 "전투" 서버에서는 물론 인증을 제공해야 합니다.
(앞서 말한 것처럼) 이렇게 하려면 "전투" 데이터베이스에 웹 서버 자체가 시작될 사용자를 별도로 생성해야 합니다. 그런 다음 WEB 서비스(Soap 연결)와의 연결을 설정할 때 이 사용자의 로그인 및 비밀번호도 지정해야 합니다.

1.6. 이제 웹 서비스를 게시해 보겠습니다.

“웹 서버에서 운영 체제 인증 사용” 확인란을 선택할 필요는 없습니다. 왜냐하면 이 모드 WEB 서버에만 제공 IIS, 그리고 "전투" 서버에서는 작동합니다 아파치.

1.7. 클라이언트 부분을 생성하고 WEB 서버의 작동을 테스트해 보겠습니다.

ㅏ) 먼저 1C에서 클라이언트 호출을 해보자.

간단하게 해보자. 귀하가 보유하고 있는 다른 1C 데이터베이스에서 우리는 외부 처리. 이 처리에서는 WEB 서비스에 연결하고 "getHello" 작업을 사용하여 거기에 매개변수를 전달하고 서버로부터 응답을 받습니다.
"1C"의 코드는 다음과 같습니다.

/////

&On클라이언트
절차 Query10 실행(명령)
// 핸들러의 내용을 삽입합니다.
LineResult = SERVER_ExecuteWSQuery10();
경고(StringResult);
절차 종료
&컨텍스트 없이서버에서
함수 SERVER_RunWSRequest10()
// 테스트 사이트에서는 인증을 진행하지 않습니다!
사용자 이름 = 정의되지 않음;
비밀번호 = 정의되지 않음;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",사용자 이름,비밀번호);
Proxy.User = 사용자 이름;
Proxy.Password = 정의되지 않음;
strResult = Proxy.getHello("Ivanov",100.35,20);
strResult를 반환합니다.
EndFunction ///////////////////////////////////////////////////////////////////////////////////////

SERVER_ExecuteWSRequest10() 함수의 작동을 테스트해 보겠습니다.

좋아요. 공장!
비) 이제 PHP에서 웹 서비스에 대한 클라이언트 호출을 만들어 보겠습니다.
PHP 스크립트 코드는 다음과 같습니다:

/
//////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // 1. 불필요한 메시지 비활성화
// 2. SOAP에 대한 캐싱을 비활성화합니다. 이것이 완료되지 않으면,


// 3. 비누 연결 설정
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
정렬(
"login" => null, //로그인, 인증을 수행하지 않습니다.
"password" => null, //비밀번호
"추적" => 사실,
"기능" => SOAP_USE_XSI_ARRAY_TYPE,
//"압축" =>
);
// 4. 전달된 매개변수의 배열 채우기
$params["strParametr"] = "test_Soap10:";
$params["floatParametr"] = 10.34;
$params["integerParametr"] = 12;
// 5. getHello 작업 수행
$result = $client->getHello($params);
// 6. 결과를 화면에 표시
var_dump($result);
?>

////
///

브라우저에서 스크립트를 호출하고 작동을 확인해 보겠습니다.

모든 것이 괜찮습니다. 웹 페이지에서 1C를 호출하면 작동합니다!

몇 가지 결과를 요약해 보겠습니다.
단순한 WEB 서비스의 문제점이 해결되었습니다. 이제 더 복잡한 웹 서비스 생성을 시작할 수 있습니다.

그리고 복잡한 점은 (지금까지) 우리가 원시 데이터 유형으로만 작업했다는 것입니다. 물론 객체(집합) 데이터 유형도 전송/수신해야 합니다.

2. XDTO 패키지를 이용하여 WEB 서비스를 생성하는 작업입니다.

이전과 마찬가지로 1C와 PHP의 예를 살펴보겠습니다.

다음 작업을 설정해 보겠습니다.웹 서비스는 문자열이 아니라 객체 데이터("값 테이블")를 반환해야 합니다(보다 정확하게는 객체 배열이 됩니다!).

다양한 데이터 구조(웹 서버로 수신/전송할 때 필요함)를 설명하기 위해 1C:8 플랫폼은 XDTO 패키지에 대한 메커니즘을 제공합니다.

저것들. 먼저 필요한 모든 데이터 유형을 설명한 다음 다음을 나타냅니다.

  • 웹 서비스와 함께 작동할 수 있는 XDTO 패키지(패키지 하나 또는 목록을 지정할 수 있음)
  • 작업의 각 매개 변수와 반환 결과에 대해 XDTO 패키지의 데이터 유형을 지정할 수 있습니다.
다음으로, 서버로부터 특정 "요금표"를 수신하는 예를 사용하여 XDTO로 작업하는 방법을 살펴보겠습니다.

tzTariffs 유형의 데이터를 반환하는 GetTzTariffs_0 작업을 만들어 보겠습니다.

그림은 tzTariffs에 el 객체가 무제한 포함되어 있음을 보여줍니다. 실제로 tzTariffs는 el 유형의 객체 테이블입니다.

- 어떻게 볼 수 있나요?

  • "최대" 매개변수가 "-1"로 지정되면 이러한 객체의 수는 제한되지 않습니다(행 수가 무제한인 테이블).
  • 테이블은 필요하지 않고 구조(1행)만 필요한 경우 최대값과 최소값을 "1"로 지정해야 합니다.
  • el 객체는 객체 유형 속성(eTariff)과 기본 유형 속성(cPrice, comment)을 포함하는 구조입니다.

계층 구조 아래로 이동하면 관세 유형이 구조(최대 및 최소 수량 = 1)이며 세부 정보 중 하나에 kindOfTariff 유형이 포함되어 있음을 알 수 있습니다.

총: XDTO 패키지를 사용하면 웹 서비스와 상호 작용할 때 추가로 사용될 데이터 유형의 계층 구조를 명확하게 설명할 수 있습니다.

팁: 복잡성을 피하고 디자인 오류를 방지하려면 웹 서비스에 하나의 XDTO 패키지를 사용하는 것이 좋습니다.
다음으로 넘어가겠습니다... 이후:

  • XTDO 패키지가 생성되었습니다.
  • 모든 데이터 유형이 설명됩니다.
  • WEB 서비스의 경우 이 패키지의 사용이 표시됩니다.
  • 매개변수 및 작업 결과에 대해 적절한 유형이 선택됩니다(XDTO 패키지에서).
그런 다음 데이터로 객체(구조, 구조 배열)를 "채우는" 단계로 넘어갈 수 있습니다.

이 예에서 GetTzTariffs_0 작업은 Tariffs 개체가 포함된 문자열 배열을 반환해야 합니다.

////////////////

함수 GetTzTariffs_0()
// 핸들러의 내용을 삽입합니다.
GetTZTariffs_0()을 반환합니다.
EndFunction

함수 GetTZTariffs_0()


// 기술 사양 작성
// 첫 번째 줄

kindOfTariff.active = 거짓;


관세.종류 = 종류의관세;

elementTZ.eTariff = 관세;
elementTZ.cPrice = 100;

//
// 두 번째 줄
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);

관세 = FactoryXDTO.Create(tariffType);
관세.begdate = CurrentDate();
관세.종류 = 종류의관세;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = 관세;
elementTZ.cPrice = 200;
// 테이블에 두 번째 행을 추가합니다.
tzTariffs.el.Add(elementTZ);
tzTariff를 반환합니다.
EndFunction

//////////
다음으로 클라이언트 측 1C에서 "GetTzTariffs_0" 작업을 호출하는 예를 제공합니다.

&On클라이언트
절차 Query20 실행(명령)
// 핸들러의 내용을 삽입합니다.
경고(SERVER_ExecuteWSQuery20());
절차 종료
&컨텍스트 없이서버에서
함수 SERVER_ExecuteWSRequest20()
정의 = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definitions,"www.URI.com","_관세별 계산","_TariffsSoap별 계산");
XDTResult = Proxy.GetTzTariffs_0();
// 인덱스 0의 라인에 액세스한 다음 eTariff 속성, 중첩된 속성 종류, 중첩된 속성 이름에 액세스하겠습니다.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PHP에서의 유사한 호출 및 XDTO 결과 처리는 다음과 같습니다.
////////////////////////////////////////////////////////////////////////////////////



// 웹 서비스 기능이 제대로 작동하지 않습니다.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
$result = $client->GetTzTariffs_0();
$mResult = $result->return->el;
// mResult - 객체의 배열입니다. 배열의 요소를 살펴보고 결과를 화면에 표시해 보겠습니다.
($i=0; $i에 대해 {
에코 "
";
$eTariff = iconv("utf-8","cp1251",$mResult[$i]->eTariff->fullName);
var_dump($eTariff);
$cPrice = $mResult[$i]->cPrice;
var_dump($cPrice);
$cComment = $mResult[$i]->cComment;
var_dump($cComment);
에코 "
";
}
?>

//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

지금 작업을 더욱 복잡하게합시다. 동일한 객체 데이터 유형을 클라이언트에서 웹 서비스로(매개변수로) 전송해 보겠습니다. tzKind로 놔두세요.
이를 위해 먼저 dataTariffs 패키지에서 이 유형을 설명한 다음 GetTzTariffs_1 작업을 추가합니다.

tzKind 매개변수의 유형을 표시해 보겠습니다.

웹 서비스가 수신 XDTO 매개변수와 작동하는 방식의 예:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

함수 GetTZTariffs_1(tzKind)
tzTariffsType = FactoryXDTO.Type(" ", "tzTariffs");
tzTariffs = FactoryXDTO.Create(tzTariffsType);
elementTZType = FactoryXDTO.Type(" ", "elementTZ");
관세 유형 = FactoryXDTO.Type(" ", "관세");
kindOfTariffType = FactoryXDTO.Type(" ", "kindOfTariff");
// 기술 사양 작성
// 첫 번째 줄
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "교통수단";
kindOfTariff.active = 거짓;
관세 = FactoryXDTO.Create(tariffType);
관세.fullName = "관세 1";
관세.begdate = CurrentDate();
관세.종류 = 종류의관세;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = 관세;
elementTZ.cPrice = 100;
elementTZ.comment = "관세 1 설명";
// 테이블에 첫 번째 행을 추가합니다.
tzTariffs.el.Add(elementTZ);
// 두 번째 줄
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "배송";
kindOfTariff.active = true;
관세 = FactoryXDTO.Create(tariffType);
관세.fullName = "관세 2";
관세.begdate = CurrentDate();
관세.종류 = 종류의관세;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = 관세;
elementTZ.cPrice = 200;
elementTZ.comment = "관세 2 설명";
// 테이블에 세 번째 행을 추가합니다(들어오는 데이터로 채웁니다).
tzTariffs.el.Add(elementTZ);
// 세 번째 줄
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
관세 = FactoryXDTO.Create(tariffType);
관세.fullName = "관세 3";
관세.begdate = CurrentDate();
관세.종류 = 종류의관세;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = 관세;
elementTZ.cPrice = 300;
elementTZ.comment = "관세 3 설명";
// 테이블에 세 번째 행을 추가합니다.
tzTariffs.el.Add(elementTZ);
tzTariff를 반환합니다.
EndFunction

//////////////////////////////////////////////////////////////////////////////////
1C 클라이언트 측에서는 tzKind 유형의 데이터를 준비하고 이를 WEB 서비스로 전송해야 합니다.

다음은 이러한 호출의 예입니다.
/////////////////////////////////////////////////////////////////////////////////

&On클라이언트
절차 Query30 실행(명령)
// 핸들러의 내용을 삽입합니다.
경고(SERVER_ExecuteWSQuery30());
절차 종료
&컨텍스트 없이서버에서
함수 SERVER_ExecuteWSRequest30()
정의 = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definitions,"www.URI.com","_관세별 계산","_TariffsSoap별 계산");
// WS에 전달된 매개변수 테이블을 생성합니다.
tzKindType = Proxy.FactoryXDTO.Type(" ", "tzKind");
tzKind = Proxy.FactoryXDTO.Create(tzKindType);
kindOfTariffType = Proxy.FactoryXDTO.Type(" ", "kindOfTariff");
kindOfTariff = Proxy.XDTO Factory.Create(kindOfTariffType);
kindOfTariff.name = "테스트 관세 유형";
kindOfTariff.active = 거짓;
elementKindType = Proxy.FactoryXDTO.Type(" ", "elementKind");
elementKind = Proxy.XDTO Factory.Create(elementKindType);
elementKind.eKind = kindOfTariff;
요소종류.qty = 10;
// 테이블에 행 추가
tzKind.el.Add(elementKind);
XDTOResult = Proxy.GetTzTzriffs_1(tzKind);
예제Result_관세 유형의 이름 = XDTOResult.el.eTariff.kind.name;
관세 유형의 exampleResult_Name을 반환합니다.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
디자인에 주목하고 싶습니다: Proxy.FactoryXDTO.Type("...

즉, 클라이언트에서 XDTO 패키지 개체를 생성할 때 자체 XDTO!팩토리에 액세스하지 않고 프록시를 통해 액세스해야 합니다. 즉, XDTO 서버 팩토리입니다.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
이제 질문을 할 시간입니다.XDTO 객체에 대한 대안이 있습니까? ?

XDTO 팩토리와 전혀 "통신하지 않음", 다른 방법으로 WEB 서비스에서 전송/수신이 가능합니까? (특히 클라이언트가 1C가 아니지만 예를 들어 WEB 페이지, Android, iOS의 애플리케이션인 경우) , 등.).

정답은- 그래 넌 할수있어!
예를 들어 문자열을 매개변수 유형으로 사용할 수 있습니다. 그리고 데이터 구조를 그 안에 "패킹"(직렬화)합니다.

웹 프로그래밍에서 이 기술은 오랫동안 개발되어 왔으며 JSON이라고 불립니다.
PHP에서는 모든 구조/배열 문자열의 패킹/추출이 한 단계로 완료된다는 점도 큰 도움이 됩니다!
JSON으로 객체를 패키징하는 PHP의 예/추출, 웹 서비스로의 전송/수신:

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

// mDelivery 배열을 문자열로 직렬화하고 이를 전달 매개변수에 배치합니다.
// * 먼저 전달 구조를 설명하겠습니다.
수업 전달(
var $id;
var $checked;
var $값;
}
// 일부 데이터로 구조를 채웁니다.
$sDelivery = 새 배송;
$sDelivery->id = "000000005";
$sDelivery->확인됨 = TRUE;
$s배달->값 = 0;
// mDelivery 객체 배열에 추가합니다.
$mDelivery = $s배송;
// mDelivery 배열을 JSON 문자열로 변환하고 결과를 전달 매개변수에 넣습니다.
$params["delivery"] = json_encode($mDelivery);
// 웹 서비스에서 ExitCalcOrder 작업을 호출하고 여기에 매개변수를 전달합니다(문자열 - 전달).
$result = $client->ExitCalcOrder($params);
// ExitCalcOrder 작업의 결과를 jsCalcResult 변수(문자열)로 가져옵니다.
$jsCalcResult = $result->return;
// 역변환을 수행합니다: jsCalcResult 문자열에서 객체(객체 배열, 유형 일치) arrCalcResult로
$arrCalcResult = json_decode($jsCalcResult);
// arrCalcResult 객체에 대한 정보를 화면에 표시합니다.
var_dump($arrCalcResult);

////////////////////////////////////////////////////////////////////////////////

하지만 1C에서 JSON 변환을 수행하는 방법은 무엇입니까?
1C 8 플랫폼은 JSON 표준을 지원하지 않지만 이는 문제가 되지 않습니다.
JSON 변환/추출 처리가 존재하고 사용 가능하며 훌륭하게 작동합니다.
// 저작권 © 2010-2012 Alexander Pereverzev
// 1C:JSON . JavaScript 객체 표기법 파서 및 직렬 변환기.

따라서 이 처리를 구성에 넣으면 정방향 및 역방향 JSON 변환을 쉽게 수행할 수 있습니다.
직렬화 예 1C 객체를 JSON 문자열로:

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

CargoData = 새로운 구조;
CargoData.Insert("코드",CargoCode);
CargoData.Insert("번호",화물번호);
CargoData.Insert("계획", QuantityPlan);
CargoData.Insert("character",CargoCharacter);
CargoData.Insert("포장", 포장);
CargoData.Insert("damage",포장 손상);
CargoData.Insert("체적",체적);
CargoData.Insert("무게",무게);
CargoData.Insert("상태",상태);
jsResult = JSON.WriteJSON(LoadData); //결과를 JSON으로 변환
jsResult를 반환합니다.

예시 추출 JSON 문자열의 1C 객체:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. JSON에서 객체 복원
JSON = 프로세스.JSON.Create();
mdelivery = JSON.ReadJSON(배달);
// 결과적으로 mdelivery는 배열입니다. 배열 요소 - 일치합니다.
// 예를 들어 mdelivery.["id"]에는 "000000005"가 포함됩니다.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
결론적으로 PHP에서 1C 웹 서비스를 호출하여 PHP 개체로 역변환된 JSON 구조를 반환받는 예를 제시하겠습니다.

변화에 주목하자 iconv("cp1251","utf-8","
및 iconv("utf-8","cp1251", 키릴 문자 문자열을 cp 1251 인코딩에서 utf -8로 변환하거나 그 반대로 변환하려면 (PHP - 1 C와 상호 작용할 때) 필요합니다.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // 메시지 비활성화
// SOAP에 대한 캐싱을 비활성화합니다. 이것이 완료되지 않으면,
// 웹 서비스 기능이 제대로 작동하지 않습니다.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/wsQuery.1cws?wsdl ");
$params["fname"] = iconv("cp1251","utf-8","dataFreight");
$params["param1"] = iconv("cp1251","utf-8",$_GET["code"]);
$params["param2"] = iconv("cp1251","utf-8",$_GET["number"]);
$result = $client->executeQuery($params);
$jsResult = $result->return;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////

가능한 시나리오는 다음과 같습니다. 일부 프로그램(예: 웹 사이트, 모바일 애플리케이션 등)의 원격 사용자가 귀하의 웹 서비스를 호출했지만... 결과를 받지 못했습니다.. 또는 결과를 받았지만 뭔가 잘못되었습니다.

질문: - 이러한 오류를 확인하고 웹 서비스를 디버깅하는 방법은 무엇입니까?
로그를 사용하여 오류를 모니터링하는 것이 좋습니다(그리고 "웹 서비스에 오류를 일으킨 요인").

저것들. 논리적 오류가 발생할 수 있는 위치에서 등록 로그(LogRecord)에 들어오는 매개변수에 대한 정보를 프로그래밍 방식으로 저장합니다.

"런타임 오류"로 인해 "어려움을 겪는" 경우 이를 가로채고(시도는 예외임) 전체 상황을 "포인트별로" 기록할 수 있습니다.

결과적으로 로그를 사용하면 오류에 대한 정보를 확인하고, 발생 매개변수를 재현하고, 디버거의 대화형 모드에서 오류를 "무시"할 수 있습니다.

요약해보자: 1C 및 PHP의 웹 서비스 작업 예가 고려됩니다. 클라이언트와 서버 간에 객체 데이터 구조를 전송하기 위해 우리는 두 가지 기술을 사용했습니다.

  • (1) XDTO 패키지
  • (2) JSON 객체.

4. 대안 - REST 웹 서비스(http 요청). 1C 및 PHP 구현의 예.
이전 섹션에서는 WEB 서비스의 기술에 대해 자세히 살펴보았습니다. 이 섹션에서는 소위 대체 기술을 고려할 것입니다. REST 웹 서비스.

공정한 질문이 생깁니다. -왜?

웹 서비스는 모든 기능을 갖추고 있으며 복잡한 문제를 해결할 수 있습니다.

"이유"를 이해하기 위해 이러한 기술 간의 기본적인 차이점을 공식화해 보겠습니다.

WEB 서비스의 기술은 다음 2가지 사항을 기반으로 합니다.

  • (1) SOAP 연결이 사용됩니다.. 즉, SOAP 요청이 이루어집니다.
"1C" 비누에서는 연결이 다음과 같이 형성됩니다.
/////////////////////////////////////////////////////////////////////////////////////////

정의 = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl",UserName,Password);
Proxy = new WSProxy(Definitions,"www.URI.com","_관세별 계산","_TariffsSoap별 계산");

/////////////////////////////////////////////////////////////////////////////////////////

PHP에서는 다음과 같습니다:

/////////////////////////////////////////////////////////////////////////////////////////

$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
정렬(
"로그인" => 로그인, //로그인,
"password" => 전달, //비밀번호
"추적" => 사실,
"기능" => SOAP_USE_XSI_ARRAY_TYPE,
//"압축" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);

/////////////////////////////////////////////////////////////////////////////////////////

  • (2) 서버 모드에서 SOAP 연결을 처리하기 위해 1C 8 플랫폼은 특수 메타데이터 개체 WEB 서비스를 제공합니다.

또한 작업에서 "1C"가 서버 역할을 해야 하는 경우 1C WEB 서비스 기술에 대한 대안이 없습니다.

- 대체 언제 가능한가?

  • 첫째, 1C가 클라이언트로만 작동하는 경우;
  • 둘째, 작업해야 하는 서버(예: 웹 사이트 또는 일종의 WEB 애플리케이션)에서는 SOAP 연결을 지원할 계획이 없습니다.
- SOAP 연결에 대한 어떤 대안이 가능합니까?

매우 인기있는 옵션 - http 연결.

웹 기반 시스템(PHP, Android, iOS)에서는 SOAP 요청보다 http 요청을 사용하는 것이 더 쉽습니다. 그다지 복잡하지 않은 프로젝트의 경우 http 요청 기술이 매우 적합합니다.

http 요청 방법을 사용하는 고전적인 솔루션은 1C 데이터베이스와 웹 사이트를 통합하는 작업입니다. 예를 들어 제품 범위 및 가격에 대한 정보가 사이트로 전송되고 수락된 주문에 대한 정보가 사이트에서 다시 전송됩니다.

일반적인 1C 구성에서는 http 요청을 사용하여 사이트와의 통합이 구현되는 것이 일반적입니다.
그럼 기술을 살펴볼까요? http 요청예를 들어 1C(클라이언트, 1C 8)와 웹 사이트(PHP, 서버) 간의 상호 작용.

1. http 요청에서 매개변수를 전달하기 위한 연결 및 방법 설정

1C 측에서 서버에 연결을 설정하는 예:
/////////////////////////////////////////////////////////////////////////////

보호됨 = 거짓;
HTTPConnect = new HTTPConnect("localhost/wsClient10/json/testHTTPQuery11.php", 보호됨);

////////////////////////////////////////////////////////////////////////////
아시다시피 http 프로토콜을 통해 클라이언트에서 서버로 매개변수를 전송하는 방법에는 두 가지가 있습니다.

(1) "get" 메소드;

매개변수(예: 이름 및 비밀번호)는 서버 호출 URL에 직접 지정됩니다.

즉, 스크립트에 대한 대화형 호출(웹 브라우저에서 직접)은 다음과 같습니다.

1C:8에서는 프로그래밍 방식으로 서버를 호출하고 Get 메서드의 매개 변수를 서버에 전달하기 위해 "Get" 메서드가 제공됩니다.

예:
보호됨 = 거짓;
HTTPConnect = new HTTPConnect("localhost", 보안);
HTTPConnect.Get("wsClient10/json/testHTTPQuery11.php?nameVasya&password=123",OutputFileName);

여기서 OutputFileName: 서버에서 반환된 데이터가 저장되는 파일의 이름입니다.
즉, 요청을 처리한 결과, 서버는 결과를 1C로 반환하고 그 결과를 포함하는 파일이 (자동으로) 생성됩니다.

따라서 이후에는 "1C"에서 이 파일을 (프로그래밍 방식으로) 읽고 그 결과를 추출해야 합니다. 그게 다야.

(2) "포스트" 방법;

이 옵션에서는 매개변수가 URL에 배치되지 않고 http 연결 본문에 별도로 전송됩니다.

이 방법의 주요 한계는 분명합니다. 얻다전송된 데이터의 양과 내용입니다. 즉, 도움을 받아 얻다문자만 전달할 수 있으며 URL 문자열의 길이는 제한되어 있습니다.

방법 우편다양한 콘텐츠의 데이터를 전송할 수 있습니다. 그리고 임의의 파일.
따라서, 우편통합 작업의 경우 더 기능적이며 계속해서 작업할 것입니다.

1C와 WEB 사이트 간 데이터 송수신을 위해 텍스트 파일을 사용합니다.
그리고 이미 우리에게 친숙한 JSON 기술을 사용하여 파일에서 데이터를 "압축/추출"할 것입니다! 이렇게 하면 1C 측과 PHP 측에서 파일을 "파싱"할 필요가 없어집니다.

서버를 호출하고 "post" 메소드를 사용하여 매개변수를 전송하기 위해 1C:8은 SendForProcessing 메소드를 제공합니다.

그럼 측면에서 예를 들어 보겠습니다. 1C모든 처리 단계가 수행됩니다. http 요청:

먼저 실행 계획(확대)을 적어 보겠습니다.

이제 1C:8의 소프트웨어 구현이 완료되었습니다.

////////////////////

// 1. 전송된 데이터의 구조를 채웁니다.
postDataToPHP = 새 구조;
postDataToPHP.Insert("param1","ivanon");
postDataToPHP.Insert("param2","ivan");
postDataToPHP.Insert("param3","ivanovich");

// 2. 데이터를 JSON 문자열로 변환합니다.
JSON = 프로세스.JSON.Create();
jsPostDataToPHP = JSON.WriteJSON(postDataToPHP);


// 3. 임시 발신 메시지 생성(POST 메소드를 사용하여 서버로 전송)
// 파일에 JSON 문자열을 넣습니다.
tFile = 새 텍스트문서;
stringData = jsPostDataToPHP;
tFile.AddLine(stringData);


// 4. 임시로 보내는 파일의 이름을 가져옵니다. JSON 문자열 형식으로 나가는 데이터가 포함됩니다.
OutgoingFileName = GetTemporaryFileName(".txt");

tFile.Write(OutgoingFileName,TextEncoding.UTF);

// 5. 임시 입력 파일의 이름을 가져옵니다. JSON 문자열: PHP 서버 응답을 수신합니다.
InputFileName = GetTemporaryFileName(".txt");


// 6. 서버와의 HTTP 연결 설정
보호됨 = 거짓;
HTTPConnect = new HTTPConnect("localhost/wsClient10/json/testHTTPQuery10.php", 보호됨);


// 7. HTTP 요청을 실행해 보겠습니다. 나가는 파일을 서버로 전송해 보겠습니다(파일에는 JSON 개체, 즉 나가는 매개 변수가 포함되어 있습니다).


HTTPConnect.SendForProcessing(OutgoingFileName,"/json/",IncomingFileName);


// 그리고 서버(수신 파일)로부터 응답을 받게 됩니다. 파일에는 //JSON 객체(즉, 서버에서 반환된 데이터)가 포함되어 있습니다.

// 8. 들어오는 파일에서 서버로부터 받은 데이터를 추출합니다.
ResponseFile = 새 TextDocument;
ResponseFile.Read(InputFileName,TextEncoding.UTF);
json_Data = ResponseFile.GetString(1);
mData = JSON.ReadJSON(json_Data);


// 9. 사용자에게 수신된 데이터를 표시합니다.
Report(mData["v1"]);
Report(mData["v2"]);


// 10. 사용된(더 이상 필요하지 않은) 임시 파일을 삭제합니다.
삭제파일(보내는파일이름);
삭제파일(입력파일이름);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

그리고 마지막으로, 서버 측에서 요청을 처리하기 위한 PHP의 예:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. 수신 파일에서 문자열 데이터를 가져옵니다.
$json_filedata = file_get_contents("php://input");
// 2. 불필요한 부분을 모두 잘라냅니다(서비스 문자 2개 추가). 이는 // JSON 변환을 방해합니다.
$jsData = 트림(ltrim($json_filedata));
$dlinaStr = strlen($jsData);
$_jsData = "";
$i=1;
동안($i<$dlinaStr) {
만약 ($i>2) (
$_jsData = $_jsData.substr($jsData, $i, 1);
}
$i++;
}
// 3. JSON의 데이터를 객체(구조)로 변환합니다.
$mData = json_decode($_jsData);
// 4. 데이터로 채우고 // 1C로 돌아갈 또 다른 구조를 만들어 보겠습니다.
클래스 반환 데이터(
var $v1;
var $v2;
}
$sReturnData = 새로운 returnData;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. 구조 데이터를 JSON 문자열로 변환합니다.
$json_returnData = json_encode($sReturnData);
// 6. 데이터를 1C로 반환합니다. (출력 데이터는 파일로 리디렉션되고, 이 파일은 1C로 반환됩니다.)
에코 $json_returnData;
?>

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

그게 다야.컴팩트하고 기능적!

5. 수주업무(프로젝트 사례)

결론적으로 현재 고객이 가장 많이 요구하는 사항과 WEB 서비스 및 http 요청을 사용하여 해결되는 사항을 언급하겠습니다.

주제 제목이 정말 문제네요. 왜냐하면... 나 자신도 그것이 무엇인지 모르고 처음으로 이 기사의 틀 내에서 작업하려고 노력할 것입니다. 제가 보장할 수 있는 유일한 것은 아래에 제시된 코드가 작동할 것이라는 점입니다. 그러나 제 표현은 제가 이 모든 것을 어떻게 이해하는지에 대한 가정과 추측일 뿐입니다. 그럼 가자...

소개

웹 서비스라는 개념이 왜 탄생했는지부터 살펴봐야 합니다. 이 개념이 세상에 등장했을 때, 응용 프로그램이 원격으로 상호 작용할 수 있도록 하는 기술이 이미 존재했습니다. 즉, 한 프로그램이 다른 프로그램의 메서드를 호출하여 다른 도시나 국가에 있는 컴퓨터에서 실행할 수 있었습니다. 이 모든 것은 RPC(Remote Procedure Calling)로 축약됩니다. 예에는 CORBA 기술 및 Java - RMI(Remote Method Invoking)가 포함됩니다. 그리고 특히 CORBA에서는 모든 것이 좋은 것 같습니다. 왜냐하면... 어떤 프로그래밍 언어로든 작업할 수 있지만 여전히 부족한 부분이 있습니다. 나는 CORBA의 단점은 모든 방화벽을 통과할 수 있는 단순한 HTTP 대신 자체 네트워크 프로토콜 중 일부를 통해 작동한다는 점이라고 생각합니다. 웹 서비스의 아이디어는 HTTP 패킷에 삽입될 RPC를 만드는 것이었습니다. 그리하여 표준 개발이 시작되었습니다. 이 표준의 기본 개념은 무엇입니까?
  1. 비누. 원격 프로시저를 호출하기 전에 SOAP 형식의 XML 파일에서 이 호출을 설명해야 합니다. SOAP는 웹 서비스에 사용되는 많은 XML 마크업 중 하나일 뿐입니다. HTTP를 통해 어딘가로 보내려는 모든 것은 먼저 XML SOAP 설명으로 변환된 다음 HTTP 패킷에 담겨 TCP/IP를 통해 네트워크의 다른 컴퓨터로 전송됩니다.
  2. WSDL. 웹 서비스가 있습니다. 원격으로 메소드를 호출할 수 있는 프로그램입니다. 그러나 표준에 따르면 이 프로그램에는 "예, 맞습니다. 이것은 실제로 웹 서비스이며 여기에서 이러한 메서드를 호출할 수 있습니다."라는 설명이 수반되어야 합니다. 이 설명은 다른 형식의 다른 XML 파일, 즉 WSDL로 표시됩니다. 저것들. WSDL은 웹 서비스를 설명하는 XML 파일일 뿐이며 그 이상은 아닙니다.
왜 그렇게 짧게 물어보나요? 좀 더 구체적으로 말씀해주실 수 없나요? 아마도 가능할 것입니다. 그러나 이를 위해서는 T. Mashnin의 "Java Web Services"와 같은 책을 참조해야 합니다. 처음 200페이지 이상에는 SOAP 및 WSDL 표준의 각 태그에 대한 자세한 설명이 있습니다. 할 가치가 있나요? 제 생각에는 아니거든요. 왜냐면... 이 모든 것은 Java에서 자동으로 생성되며 원격으로 호출되는 메소드의 내용만 작성하면 됩니다. 그래서 JAX-RPC와 같은 API가 Java에 등장했습니다. 모르는 사람이 Java에 이런 API가 있다고 말하면 문제의 기술을 캡슐화하는 클래스 세트가 있는 패키지가 있다는 의미입니다. JAX-RPC는 시간이 지남에 따라 버전별로 발전하여 결국 JAX-WS가 되었습니다. WS는 분명히 WebService의 약자이며 요즘 인기 있는 전문 용어로 RPC의 이름을 바꾼 것일 뿐이라고 생각할 수도 있습니다. 이는 사실이 아닙니다. 왜냐하면 이제 웹 서비스는 원래 아이디어에서 벗어나 원격 메소드를 호출할 수 있을 뿐만 아니라 단순히 SOAP 형식으로 문서 메시지를 보낼 수도 있습니다. 아직 이것이 왜 필요한지는 모르겠지만 여기서는 "필요할 경우를 대비해"라고 답할 가능성은 낮습니다. 나 자신도 경험이 많은 동지들에게서 배우고 싶습니다. 그리고 마지막으로 소위 RESTful 웹 서비스에 대한 JAX-RS가 등장했지만 이는 별도 기사의 주제입니다. 소개는 여기서 끝날 수 있기 때문에... 다음으로 JAX-WS를 사용하여 작업하는 방법을 배웁니다.

일반적인 접근

웹 서비스에는 항상 클라이언트와 서버가 있습니다. 서버는 우리의 웹 서비스이며 때로는 끝점(클라이언트의 SOAP 메시지가 도달하는 끝점)이라고도 합니다. 우리는 다음을 수행해야 합니다:
  1. 웹 서비스의 인터페이스 설명
  2. 이 인터페이스 구현
  3. 웹 서비스 시작
  4. 클라이언트를 작성하고 원하는 웹 서비스 메소드를 원격으로 호출합니다.
다양한 방법으로 웹 서비스를 시작할 수 있습니다. 기본 메소드로 클래스를 설명하고 웹 서비스를 서버로 직접 시작하거나 Tomcat이나 기타 서버에 배포할 수 있습니다. 두 번째 경우, 우리는 새 서버를 시작하지 않고 컴퓨터에서 다른 포트를 열지 않고 단순히 Tomcat 서블릿 컨테이너에 "여기에 웹 서비스 클래스를 작성했습니다. 연락하는 모든 사람이 사용할 수 있도록 게시하십시오"라고 말합니다. 우리의 웹 서비스를 이용하세요." 웹 서비스를 시작하는 방법에 관계없이 동일한 클라이언트를 갖게 됩니다.

섬기는 사람

IDEA를 실행하고 새 프로젝트를 만들어 봅시다 새 프로젝트 만들기. 이름을 나타내자 HelloWebService그리고 버튼을 누르세요 다음, 버튼을 차례로 누른 다음 마치다. 폴더 내 소스패키지를 만들어보자 ru.javarush.ws. 이 패키지에서는 HelloWebService 인터페이스인 package ru를 생성합니다. javarush. ws; // 이것은 주석입니다. 즉, 클래스와 메소드를 표시하는 방법, // 웹 서비스 기술과 관련하여 javax를 가져옵니다. jws. Web방법; javax를 가져옵니다. jws. 웹 서비스; javax를 가져옵니다. jws. 비누. SOAP바인딩; // 인터페이스가 웹 서비스로 작동할 것이라고 말합니다.@웹 서비스 // 웹 서비스가 메소드를 호출하는 데 사용된다고 말합니다.@SOAPBinding(스타일 = SOAPBinding.Style.RPC) 공용 인터페이스 HelloWebService( // 이 메소드를 원격으로 호출할 수 있다고 말합니다.@WebMethod public String getHelloString(String name) ; ) 이 코드에서 WebService 및 WebMethod 클래스는 소위 주석이며 인터페이스와 해당 메서드를 웹 서비스로 표시하는 것 외에는 아무 작업도 수행하지 않습니다. SOAPBinding 클래스에도 동일하게 적용됩니다. 유일한 차이점은 SOAPBinding이 매개변수가 있는 주석이라는 것입니다. 이 경우 스타일 매개변수는 웹 서비스가 문서 메시지를 통하지 않고 클래식 RPC로 작동함을 나타내는 값과 함께 사용됩니다. 메서드를 호출합니다. 인터페이스 로직을 구현하고 패키지에 HelloWebServiceImpl 클래스를 생성해 보겠습니다. 그건 그렇고, Impl로 클래스를 끝내는 것은 인터페이스 구현이 지정되는 Java의 관례입니다(Impl - 단어 구현, 즉 구현에서 유래). 이는 필수 사항은 아니며 원하는 대로 클래스 이름을 지정할 수 있지만 매너에 따라 다음과 같이 필요합니다. package ru. javarush. ws; // 인터페이스를 설명할 때와 동일한 주석, javax를 가져옵니다. jws. 웹 서비스; // 하지만 여기서는 EndpointInterface 매개변수와 함께 사용됩니다. // 웹 서비스 인터페이스 클래스의 전체 이름을 나타냅니다.@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") 공용 클래스 HelloWebServiceImpl은 HelloWebService( @Override public String getHelloString(문자열 이름)( //인사말만 반환 return "안녕하세요, " + 이름 + "!" ; ) ) 웹 서비스를 독립 서버로 시작하겠습니다. Tomcat 및 애플리케이션 서버의 참여 없이(이는 별도의 논의 주제입니다) 이렇게 하려면 폴더의 프로젝트 구조에서 소스 ru.javarush.endpoint 패키지를 만들고 그 안에 기본 메서드인 package ru를 사용하여 HelloWebServicePublisher 클래스를 만듭니다. javarush. 종점; // 웹 서비스로 웹 서버를 실행하기 위한 클래스 javax를 가져옵니다. xml. ws. 종점; // 웹 서비스 클래스수입 루. javarush. ws. HelloWebServiceImpl; 공용 클래스 HelloWebServicePublisher( public static void main (String... args) ( // 포트 1986에서 웹 서버를 시작합니다. // 첫 번째 인수에 지정된 주소로, // 두 번째 인수에 전달된 웹 서비스를 시작합니다.끝점. 게시( "http://localhost:1986/wss/hello", 새로운 HelloWebServiceImpl() ) ; ) ) 이제 클릭하여 이 클래스를 실행해 보겠습니다. Shift+F10. 콘솔에는 아무 것도 나타나지 않지만 서버는 실행 중입니다. 브라우저에 http://localhost:1986/wss/hello?wsdl 줄을 입력하여 이를 확인할 수 있습니다. 열리는 페이지는 한편으로는 컴퓨터(localhost)의 포트 1986에서 실행되는 웹 서버(http://)가 있음을 증명하고, 다른 한편으로는 웹 서비스에 대한 WSDL 설명을 보여줍니다. 애플리케이션을 중지하면 웹 서비스 자체와 마찬가지로 설명을 사용할 수 없게 되므로 이 작업을 수행하지 않고 클라이언트 작성으로 넘어갑니다.

고객

프로젝트 폴더에서 소스 ru.javarush.client 패키지를 만들고 그 안에 기본 메서드인 package ru가 있는 HelloWebServiceClient 클래스를 만들어 보겠습니다. javarush. 고객; // wsdl 설명을 얻고 이를 통해 가져오는 데 필요합니다. // 웹 서비스 자체에 도달자바를 가져옵니다. 그물. URL; // 이 예외는 URL 객체로 작업할 때 발생합니다.자바를 가져옵니다. 그물. 잘못된URL예외; // wsdl 설명으로 xml을 구문 분석하는 클래스 // 서비스 태그에 도달합니다. javax를 가져옵니다. xml. 네임스페이스. Q이름; javax를 가져옵니다. xml. ws. 서비스; // 웹 서비스의 인터페이스(더 필요함)수입 루. javarush. ws. HelloWebService; 공용 클래스 HelloWebServiceClient( public static void main(String args)에서 MalformedURLException이 발생함( // wsdl 설명에 대한 링크 생성 URL url = 새 URL( "http://localhost:1986/wss/hello?wsdl") ; // WSDL 설명의 첫 번째 태그에서 다음 생성자의 매개변수를 살펴봅니다. - 정의 // targetNamespace 속성의 첫 번째 인수를 살펴봅니다. // name 속성의 두 번째 인수를 살펴봅니다. QName qname = new QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ; // 이제 wsdl 설명에서 서비스 태그에 접근할 수 있습니다.서비스 서비스 = 서비스. 생성(url, qname) ; // 그리고 그 안에 중첩된 포트 태그까지 // 우리로부터 멀리 떨어진 웹 서비스 객체에 대한 링크를 얻습니다. HelloWebService 안녕하세요 = 서비스. getPort(HelloWebService.class); // 만세! 이제 원격 메서드를 호출할 수 있습니다.체계. 밖으로. println (hello.getHelloString ( "JavaRush" ) ) ; ) ) 목록의 코드에 대해 최대한의 의견을 제시했습니다. 추가할 내용이 없으므로 실행(Shift+F10)해 봅시다. 콘솔에 Hello, JavaRush!라는 텍스트가 표시되어야 합니다. 이를 보지 못했다면 아마도 웹 서비스를 시작하는 것을 잊었을 것입니다.

결론

이 항목에서는 웹 서비스에 대해 간략하게 살펴보았습니다. 다시 한 번 말씀드리지만, 제가 쓴 내용의 대부분은 그것이 어떻게 작동하는지에 대한 저의 추측이므로 저를 너무 믿으시면 안 됩니다. 지식이 풍부한 사람들이 나를 고쳐주면 감사할 것입니다. 그러면 나는 뭔가를 배울 것이기 때문입니다. UPD.

주제 제목이 정말 문제네요. 왜냐하면... 나 자신도 그것이 무엇인지 모르고 처음으로 이 기사의 틀 내에서 작업하려고 노력할 것입니다. 제가 보장할 수 있는 유일한 것은 아래에 제시된 코드가 작동할 것이라는 점입니다. 그러나 제 표현은 제가 이 모든 것을 어떻게 이해하는지에 대한 가정과 추측일 뿐입니다. 그럼 가자...

소개

웹 서비스라는 개념이 왜 탄생했는지부터 살펴봐야 합니다. 이 개념이 세상에 등장했을 때, 응용 프로그램이 원격으로 상호 작용할 수 있도록 하는 기술이 이미 존재했습니다. 즉, 한 프로그램이 다른 프로그램의 메서드를 호출하여 다른 도시나 국가에 있는 컴퓨터에서 실행할 수 있었습니다. 이 모든 것은 RPC(Remote Procedure Calling)로 축약됩니다. 예에는 CORBA 기술 및 Java - RMI(Remote Method Invoking)가 포함됩니다. 그리고 특히 CORBA에서는 모든 것이 좋은 것 같습니다. 왜냐하면... 어떤 프로그래밍 언어로든 작업할 수 있지만 여전히 부족한 부분이 있습니다. 나는 CORBA의 단점은 모든 방화벽을 통과할 수 있는 단순한 HTTP 대신 자체 네트워크 프로토콜 중 일부를 통해 작동한다는 점이라고 생각합니다. 웹 서비스의 아이디어는 HTTP 패킷에 삽입될 RPC를 만드는 것이었습니다. 그리하여 표준 개발이 시작되었습니다. 이 표준의 기본 개념은 무엇입니까?
  1. 비누. 원격 프로시저를 호출하기 전에 SOAP 형식의 XML 파일에서 이 호출을 설명해야 합니다. SOAP는 웹 서비스에 사용되는 많은 XML 마크업 중 하나일 뿐입니다. HTTP를 통해 어딘가로 보내려는 모든 것은 먼저 XML SOAP 설명으로 변환된 다음 HTTP 패킷에 담겨 TCP/IP를 통해 네트워크의 다른 컴퓨터로 전송됩니다.
  2. WSDL. 웹 서비스가 있습니다. 원격으로 메소드를 호출할 수 있는 프로그램입니다. 그러나 표준에 따르면 이 프로그램에는 "예, 맞습니다. 이것은 실제로 웹 서비스이며 여기에서 이러한 메서드를 호출할 수 있습니다."라는 설명이 수반되어야 합니다. 이 설명은 다른 형식의 다른 XML 파일, 즉 WSDL로 표시됩니다. 저것들. WSDL은 웹 서비스를 설명하는 XML 파일일 뿐이며 그 이상은 아닙니다.
왜 그렇게 짧게 물어보나요? 좀 더 구체적으로 말씀해주실 수 없나요? 아마도 가능할 것입니다. 그러나 이를 위해서는 T. Mashnin의 "Java Web Services"와 같은 책을 참조해야 합니다. 처음 200페이지 이상에는 SOAP 및 WSDL 표준의 각 태그에 대한 자세한 설명이 있습니다. 할 가치가 있나요? 제 생각에는 아니거든요. 왜냐면... 이 모든 것은 Java에서 자동으로 생성되며 원격으로 호출되는 메소드의 내용만 작성하면 됩니다. 그래서 JAX-RPC와 같은 API가 Java에 등장했습니다. 모르는 사람이 Java에 이런 API가 있다고 말하면 문제의 기술을 캡슐화하는 클래스 세트가 있는 패키지가 있다는 의미입니다. JAX-RPC는 시간이 지남에 따라 버전별로 발전하여 결국 JAX-WS가 되었습니다. WS는 분명히 WebService의 약자이며 요즘 인기 있는 전문 용어로 RPC의 이름을 바꾼 것일 뿐이라고 생각할 수도 있습니다. 이는 사실이 아닙니다. 왜냐하면 이제 웹 서비스는 원래 아이디어에서 벗어나 원격 메소드를 호출할 수 있을 뿐만 아니라 단순히 SOAP 형식으로 문서 메시지를 보낼 수도 있습니다. 아직 이것이 왜 필요한지는 모르겠지만 여기서는 "필요할 경우를 대비해"라고 답할 가능성은 낮습니다. 나 자신도 경험이 많은 동지들에게서 배우고 싶습니다. 그리고 마지막으로 소위 RESTful 웹 서비스에 대한 JAX-RS가 등장했지만 이는 별도 기사의 주제입니다. 소개는 여기서 끝날 수 있기 때문에... 다음으로 JAX-WS를 사용하여 작업하는 방법을 배웁니다.

일반적인 접근

웹 서비스에는 항상 클라이언트와 서버가 있습니다. 서버는 우리의 웹 서비스이며 때로는 끝점(클라이언트의 SOAP 메시지가 도달하는 끝점)이라고도 합니다. 우리는 다음을 수행해야 합니다:
  1. 웹 서비스의 인터페이스 설명
  2. 이 인터페이스 구현
  3. 웹 서비스 시작
  4. 클라이언트를 작성하고 원하는 웹 서비스 메소드를 원격으로 호출합니다.
다양한 방법으로 웹 서비스를 시작할 수 있습니다. 기본 메소드로 클래스를 설명하고 웹 서비스를 서버로 직접 시작하거나 Tomcat이나 기타 서버에 배포할 수 있습니다. 두 번째 경우, 우리는 새 서버를 시작하지 않고 컴퓨터에서 다른 포트를 열지 않고 단순히 Tomcat 서블릿 컨테이너에 "여기에 웹 서비스 클래스를 작성했습니다. 연락하는 모든 사람이 사용할 수 있도록 게시하십시오"라고 말합니다. 우리의 웹 서비스를 이용하세요." 웹 서비스를 시작하는 방법에 관계없이 동일한 클라이언트를 갖게 됩니다.

섬기는 사람

IDEA를 실행하고 새 프로젝트를 만들어 봅시다 새 프로젝트 만들기. 이름을 나타내자 HelloWebService그리고 버튼을 누르세요 다음, 버튼을 차례로 누른 다음 마치다. 폴더 내 소스패키지를 만들어보자 ru.javarush.ws. 이 패키지에서는 HelloWebService 인터페이스인 package ru를 생성합니다. javarush. ws; // 이것은 주석입니다. 즉, 클래스와 메소드를 표시하는 방법, // 웹 서비스 기술과 관련하여 javax를 가져옵니다. jws. Web방법; javax를 가져옵니다. jws. 웹 서비스; javax를 가져옵니다. jws. 비누. SOAP바인딩; // 인터페이스가 웹 서비스로 작동할 것이라고 말합니다.@웹 서비스 // 웹 서비스가 메소드를 호출하는 데 사용된다고 말합니다.@SOAPBinding(스타일 = SOAPBinding.Style.RPC) 공용 인터페이스 HelloWebService( // 이 메소드를 원격으로 호출할 수 있다고 말합니다.@WebMethod public String getHelloString(String name) ; ) 이 코드에서 WebService 및 WebMethod 클래스는 소위 주석이며 인터페이스와 해당 메서드를 웹 서비스로 표시하는 것 외에는 아무 작업도 수행하지 않습니다. SOAPBinding 클래스에도 동일하게 적용됩니다. 유일한 차이점은 SOAPBinding이 매개변수가 있는 주석이라는 것입니다. 이 경우 스타일 매개변수는 웹 서비스가 문서 메시지를 통하지 않고 클래식 RPC로 작동함을 나타내는 값과 함께 사용됩니다. 메서드를 호출합니다. 인터페이스 로직을 구현하고 패키지에 HelloWebServiceImpl 클래스를 생성해 보겠습니다. 그건 그렇고, Impl로 클래스를 끝내는 것은 인터페이스 구현이 지정되는 Java의 관례입니다(Impl - 단어 구현, 즉 구현에서 유래). 이는 필수 사항은 아니며 원하는 대로 클래스 이름을 지정할 수 있지만 매너에 따라 다음과 같이 필요합니다. package ru. javarush. ws; // 인터페이스를 설명할 때와 동일한 주석, javax를 가져옵니다. jws. 웹 서비스; // 하지만 여기서는 EndpointInterface 매개변수와 함께 사용됩니다. // 웹 서비스 인터페이스 클래스의 전체 이름을 나타냅니다.@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") 공용 클래스 HelloWebServiceImpl은 HelloWebService( @Override public String getHelloString(문자열 이름)( //인사말만 반환 return "안녕하세요, " + 이름 + "!" ; ) ) 웹 서비스를 독립 서버로 시작하겠습니다. Tomcat 및 애플리케이션 서버의 참여 없이(이는 별도의 논의 주제입니다) 이렇게 하려면 폴더의 프로젝트 구조에서 소스 ru.javarush.endpoint 패키지를 만들고 그 안에 기본 메서드인 package ru를 사용하여 HelloWebServicePublisher 클래스를 만듭니다. javarush. 종점; // 웹 서비스로 웹 서버를 실행하기 위한 클래스 javax를 가져옵니다. xml. ws. 종점; // 웹 서비스 클래스수입 루. javarush. ws. HelloWebServiceImpl; 공용 클래스 HelloWebServicePublisher( public static void main (String... args) ( // 포트 1986에서 웹 서버를 시작합니다. // 첫 번째 인수에 지정된 주소로, // 두 번째 인수에 전달된 웹 서비스를 시작합니다.끝점. 게시( "http://localhost:1986/wss/hello", 새로운 HelloWebServiceImpl() ) ; ) ) 이제 클릭하여 이 클래스를 실행해 보겠습니다. Shift+F10. 콘솔에는 아무 것도 나타나지 않지만 서버는 실행 중입니다. 브라우저에 http://localhost:1986/wss/hello?wsdl 줄을 입력하여 이를 확인할 수 있습니다. 열리는 페이지는 한편으로는 컴퓨터(localhost)의 포트 1986에서 실행되는 웹 서버(http://)가 있음을 증명하고, 다른 한편으로는 웹 서비스에 대한 WSDL 설명을 보여줍니다. 애플리케이션을 중지하면 웹 서비스 자체와 마찬가지로 설명을 사용할 수 없게 되므로 이 작업을 수행하지 않고 클라이언트 작성으로 넘어갑니다.

고객

프로젝트 폴더에서 소스 ru.javarush.client 패키지를 만들고 그 안에 기본 메서드인 package ru가 있는 HelloWebServiceClient 클래스를 만들어 보겠습니다. javarush. 고객; // wsdl 설명을 얻고 이를 통해 가져오는 데 필요합니다. // 웹 서비스 자체에 도달자바를 가져옵니다. 그물. URL; // 이 예외는 URL 객체로 작업할 때 발생합니다.자바를 가져옵니다. 그물. 잘못된URL예외; // wsdl 설명으로 xml을 구문 분석하는 클래스 // 서비스 태그에 도달합니다. javax를 가져옵니다. xml. 네임스페이스. Q이름; javax를 가져옵니다. xml. ws. 서비스; // 웹 서비스의 인터페이스(더 필요함)수입 루. javarush. ws. HelloWebService; 공용 클래스 HelloWebServiceClient( public static void main(String args)에서 MalformedURLException이 발생함( // wsdl 설명에 대한 링크 생성 URL url = 새 URL( "http://localhost:1986/wss/hello?wsdl") ; // WSDL 설명의 첫 번째 태그에서 다음 생성자의 매개변수를 살펴봅니다. - 정의 // targetNamespace 속성의 첫 번째 인수를 살펴봅니다. // name 속성의 두 번째 인수를 살펴봅니다. QName qname = new QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // 이제 wsdl 설명에서 서비스 태그에 접근할 수 있습니다.서비스 서비스 = 서비스. 생성(url, qname) ; // 그리고 그 안에 중첩된 포트 태그까지 // 우리로부터 멀리 떨어진 웹 서비스 객체에 대한 링크를 얻습니다. HelloWebService 안녕하세요 = 서비스. getPort(HelloWebService.class); // 만세! 이제 원격 메서드를 호출할 수 있습니다.체계. 밖으로. println (hello.getHelloString ( "JavaRush" ) ) ; ) ) 목록의 코드에 대해 최대한의 의견을 제시했습니다. 추가할 내용이 없으므로 실행(Shift+F10)해 봅시다. 콘솔에 Hello, JavaRush!라는 텍스트가 표시되어야 합니다. 이를 보지 못했다면 아마도 웹 서비스를 시작하는 것을 잊었을 것입니다.

결론

이 항목에서는 웹 서비스에 대해 간략하게 살펴보았습니다. 다시 한 번 말씀드리지만, 제가 쓴 내용의 대부분은 그것이 어떻게 작동하는지에 대한 저의 추측이므로 저를 너무 믿으시면 안 됩니다. 지식이 풍부한 사람들이 나를 고쳐주면 감사할 것입니다. 그러면 나는 뭔가를 배울 것이기 때문입니다. UPD.

오늘날 웹 서비스는 거의 모든 곳에서 사용됩니다. 웹 서비스는 비행기와 기차 항공편, 환율 및 날씨에 대한 정보를 제공합니다. 1C가 자체 WEB 서비스를 생성하여 공급자이자 소비자 역할을 모두 수행할 수 있다는 것은 놀라운 일이 아닙니다. 이 메커니즘은 1C:Enterprise 8.3 플랫폼에 내장되어 있으며 개발자는 웹 서비스 유형의 자체 개체를 표준 구성에 추가할 수도 있습니다. 해당 아키텍처는 다른 소프트웨어와 정보를 교환할 수 있는 일련의 서비스를 기반으로 구축되었습니다.

1C 웹 서비스 만들기

1C WEB 서비스의 주요 장점 중 하나는 정보 보안 데이터에 대한 직접 액세스를 제공할 필요가 없다는 것입니다. 올바르게 구성된 1C 웹 서비스를 통해 다른 응용 프로그램이 외부의 기능을 사용할 수 있습니다. 이러한 경우, 함수 자체는 개발자가 규정한 규칙에 따라 지정된 매개변수에 따라 데이터 사용 권한을 결정해야 합니다.

1C에서 웹 서비스를 만드는 방법은 무엇입니까?

1C 시스템의 특정 기능을 외부 소프트웨어에서 사용할 수 있으려면 다음 동작 알고리즘을 수행해야 합니다.

  1. 구성으로 이동하여 트리의 특정 분기에 웹 서비스 개체를 추가합니다.
  2. 우리 기능이 수행할 수 있는 모든 작업을 설명합니다. 기능 설명은 내장 1C 언어로 모듈에서 수행됩니다.
  3. 웹 서비스 기능의 매개변수에 대한 설명을 추가합니다. 데이터 유형은 플랫폼 버전 8.1에 도입된 XDTO 메커니즘의 기존 유형을 고려하여 설명됩니다.
  4. 생성된 WEB 서비스를 서버에 게시합니다. 1C 플랫폼에 내장된 메커니즘은 다음 표준을 지원합니다.
  • SSL/TLS
  • WS-I BP

간단한 WEB 서비스 작성 예

웹 서비스 메커니즘의 작동을 가장 명확하게 보여주기 위해 입력된 문자열의 길이를 결정하는 기능인 예제를 만들어 보겠습니다. 소프트웨어는 문자열을 요청 매개변수로 전달하고 1C에 설명된 함수는 문자 수를 반환합니다. 생성할 때 이 메커니즘을 게시하면 다양한 소프트웨어에서 해당 메커니즘에 액세스할 수 있다는 점을 기억해야 합니다. 모든 소프트웨어가 키릴 문자를 수용할 수 있는 것은 아니므로 라틴 문자를 사용하여 구성 개체의 이름을 지정하겠습니다.

구성기를 열고 트리에서 "WEB 서비스" 분기를 찾은 다음 새 서비스 "wa_LengthString"을 추가합니다. 또한 "작업" 탭에서 새 작업을 추가해야 합니다. 이를 "CalcLengthString"이라고 부르고 속성에서 반환 값 유형(int 또는 정수)을 지정하고 그 안에 "InputString" 매개 변수를 생성해 보겠습니다. 값 유형을 문자열로 남겨둡니다.

이제 웹 서비스 모듈에서 CalcLengthString 함수의 동작을 등록해야 합니다. 이렇게 하려면 생성된 함수의 속성을 열고 "프로시저 이름" 입력 필드 옆 오른쪽에 있는 돋보기 형태의 버튼을 클릭합니다. 1C는 자동으로 웹 서비스 모듈에 함수를 생성하고 CalcLengthString 작업을 설명할 수 있도록 엽니다. 이를 활용하여 입력 문자열의 길이를 결정하는 함수의 동작을 작성해 보겠습니다.


이로써 간단한 WEB 서비스 생성이 완료되었습니다. 이제 타사 소프트웨어 또는 기타 1C 시스템이 이 기능을 사용할 수 있도록 이 서비스를 공개 도메인에 "넣어야" 합니다.

생성된 웹 서비스를 해당 기능과 함께 게시하려면 사이트에 대한 액세스 권한이 필요합니다. 서비스 게시를 시작하기 전에 생성된 wa_LengthString 모듈의 속성에서 파일 이름을 확인해야 합니다. 명확하고 단순해야 하며 확장자는 "1cws"여야 합니다.


이제 서버에 생성한 웹 서비스를 게시할 차례입니다. 이 기능은 플랫폼 버전 8.3에 등장했으며 많은 회사에서 이미 이 기능의 모든 이점을 실현했습니다. 게시를 시작하려면 구성기에서 "웹 서버에서 관리/게시..." 양식을 열어야 합니다.


열리는 창에서 1C 웹 서비스를 구성하고 특정 필드를 채워야 합니다.

  • 이름. 웹 서비스에 대한 설명이 저장될 웹 서버의 폴더를 지정합니다. 서버에서 대소문자를 구분하는 경우가 있으므로 대소문자에 주의하세요.
  • 웹 서버. 컴퓨터에 설치된 서버 중에서 서버를 선택해야 합니다.
  • 목록. 연결 설정을 위한 웹 서버 데이터가 저장되는 폴더의 경로를 선택해야 합니다. 라틴 문자만 사용됩니다.
  • 부울 유형의 두 가지 기호입니다. 첫 번째는 웹 클라이언트를 통해 구성에 대한 액세스를 구성해야 하는 경우 유용합니다. 1C 서비스를 게시하려면 두 번째 상자를 선택해야 합니다.

남은 것은 원하는 웹 서비스의 첫 번째 열에 확인란이 선택되어 있는지 확인하고 "게시"를 클릭하는 것입니다.


이 메커니즘은 아직 새롭기 때문에 "파일 작업을 수행하는 동안 오류가 발생했습니다..."와 같은 오류가 발생할 수 있습니다. 이 경우 "게시"를 다시 클릭하면 됩니다. 대부분의 경우 이는 도움이 되며 웹 서비스가 게시되었음을 나타내는 메시지가 표시됩니다.

<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl

이러한 주소 요청에 대한 응답으로 브라우저는 XML 파일의 구조를 표시해야 합니다. 빈 페이지, 오류 또는 이상한 문자(인코딩 문제)가 나타나면 모든 단계를 다시 확인해야 합니다. 서버가 올바르게 구성되어 있고 해당 서버에 액세스할 수 있는지 확인하는 것도 좋은 생각입니다. 게시가 성공적으로 완료되면 1C WEB 서비스를 타사 응용 프로그램에서 사용할 수 있습니다.


키워드: 웹 서비스, 웹 서비스, SOAP, WSDL, ws 링크

면책조항 및 이용약관

이 기사에서 실수로 언급된 모든 상표는 해당 소유자의 자산입니다.
이 기사는 Creative Commons Attribution-Share Alike 3.0 Unported License에 따라 게시되었습니다. http://creativecommons.org/licenses/by-sa/3.0/

또 다른 면책 조항 (여러 번 이후)

1C:Enterprise 8 플랫폼은 지속적으로 발전하고 있습니다. 따라서 이 문서에 제시된 코드는 최신 버전의 플랫폼에서 오류를 생성합니다. 이는 특히 웹 서비스 프록시 개체의 메서드 호출 순서가 변경되었기 때문에 발생합니다. 예를 들어 복잡한 개체는 해당 서비스의 팩토리를 사용하여 적절한 유형의 XDTO 개체로 명시적으로 변환되어야 합니다. . 이에 대한 내용은 포럼이나 "1C:Enterprise Integration Technologies"(http://v8.1c.ru/metod/books/book.jsp?id=288) 책에서 읽을 수 있습니다.

소개

소프트웨어 제품의 새 버전이 나타나면 당연히 먼저 그 안에 새로운 것이 무엇인지 이해하고 싶습니다. 1C:Enterprise 8.1의 경우 웹 서비스는 나에게 새로운 "기능"이 되었습니다. 이 기술은 컴퓨터 표준에 따라 꽤 오랫동안 존재했기 때문에 웹 서비스에 대해 많은 글과 이야기가 작성되었습니다. 따라서 반복하지 않고 모든 사람에게 Yandex에서 정보를 참조하도록 안내합니다. 1C:Enterprise 8.1 플랫폼의 새 버전이 출시됨에 따라 1Snikov는 말하자면 기본 환경에서 웹 서비스 기술을 만들고 사용할 수 있는 기회를 갖게 되었다고 말씀드리겠습니다. 이 기사에서는 개발에 외부 웹 서비스를 사용하는 방법을 보여주고 싶습니다.

완전히 "루프에서 벗어난" 사람들을 위한: "손끝에서" 웹 서비스에 대해

좋아요, 특별히 당신을 위해웹 서비스가 무엇인지, 왜 정확히 무엇인지에 대해 조금 말씀 드리겠습니다. 이것나에게는 플랫폼의 "맛있는"혁신처럼 보였습니다. 아마도 COM 기술에 대해 알고 있거나 OLE에 대해 들어보셨나요? 조만간 모든 개별 직원이 이 기술을 접하게 될 것입니다(특히 일부 디렉터리 "직원"을 신속하게 전송해야 하고 HR 부서에서 1,500명의 직원 모두를 다시 불러들일 필요가 있을 것으로 예상하여 첫 번째 문제에 직면할 준비가 되어 있는 경우). 함께 제공되는 적합한 손톱).
그렇습니다. COM 기술의 핵심은 다음과 같은 아이디어입니다. 가능성다른 응용 프로그램에서 한 응용 프로그램의 프로그램 코드를 호출하고 데이터에 액세스합니다. 게다가, 가능성개별 절차나 기능 수준에서가 아니라 처분을 통해 이를 수행합니다. 사물다른 응용 프로그램. OLE를 사용할 때 애플리케이션에서 " 대표"또는 원한다면," 싸개"우리가 상호 작용하려는 응용 프로그램의 일부 개체(소위 "OLE 개체" 또는 "COM 개체"). 이 "래퍼" 개체를 통해 다른 응용 프로그램 개체의 속성과 메서드를 사용할 수 있게 됩니다. , 그리고 그 중 개발자가 토고설명에 앱을 게시하여 사용할 수 있도록 허용한 앱 상호 작용. (글쎄, 잡초에 들어가고 싶지 않았지만 다른 방법이 없군요...)
이제 상상해보자 정확히 똑같다응용 프로그램은 로컬 네트워크(DCOM, CORBA 및 기타 난해한 약어가 이러한 경우를 잘 처리함)가 아닌 다른 컴퓨터에 있지만 인터넷에서 멀리 떨어진 곳에 있습니다. 여기가 웹 서비스가 등장하는 곳입니다(SOAP, WSDL 등의 난해한 약어로도 완성됨). 이 경우 비슷한 "트릭"을 수행할 수 있습니다. 인터넷 반대편에 있는 컴퓨터에서 실행되는 응용 프로그램으로부터 데이터를 수신하고 개체를 조작합니다.
아래에 " 외부"웹 서비스란 일부 사용자에게 제공되는 웹 서비스를 의미합니다. 공급자서비스(즉, 당사 애플리케이션이 아님)에 따라 "내부" - 당사가 제공할 웹 서비스 ~에서, 또는 더 정확하게는 기반을 둔우리의 응용 프로그램. 외부 웹 서비스를 사용할 때 "래퍼" 개체가 "로컬" 응용 프로그램에서 생성되었지만 이 개체의 "실행 코드"는 아마도 지구 반대편에 있을 수 있다는 점을 이해해야 합니다. 동시에, 사이의 교환 우리를그리고 그들을이 작업은 잘 알려진 "장점"(다양성 및 구조)과 "단점"(부풀음)을 포함하는 현재 유비쿼터스 XML에서 발생하며 오래된 http가 "전송 회선"으로 사용됩니다.
네, 인터넷 트래픽도 잊지 마세요! 게다가 외부 웹 서비스의 경우 대부분이 들어오는요소.
다른 모든 것은 Yandex에 있습니다. 계속하자...

다리는 어디에서 왔습니까? 날개가 자라다

Yandex를 뒤지다가 항공기 도착 및 출발에 대한 정보를 실시간으로 받을 수 있는 Aeroflot 회사의 멋진 웹 서비스를 발견하고 1C:Enterprise에서 일종의 "공항 디스플레이"를 만들기로 결정했습니다. 서비스 자체는 http://webservices.aeroflot.ru/desc_flightinfo.asp에 있습니다.

그는 "가자!"라고 말했습니다.

우선 "1C:Enterprise 8.1"의 빈 구성을 만들었습니다(이 글을 쓸 당시 플랫폼 버전은 8.1.5.123이었습니다). 그런 다음 WS-link 유형의 새 개체를 구성에 추가했습니다. 가져온 WSDL의 URL을 입력하라는 메시지가 표시되면 서비스 페이지에 나열된 WSDL 파일에 대한 링크를 입력했습니다. http://webservices.aeroflot.aero/flightstatus.wsdl(WSDL 파일은 웹 서비스 자세한 내용은 Yandex )를 참조하고, 생성된 시설의 이름을 "Aeroflot"으로 자랑스럽게 지정했습니다. 이 개체를 두 번 클릭하면 웹 서비스 구조의 트리가 표시됩니다.

이 트리는 1Ska가 보는 것처럼 웹 서비스의 "초상화"를 나타냅니다. 가장 흥미로운 점은 "웹 서비스" 부문에 있습니다. 이름그리고 포트웹 서비스(실제로 WSDL 파일은 하나가 아닌 여러 웹 서비스를 설명할 수 있으며 각 웹 서비스에는 자체 분기가 있음)가 나열됩니다. 행동 양식웹 서비스. 이것은 바로 웹 서비스가 제공하는 데이터에 대한 액세스 권한을 부여할 수 있는 "문자열"입니다. "데이터 모델" 분기에는 웹 서비스에서 사용되는 데이터 유형 라이브러리에 대한 설명이 포함되어 있습니다.
웹 서비스 사용 방법에 대한 간략한 요약은 일반적으로 WSDL 파일 링크와 같은 위치에서 찾을 수 있습니다. Aeroflot의 경우 http://webservices.aeroflot.aero/flightstatus.asmx 페이지입니다.

"이제 이륙, 이제 착륙…"

웹 서비스를 사용하기 위해 구성에 "출발 표시" 처리를 추가하고 그 안에 하나의 양식을 기본 양식으로 지정했습니다. 양식에 선택 필드 "공항 선택", "비행 날짜" 입력 필드, "도착" 및 "출발" 두 페이지가 있는 "테이블보드 패널" 패널을 배치하고 "페이지에 걸쳐 배포" 플래그를 선택 취소했습니다. 패널 속성 및 "테이블보드" 테이블 필드 ".
웹 서비스와의 상호 작용은 "요청-응답" 원칙에 따라 발생하며 웹 서비스를 위한 특별한 중개 개체가 생성됩니다. 따라서 사용자 정의 유형의 "ServiceAeroflot" 양식 세부 정보를 추가했습니다.
서비스 설명을 잘 읽어보시면 웹 서비스에서는 Arrival 메소드와 Departure 메소드를 각각 호출하여 도착과 출발에 대한 데이터를 제공하는 것을 보실 수 있습니다. 이 경우 두 방법 모두 공항 코드와 원하는 날짜를 매개변수로 사용합니다. 또한 웹 서비스는 시스템에서 데이터를 사용할 수 있는 공항 목록을 얻는 기능을 제공합니다. 웹 서비스와의 상호 작용에 대한 다음 시나리오는 매우 분명합니다.
1. 공항 목록을 얻으십시오.
2. 원하는 공항과 날짜를 선택하세요.
3. 도착 또는 출발에 대한 데이터를 얻습니다.
그러나 웹 서비스에 액세스하기 전에 중간 개체(예: WSProxy)를 초기화해야 합니다. 이는 양식 열기 핸들러에서 수행한 작업입니다.
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
첫 번째 매개변수는 웹 서비스 네임스페이스의 URI입니다. WS 링크 트리에서 웹 서비스의 속성을 열어서 확인할 수 있습니다. 두 번째와 세 번째 매개변수는 각각 웹 서비스의 이름과 포트를 전송합니다.
(웹 서비스에 적용되는 "이름", "포트", "프록시" 등의 개념을 TCP/IP 프로토콜의 더 친숙한 개념과 혼동하지 마십시오. 둘 사이에 대응이 있는 경우 이는 의미론적입니다. .일반적인 경우 예를 들어 웹 서비스 포트와 TCP 포트는 완전히 다른 것임을 이해해야 합니다.
따라서 저는 본질적으로 웹 서비스의 "래퍼"인 WSProxy 유형의 Aeroflot 서비스 개체를 초기화했습니다. 이를 통해 플랫폼의 "네이티브" 메서드로 웹 서비스 메서드에 액세스할 수 있습니다.
먼저 공항 목록을 받고 "공항 선택" 선택 필드 목록을 작성했습니다.

SelectionList=FormElements.AirportSelection.SelectionList; SelectionList.Clear(); AirportList=Aeroflot Service.AirportList().GetList("목록 "); TotalAirports=ListAirports.Count(); ui=0에서 TotalAirports-1까지 Cycle Airport=ListAirports.Get(ies); SelectionList.Add(Airport.code, ""+Airport.city+" : "+Airport.name); 엔드사이클;
여기에서는 Airport List = ServiceAeroflot.AirportList().GetList("list"); 구성에 대한 작은 설명이 필요합니다.
사실 웹 서비스 메서드에서 반환된 값은 플랫폼에서 XDTO 개체 유형의 개체로 표시됩니다. XDTO 기술에 대한 주제는 이 기사의 범위를 벗어나므로 다음과 같이만 말씀드리겠습니다. 변환이 객체를 목록으로 변환하고 GetList() 메서드를 호출했습니다. 웹 서비스 설명 페이지에서 찾은 Airport 구조의 필드 이름을 포함하여 나머지 코드는 매우 명확합니다.
이제 구성을 실행하고 선택 필드 목록이 공항 이름으로 채워져 있는지 확인할 수 있습니다.

"출발일, 도착일..."

이제 점수판 기능을 만들기 위한 거의 모든 준비가 완료되었습니다. 남은 것은 "칠하고 버리는 것"뿐입니다. :) 그게 제가 할 일입니다:

프로시저 FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("비행 코드", "비행 코드"); 테이블테이블보드.열.추가(" 항공사 코드", "항공사"); TableTable.Columns.Add("FlightNumber", "번호"); TableTable.Columns.Add(" 공항교통", "공항 환승"); TableTable.Columns.Add("공항", "공항"+?(도착,"출발,","도착")); TableTable.Columns.Add(" 시간표", "일정대로"); TableTableboard.Columns.Add(" 시간예정", "계획됨"); TableTableboard.Columns.Add(" 실제 시간", "실제"); TableTable.Columns.Add("계산된 시간", "계산된"); TableTable.Columns.Add("착륙 시간", ?(도착,"착륙","이륙")); TableTable. Columns.Add("결합 항공편", "결합 항공편"); TableTable.Columns.Add("상태", "상태"); 도착하지 않은 경우 TableTable.Columns.Add("등록", "등록"); TableTable .Columns .Add("Landing", "Landing"); EndIf; 양식 요소. 점수판 테이블. 열 생성(); 양식 요소. 점수판 테이블. 열. 항공편 코드. 가시성 = False; 도착하지 않으면 양식 요소. 점수판 표. 열. 예상 시간. 가시성 = False; EndIf; If Arrival Then Data=Aeroflot Service.Arrival(공항 선택, 항공편 날짜).Get List("목록 "); 그렇지 않은 경우 Data=Aeroflot Service.Departure(공항 선택, 항공편 Date).Get List("list "); EndIf; Total Records=Data.Number( ); For ii=0 for TotalRecords-1 Cycle Record=DATA.Get(s); NewRow=TableTable.Add(); NewRow. AirlineCode=Record.company; NewLine.FlightNumber = Entry.flight_no; NewLine.AirportTransit = Entry.airport_inter; NewLine.Airport = Entry.airport; NewLine.TimeSchedule=Record.sched; NewLine.TimePlanned=Record.plan; NewLine.TimeActual=Record.fact; NewLine.TimeCalculated=Record.calc; NewLine.LandingTime=Record.real; NewLine.UnionFlight=Record.union_flight_no; NewRow.Status=Record.status; 도착하지 않은 경우 NewLine.Registration=Record.is_check; NewLine.Landing = Entry.is_board; endIf; 엔드사이클; 절차 종료

모든 것이 어떻게 작동하는지 확인하기 위해 양식의 명령 패널에 해당 그림이 있는 "업데이트" 버튼을 추가하고 핸들러에 다음을 작성했습니다.

절차 CommandPanel1 업데이트(버튼) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arrivals); 절차 종료
저장하고, 실행하고, 선택하고, 클릭하고, 가져옵니다.

후문

놀랍게도 기사가 작성되고 게시된 후 존경받는 ZAV가 이미 IT-Land에 유사한 예를 게시한 것으로 나타났습니다: http://itland.ru/biblio/detail.php?ID=1060
표절 혐의를 피하기 위해 이 기사도 읽고 저자의 접근 방식을 비교해 보시기 바랍니다.