한 1C 구성에서 다른 구성으로 데이터를 전송하는 방법 중 하나는 소프트웨어 연결 COM을 사용하여 많은 회사는 몇 가지 서로 다른 기반을 사용하며, 그 사이에는 특정 연결과 종속성이 있어야 합니다. 데이터 전송뿐만 아니라 특정 데이터 처리를 수행해야 하는 경우 COM 연결이 최적의 메커니즘이 됩니다. 다른 1C 데이터베이스의 데이터를 분석하는 기능은 모든 개발자에게 유용합니다.

COM을 통해 1C 데이터베이스에 연결합니다.

1C에서 COM 연결을 구현하기 위해 COMConnector라는 특수 메커니즘이 사용됩니다. 이 객체는 플랫폼과 함께 설치되며 통신에 사용됩니다. 정보 베이스. 버전 8.2 및 8.3의 경우 각각 "V82.COMConnector" 및 "V83.COMConnector"라는 다른 이름의 개체가 사용됩니다.

데이터베이스에 대한 COM 연결 기간 동안 라이센스가 소비된다는 점을 기억하십시오. 동시에 여러 연결을 수행하는 데 정신이 팔려서는 안 됩니다. 이는 라이선스 수가 제한된 조직에 특히 중요합니다. 이 문제는 다음으로 해결할 수 있습니다. 일상적인 작업정보 베이스에 대한 활성 사용자 연결이 없을 때 실행됩니다.

다른 데이터베이스에 연결하여 요청할 수 있도록 필요한 정보다음 데이터를 알아야 합니다.

  1. 어떤 유형입니까 - 파일 또는 클라이언트-서버;
  2. 위치는 어디입니까?
  3. 어떤 이름과 암호로 입력할 수 있습니까?
  4. 어떤 데이터에 관심이 있습니까?

처음 세 지점에서 COM 연결을 구현하려면 매개변수 문자열을 구성해야 합니다. IB 유형에 따라 다릅니다. 모습. 수신된 문자열을 사용하여 모든 방법으로 분석 및 처리하기 위해 다른 데이터베이스에서 데이터를 수집할 수 있는 연결이 설정됩니다.

ConnectionParametersFileIB = "파일=""경로_to_base""; Usr=""사용자 이름"";Pwd=""비밀번호"""; ConnectionParametersClientServerIB = "Srvr=""서버 이름"", Ref=""Base_Name"", Usr=""사용자 이름"", Pwd=""비밀번호""",

연결 기능은 간단하며 모든 매개변수가 올바른 경우 문제가 발생하지 않아야 합니다. 디버깅 및 분석 속도를 높이려면 가능한 오류연결을 Attempt 구문으로 묶는 것이 좋습니다. 이 함수는 필요한 데이터를 가져오기 위해 작업해야 하는 "COM 개체" 유형의 값을 반환합니다.

&AtServer 기능 ConnectToBase() 내보내기 ConnectionParametersIB = "파일=""E:\base 1c\ERP""; Usr=""관리자"";Pwd=""1"""; V83COMCon= 새 COMObject("V83.COMConnector"); 반환 시도 V83COMCon.Connect(ConnectionParametersIB); 예외 보고서(ErrorDescription()); 정의되지 않은 반환; 시도 종료; EndFunctions

COM 연결을 통해 데이터를 선택할 수 있을 뿐만 아니라 연결하려는 데이터베이스에 추가할 수도 있습니다. COM 개체를 통해 4가지 기본 데이터 유형을 전송할 수 있음을 기억하십시오. 다른 유형은 플랫폼에 내장된 검색 기능을 사용하여 지정해야 합니다. 점에 유의하시기 바랍니다 전역 함수플랫폼은 COM 연결을 통해서도 호출됩니다.

1C 데이터베이스에서 데이터를 수신합니다.

원하는 개체를 받은 후 다른 데이터베이스에서 데이터를 읽어야 합니다. 이를 위해 함수에서 "COM 개체" 유형의 수신된 값을 사용하여 1C 8.3에서 COM 연결을 통해 요청을 적용합니다. 먼저 데이터베이스에 연결한 다음 요청을 실행하는 것이 중요합니다. 실행은 "요청"을 매개변수로 하는 문자열 형식의 개체 유형 표시와 함께 NewObject 메서드를 통해 발생합니다.

&OnServer 프로시저 TestCOMOnServer() 연결 = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then QueryBPO = Connection.NewObject("Query"); Query BPZO.Text = "처음 15개 | 사용자 디렉토리를 선택하십시오. 이름 AS 이름 | FROM | 사용자 디렉토리 AS 사용자 디렉토리"; 선택 = QueryBPO.Run().select(); 동안 Sample.next() 루프 보고서(Selection.Number); 종료 주기; EndIf; 절차 종료 >

예를 들어, 특정 부서의 사용자에 대한 정보를 얻으려면 매개변수를 통해 요청에 조건을 설정합니다. 하나의 매개변수는 단순 유형(문자열 및 부서 - "Enterprise Structure" 디렉토리 요소에 대한 링크)입니다. 쿼리 결과는 COM 연결이 발생한 데이터베이스에 존재하는 유형의 열거된 필드가 있는 테이블입니다. 다른 유형으로 변환해야 하는 경우 표준 플랫폼 기능을 사용하십시오.

  • 선();
  • 숫자();
  • 날짜().
RequestBPO = Connection.NewObject("요청"); QueryBPO.Text = "선택 첫 번째 15 | 사용자 디렉터리.이름 AS 이름 |FROM | Directory.Users AS 사용자 디렉터리 I WHERE | 사용자 디렉터리. 부서 = &DesiredDepartment | 그리고 UserDirectory.Name like ""%"" + &DesiredName+ ""%" "" ; BPZO Request.SetParameter("원하는 부서", Connection.Directories.Enterprise Structure.FindByCode("00-000023")); RequestBPO.SetParameter("필수 이름","예카테리나"); 선택 = QueryBPO.Run().select(); 동안 Selection.next() 루프 Report(Selection.Name); 종료 주기;

여러 매개변수(예: 나눗셈)에 의한 선택을 위해 배열을 데이터베이스로 전송해야 하는 경우 NewObject 명령도 사용됩니다. 마찬가지로 값 목록이나 테이블을 전달하여 연결을 통해 다른 데이터베이스의 요소로 채울 수 있습니다. 모두 검색이 가능합니다. 기존 방법플랫폼의 개체 및 메커니즘.

RequestBPO = Connection.NewObject.("요청"); QueryBPO.Text = "SELECT first 15 | 사용자 디렉토리.이름 AS 이름 | FROM | Directory.Users AS 사용자 디렉토리 I WHERE | 사용자 디렉토리. 부서 In(&Desired Department) | 및 사용자 디렉토리. ""%"와 같은 이름" + & 원하는 이름 + ""%" ""; 세분화 배열 = Connection.NewObject("배열"); 부서 array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000023")); 부서 array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000038")); 부서 array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000046")); Query BPZO.SetParameter("Desired Subdivision", Array of Subdivisions); RequestBPO.SetParameter("필수 이름","예카테리나"); 선택 = QueryBPO.Run().select(); 동안 Selection.next() 루프 Report(Selection.Name); 종료 주기;

문서 또는 디렉토리 요소를 전송할 때 항상 특정 개체의 전송을 제어하는 ​​​​문제가 발생합니다. COM 연결을 사용하면 고유 식별자를 통해 이러한 문제를 해결할 수 있습니다. 식별자를 문자열로 사용하여 "GetLink" 기능을 사용하여 현재 IB의 식별자로 플러그형 데이터베이스에서 개체를 찾아야 합니다. 없는 경우 COM 연결을 사용하여 만들 수 있습니다.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); ValueFilled(Connection.Catalogs.Users.GetReference(Connection.NewObject("UniqueIdentifier", StrIdent)))가 아닌 경우 NewUser = Connection.Catalogs.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").이름; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); EndIf;

또한 COM 연결에는 "외부 연결" 속성이 활성화된 일반 1C 모듈의 절차 및 기능을 사용할 수 있는 권한이 있습니다. 이 조건 외에도 호출된 함수 또는 프로시저는 내보내기 함수여야 하며 서버에서 수행되는 대화형 작업을 포함하지 않아야 합니다. 그렇지 않으면 잘못된 작업에 대한 오류가 표시됩니다.

화합물..; VariableFromFunction = 연결..; 함수호출>공통모듈명>프로시저호출>공통모듈명>

1C의 다른 데이터베이스와의 외부 연결 가능성은 매우 광범위하며 많은 작업을 수행할 수 있습니다. 도구를 올바르게 평가하고 최상의 솔루션을 선택하는 것이 중요합니다. 대부분의 경우 이 기술은 경험이 있거나 숙련된 전문가의 작업 사례를 연구함으로써만 나타납니다.

) 좋아요

동시에 나는 출판물이 10점도 당기지 않는 단순히 "이륙"하는 것을 두 번 이상 보았습니다.
왜 이런 일이 일어났습니까? 누군가가 분명히 그들을 좋아했기 때문일 것입니다.


나는 이것에 대해 이야기하고 있으며 얼마나 필요한지 이해하기 위해 등급으로 기사를 읽거나 그렇게 원시적 인 +/-가 아닌 평가로 기사를 읽지 않는 것이 좋을 것이라고 말합니다. 내가 좋아하는 것에 대해 나는 이것을 수정한다 : 나는 별이 그렇게 형성되었다는 사실 때문에 그녀가 너무 많은 점수를 얻었고 많은 사람들이 사이트에 모여서 많은 사람들이 그것을 좋아했습니다. 이것이 문제임을 스스로 이해합니다. 기회의. 기사가 나오자마자 홈페이지그런 다음 이미 요청 시에만 찾을 수 있으므로 투표를 통해 전달하는 모든 사람이 됩니다. 그리고 메인 페이지에서 지원하기 위해 내가 이해하는 한 지속적인 댓글 = 기사 홍보만 허용합니다.
그것을 위해 그들은 도로 ​​거리에 상점을 두었습니다. 결국 중요한 것은 종종 제품의 품질과 관련성이 아니라 장소의 개방성, 걷는 사람들은 종종 그들이 다음날 버릴 것을 사는 것입니다. 단지 그 과정을 위해서. 이것은 잘 알려진 질병인 쇼포마니아입니다. 또는 단순히 흐름을 늘리면 올바른 구매자의 가능성이 높아집니다.

그리고 장단점은 ... 보낸 시간과 작업에 대한 일종의 "고마워요"입니다.


저것들. 마이너스도 "고맙습니다"로 계산되나요? 그래서 그런 경우에 넣어야 하는지에 대한 당신의 태도와 다른 사람들은 얼마나 흥미롭게 생각하는지 알고 싶었습니다. 기사가 유해할 때/나쁠 때 또는 단순히 쓸모가 없을 때/비어 있을 때 넣을지 여부.
제 생각에 이 기사는 다음과 같은 이유로 등급이 상승한 것처럼 보입니다.
1. 필자가 제공한 유형의 문제는 많은 주석을 쓰기에 너무 게으르지는 않았지만 저자는 일반적으로 무시했습니다.
2. 기사에 명백한 부정확성이 있습니다. 이것이 유일한 방법이라고합니다.

V82 = 새 COMobject("V82.ComConnector"); 코드 = ContractorCOM.Code;


그러나 나는 다음과 같은 처리의 도움으로 침착하게 그것을 수행합니다.

Notify(Base.Directories.Counterparties.FindBy Name("LLC").Code);


그리고 모든 것이 괜찮습니다! 그리고 연결을 선택합니다. V82.ComConnector
저자가 자신의 기사에 지적된 문제가 포함되어 있다는 사실에 전혀 개의치 않는데도 아무런 반응을 보이지 않는 것이 어쩐지 이상하다.
3. 하지만 "클래스가 존재하지 않습니다"라는 오류가 뜨는데도 여전히 문제가 있습니다.
4. 하지만 8.2를 설치한 후 8.1을 설치하면 문제가 발생합니다. 일반적인 UT-BP 교환으로 OLE/COM을 통해 교환을 시도해보세요!
5. 초보자가 시간을 낭비하지 않도록 OLE / COM을 통해 보편적으로 연결할 수있는 사이트의 주요 처리를 알려주시겠습니까? 그건 그렇고, 어떤 이유로 그녀의 사진이 당신과 함께 과시합니다. 왜 그럴까요?. 그 결과, 장점에 대한 2개의 단어와 무대 뒤의 6개의 단어가 더 있습니다.

일반적으로 나는 당신에게 진흙을 던지지 않고 특정 격차를 지적하지만 반응이 없습니다. 이것이 당신이 공유하는 경험이라면 그것은 어떻게 든 잘못되고 불완전합니다.
내 말은, 만약 작가가 모든 결함을 수집하고 싶은 욕망이 있었다면, 그는 적어도 다른 사람의 경험을 경청할 수 있었고, 댓글을 헐뜯지 않을 수 있었습니다. 즉시 그것을 읽는 사람이 저자보다 더 많이 알고, 그들이 그에게 (때로는 틀리게) 말하고, 그는 또한 반격하는 상황이 있습니다. 결과적으로 모든 정보는 기사가 아니라 댓글에 있습니다! 재미있는! 종종 발생하지만 동시에 가장 원하는 것에 안주할 필요가 없습니다. 나는 그것이 더 나은 방법을 보여주고 다른 사람들은 그것을 보여줍니다! 이것을 기사에 포함시키면 가치가 있을 것입니다. 모든 사람이 이 교전을 읽는 데 관심이 있는 것은 아닙니다.

안녕하세요 Khabravchans입니다!

이 기사에서는 조직에서 1C 플랫폼과의 통합이 어떻게 확립되는지에 대해 이야기하고 싶습니다. 실질적으로 하게 만들었어요 완전한 결석 기술적 인 정보이 주제에. 1C를 정보 시스템과 연결하는 주제에 대한 다양한 기사와 보고서를 읽으면 문제와 솔루션의 본질을 반영하는 모든 마케팅, 시연 및 기술적인 것이 아님을 계속해서 확신하게 됩니다.

나는 그 방법이 결코 보편적이라고 주장하지 않는다는 것을 경고합니다. 1C 구성 자체가 많기 때문에 정보 시스템, 언어 및 플랫폼 - 더욱이 가능한 조합의 수는 엄청납니다. 내 목표는 하나의 가능한 솔루션을 보여주는 것입니다.


1C와 통합될 언어로 저는 Python을 선택했습니다. 프로세스 자동화에 매우 적합합니다. 이것은 최소한의 구문(코드가 매우 빠르게 입력됨), 풍부한 표준 라이브러리(타사 모듈이 덜 필요함), 교차 플랫폼에 의해 촉진됩니다. 높은 확률로 Linix OS에서 작성된 코드는 다음에서 성공적으로 작동합니다. 윈도우.

우선, 우리가 작업할 데이터의 개요를 설명하겠습니다. 극동 지역의 전원 공급 장치 회사 인 조직은 약 40 만 명의 가입자에게 서비스를 제공하며 기본은 자체 작성 구성의 1C입니다. 각 가입자에 대해 지불, 발생, 소비 서비스 및 계산 방식, 측정 장치, 판독값 및 기타 여러 데이터가 저장됩니다.

조직에는 Delphi로 작성되고 MSSQL/Firebird를 데이터베이스로 사용하는 프로그램이 있었습니다. 그 영광스러운 시간에 모든 언어를 사용하여 데이터베이스에 연결하고 채무자 가입자 선택, 후불 수령, 악기 판독 기록 등 많은 작업을 수행하는 것이 가능했습니다. 당연히 루틴을 자동화하는 스크립트 모음이 지속적으로 증가하고 있습니다. 프로그래머는 프로그램 자체를 열지 않고도 모든 작업을 수행할 수 있습니다.

아아, 1C로의 전환과 함께 공짜는 끝났습니다. 더 이상 데이터베이스에 직접 연결할 수 없었습니다. 일반적으로 1C 플랫폼 자체는 분리할 수 없으며 다른 시스템과 제대로 통합되지 않습니다. 그들이 말했듯이 그것은 그 자체로 사물입니다. 1C에 데이터를 로드할 때 거기에서 데이터를 추출하는 것이 그렇게 쉽지는 않을 것임을 기억해야 합니다. 그러나 조직이 지불 시스템 및 개인 영역, 해결책을 찾아야 했습니다.

내가 직면한 주요 작업은 특정 항목에 대한 데이터를 빠르게 얻을 수 있는 기능이었습니다. 개인 계정- 이름, 주소, 측정 장치, 계기 판독값, 지불, 요금. 또한 문서 형성 - 화해 행위, 지불 영수증. 따라서 데이터베이스에 직접 연결할 가능성은 없습니다. SQL 서버에서 1C 데이터베이스를 살펴본 모든 사람은 aaa1, aaa2와 같은 대량의 테이블에서 이를 알아내기가 어렵다는 것을 알았습니다. 그리고 이러한 테이블 및 필드 이름으로 쿼리를 작성하는 것은 비현실적입니다. 또한 많은 1C 테이블(특히 가장 중요한 것, 예를 들어 마지막 컷, 잔액 및 회전)은 가상이며 여러 물리적 테이블에 흩어져 여러 조인으로 모입니다. 이 방법은 적합하지 않습니다.

1C 플랫폼은 COM 연결을 통해 플랫폼에 연결할 수 있는 기능을 제공합니다. 많은 Windows 프로그램과 마찬가지로 1C를 설치하는 동안 두 개의 COM 개체(자동화 서버 및 COM 커넥터)가 시스템에 등록됩니다. COM 기술을 지원하는 언어를 사용하여 두 개체로 작업할 수 있습니다.

Automation Server 개체는 일반 클라이언트 응용 프로그램과 거의 다르지 않은 1C 응용 프로그램입니다. 차이점은 추가로 기회가 있다는 것입니다. 프로그램 제어애플리케이션 인스턴스. COM 커넥터 개체로 작업할 때 양식을 사용할 수 없는 1C 응용 프로그램의 경량 버전과 인터페이스 및 시각 효과. 응용 프로그램 자체는 "외부 연결" 모드에서 시작됩니다. 전역 변수의 초기화(예: 현재 사용자 및 그의 설정 확인)는 1C 외부 연결 모듈에서 수행해야 합니다. 외부 연결 모드에서 이 모드에서 사용할 수 없는 코드에서 함수가 호출되면 예외가 발생합니다(이는 Python 스크립트로 전달됨). 안전하지 않은 함수에 대한 호출은 다음 형식으로 구성되어야 합니다.

#If NOT OuterConnection then Warning("안녕하세요!"); #EndIf

COM 개체 작업은 Windows 전용 기술이므로 표준 Python 배포판에 포함되지 않은 것은 놀라운 일이 아닙니다. Python으로 Windows에서 프로그래밍하는 데 필요한 모든 기능을 제공하는 일련의 모듈인 확장을 설치해야 합니다. 이미 조립된 exe 설치 프로그램으로 다운로드할 수 있습니다. 확장 자체는 레지스트리, 서비스, ODBC, COM 개체 등에 대한 액세스를 제공합니다. 또는 Win32 확장이 기본 제공되는 ActiveState Python 배포를 즉시 설치할 수 있습니다.

한동안 웹 응용 프로그램, 특히 개인 계정을 개발할 때 COM 연결을 실험했습니다. 다음과 같은 단점이 확인되었습니다.

COM 연결이 느립니다. 낮은 성능은 잘 알려진 COM 기술의 단점입니다.
- 1C와의 연결을 설정하는 과정은 구성에 따라 1초에서 8초(내 경우 6초)가 소요될 수 있습니다. 말할 필요도 없이 각 요청에 대한 연결을 설정하면 각 페이지가 8초 안에 로드됩니다.
- python 웹 애플리케이션은 독립적인 서버로 동작하므로 일부 전역 변수에 연결을 저장하고 오류 발생 시 복구하여 이전 점을 보완할 수 있습니다. PHP에서 연결을 유지하는 방법은 솔직히 아직 생각하지 않았습니다.
- 크로스 플랫폼 웹 애플리케이션을 분실했습니다.

위에 나열된 요점을 기반으로 상호 작용 원리를 변경하기로 결정했습니다. 첫 번째 플랫폼 종속(Windows), 1C 데이터를 편리한 형식으로 언로드, 두 번째로 플랫폼 독립적인 두 부분으로 나눌 수 있습니다. 원칙적으로 1C에 대해 의심하지 않고 데이터 작업.

작업 전략은 다음과 같습니다. python 스크립트는 1C에 연결하고 실행합니다. 올바른 쿼리 SQLite 데이터베이스에 데이터를 업로드합니다. Python, PHP, Java에서 이 데이터베이스에 연결할 수 있습니다. 우리 프로젝트의 대부분은 파이썬으로 이루어지며, 저는 원시 SQL 쿼리를 손으로 작성하는 것을 싫어하기 때문에 SQLite 데이터베이스에 대한 모든 작업은 SQLAlchemy ORM을 통해 수행됩니다. 선언적 스타일로 데이터베이스 데이터 구조를 설명하기만 하면 됩니다.

sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key= True) 계정 = Column(Unicode(32), index=True) code = Column(Unicode(32)) address = Column(Unicode(512)) fio = Column(Unicode(256)) 소스 = Column(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(정수) flat = Column(정수) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "payments" # 등등...

이제 이 모듈을 Python 프로젝트로 가져오는 것으로 충분하며 데이터로 작업할 수 있습니다.

나는 당신의 질문을 예상합니다 - "왜 SQLite"입니까? 주된 이유- 데이터베이스는 읽기용으로만 필요하므로 SQLite 쓰기 문제에 대해 걱정할 필요가 없습니다. 둘째, 이 DBMS의 형식은 편리합니다. 보기가 더 편리합니다(많은 무료 유틸리티, FireFox용 슈퍼 확장 포함). 셋째, 어떤 경우에는 MySQL 서버에 연결되지 않은 시스템에서 구독자에 액세스해야 했습니다. 이 경우 SQLite 데이터베이스 파일을 복사하는 것으로 충분하며 이 시스템에서 모든 정보에 액세스할 수 있습니다.

하역은 밤에 하루에 한 번 발생합니다. 1C에 데이터를 입력하는 것도 같은 방식으로 자동화할 수 있습니다. 예를 들어 개인 계정 웹 사이트에 가입자가 남긴 판독 값을 기록해야 합니다. 이 경우 우리는 다시 1C에 연결하고 "증언을 받는 행위" 문서를 프로그래밍 방식으로 만들고 수행합니다. 아래에 코드를 제공하겠습니다.

Python에서 COM 개체로 작업하는 것은 다소 이례적입니다. 첫째, 코드의 "비단결성"이 손실되었습니다. 1C에서 변수와 함수의 이름을 지정하는 규칙은 간단히 말해서 Zen of Python과 일치하지 않습니다. 두 번째로, 1C 객체는 종종 키릴 문자라고 불리며 파이썬에서 개발할 때 문제를 일으킬 수 있다는 것을 모두가 알고 있습니다. 하지만 해결할 수 있습니다. 코드를 살펴보는 것이 좋습니다.

pythoncom 가져오기 win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

코드에서 볼 수 있듯이 클라이언트는 1C와 함께 작동하도록 초기화됩니다. COM 개체는 "V82.COMConnector"라는 이름으로 정의됩니다. 이 이름은 V8.2 플랫폼에 유효하며 버전 8.1이 있는 경우 이름은 "V81.COMConnector"가 됩니다.

초기화된 클라이언트에서 Connect() 메서드를 호출하여 연결 문자열을 전달합니다. 문자열은 서버 이름, 데이터베이스, 사용자 및 암호로 구성됩니다. 결과 V82 개체는 1C 응용 프로그램에 대한 연결을 저장합니다. Disconnect() 메서드 또는 이와 유사한 것이 없습니다. 베이스와의 연결을 끊으려면 del() 함수를 사용하여 메모리에서 객체를 제거하거나 변수를 None에 할당하면 충분합니다.

개체가 있으면 1C 전역 컨텍스트의 모든 필드와 메서드에 액세스하고 TabularDocument, TableValues ​​등과 같은 범용 개체로 작업할 수 있습니다. COM 연결을 통해 작업할 때 1C는 "외부 연결" 모드에서 작동합니다. 팝업 대화 상자, 알림 및 가장 중요한 양식과 같은 대화형 작업을 위한 기능은 포함되어 있지 않습니다. 문서 양식 모듈의 Button1Press() 프로시저에서 가장 중요한 기능을 래핑하는 구성 개발자를 두 번 이상 욕할 것이라고 확신합니다.

키릴 자모 속성과 같은 중요한 것에 대해 이야기합시다. 1C가 이중 언어 환경이고 각 러시아어 방법에 해당하는 영어가 있다는 사실에도 불구하고 조만간 키릴 자모 속성으로 전환해야 합니다. 켜진 경우 PHP 언어또는 VBSCript는 문제를 일으키지 않습니다.

Con 설정 = CreateObject("v81.COMConnector") v8 설정 =Con.Connect("연결 문자열") AccountsManager 설정 = v8.Documents.Accounts.... 설정 AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... 계정Write.Write()

그러면 파이썬 코드는 단순히 구문 오류로 충돌합니다. 무엇을 할까요? 구성을 수정하시겠습니까? 아니요, getattr 및 setattr 방법을 사용하십시오. COM 개체와 키릴 자모 속성 이름을 이러한 함수에 전달하면 다음과 같이 값을 가져오고 설정할 수 있습니다.

#coding=cp1251 카탈로그 = getattr(V82.Catalogs, "개인 계정")

다음이 중요합니다. 속성 이름과 함수 및 메서드 매개변수는 cp1251 인코딩으로 전달되어야 합니다. 따라서 사전에 코딩 혼동을 피하기 위해 파일의 시작 부분에 선언하는 것이 합리적입니다. #coding=cp1251. 그런 다음 인코딩에 대해 걱정하지 않고 문자열을 전달할 수 있습니다. 하지만! 1C에서 받은 모든 문자열(함수 호출, 요청 결과)은 UTF-8로 인코딩됩니다.

1C 환경에서 쿼리를 실행하고 결과를 반복하고 데이터베이스를 SQLite에 저장하는 코드의 예:

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS 코드, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS 주소, PersonalAccounts.Subscriber.Name AS fio, PersonalAccounts.Division.Name AS psu, EXPRESS(CharacteristicsPersonalAccountsSliceLast.Value AS Directory.Territorial GridOrganizations).Name AS tso, PersonalAccounts.Building.Settlement.Name AS np,PersonalAccounts.Building.Street.Name AS street, PersonalAccounts.Building.House AS 개인 계정 flat.Accounts Dression.The 아이.참고서의 mro로 이름.regests의 왼쪽 연결에 대한 얼굴 설명으로 거의 증거가 없습니다.신호의 특성.다음 (, vidcharacteristics = 값 (참조 도서. Vidcharacteristic. 영역 모양 기반) 감시. = V82.NewObject( "쿼리", q) 선택 = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() 동안 selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection.tso abonent.source = u"ASRN" abonent.np = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

여기서 CONN은 SQLite 데이터베이스와의 연결 세션입니다. 쿼리 개체가 생성되고 해당 텍스트가 채워집니다. 위에서 언급했듯이 요청 텍스트는 인코딩이 먼저 선언된 cp1251에 있어야 합니다. 쿼리가 실행된 후 중복이 추가되지 않도록 데이터베이스에서 모든 구독자를 삭제한 다음 주기로 추가하고 최종 커밋을 따릅니다.

요청으로 작업할 때 다음 규칙을 발견했습니다.

필드를 선택할 때 라틴어 이름을 지정하면 getattr() 대신 선택기(점)를 통해 필드에 액세스하는 것이 훨씬 편리합니다.
- 문자열, 숫자, 날짜 및 부울과 같은 기본 데이터 유형만 선택합니다. 개체(문서, 디렉터리)에 대한 링크를 선택하지 마십시오! 이 컨텍스트에서 참조의 속성이나 메서드에 액세스하면 COM 연결을 통한 요청이 발생하기 때문에 참조가 절대적으로 필요하지 않으며 심지어 해로울 수도 있습니다. 루프에서 링크 속성에 액세스하면 매우 느립니다.
- 날짜 필드를 선택하면 PyTime 객체로 반환됩니다. 이것은 COM 연결에서 날짜/시간을 전달하기 위한 특수 데이터 유형입니다. 일반적인 날짜 시간만큼 작업하는 것이 편리하지 않습니다. 이 객체를 int()에 전달하면 타임스탬프가 반환되고 fromtimestamp() 메서드를 사용하여 날짜/시간을 가져올 수 있습니다.

이제 인쇄된 문서가 어떻게 형성되는지 살펴보겠습니다. 사실 소비자는 지불 영수증이나 화해 행위와 같이 미리 준비된 문서를 다운로드할 수 있는 기회를 주어야 합니다. 이 문서는 설정된 요구 사항에 따라 1C로 생성되며 Python에서 구현하는 데 많은 시간이 걸립니다. 따라서 1C에서 문서를 생성하고 저장하는 것이 좋습니다 엑셀 형식.

따라서 화해법 문서는 특별에 의해 생성됩니다. 외부 처리. 1C 용어에 익숙하지 않은 사람들을 위해: 처리는 독립 실행형 프로그램, 1C 환경에서 실행되도록 설계된 자체 모듈, 양식, 템플릿이 있습니다. 처리를 초기화하고 세부 정보를 입력하고 우리에게 반환될 함수를 호출해야 합니다. 스프레드시트 문서, 1C에서 보기 위한 것입니다. 이 문서는 Excel 형식으로 저장하고 서버에 복사하거나 데이터베이스에 작성해야 합니다.

Link = getattr(V82.Catalogs, "SystemReports").FindByDescription("엘렌의 검증법") nav_url = V82.GetURL(link, "보고서") 이름 = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports.Create (이름) setattr(ExternalReport, "PersonalAccount", 참조) table_doc = ExternalReport.GetDoc() 경로 = V82.GetTempFileName("xls") table_doc.Write(경로, V82 .SpreadsheetDocumentFileType.XLS) 보고서 = models.Report() 보고서 .account = reference.Code.strip() report.type = u"act" report.document = open(경로, "rb").read() CONN.add(보고서)

위의 스니펫은 다음을 수행합니다. 문서를 구성하는 처리가 연결됩니다. 처리는 구성에 내장되어 디스크 또는 1C 데이터베이스(일종의 디렉토리)에 저장될 수 있습니다. 처리가 자주 변경되기 때문에 매번 구성을 업데이트하지 않기 위해 가장 자주 변경되는 처리는 "값 저장소" 유형의 속성으로 "ReportsSystem" 디렉터리에 Report라는 이름으로 저장됩니다. 처리는 데이터베이스에서 디스크로 언로드하고 로드하거나 디렉터리 요소 및 속성 이름에 대한 링크를 전달해야 하는 GetURL() 메서드를 통해 초기화될 수 있습니다. 수신된 처리 객체에 속성값을 할당하고 내보낸 GetDoc() 함수를 호출하여 임시 Excel 파일에 저장된 스프레드시트 문서를 가져옵니다. 이 파일의 내용은 SQlite 데이터베이스에 기록됩니다.

마지막으로 고려해야 할 사항은 프로그래밍 방식으로 1C에 데이터를 입력하는 것입니다. 가입자의 표시를 입력해야 한다고 가정해 보겠습니다. 이렇게하려면 "증거를 취하는 행위"문서를 작성하고 수행하는 것으로 충분합니다.

#coding=cp1251acts = getattr(V82.Documents, "간증취득행위") act =acts.CreateDocument() setattr(act, "표시", 1024.23) setattr(act, "구독자", "Ivanov") # 작성 다른 세부 사항에서..act.Write()
이제 데이터 입력이 자동화됩니다.

따라서 COM 연결을 사용하여 프로그래밍 방식으로 데이터를 업로드 및 다운로드하는 방법을 설명했습니다. 이 방법은 거의 1년 동안 우리 조직에서 성공적으로 운영되고 있습니다. 1C로 구성된 기반은 개인 계정뿐만 아니라 인터넷 획득(인터넷을 통한 카드 결제)의 3가지 결제 시스템을 제공합니다. 또한 데이터베이스가 연결되어 다양한 스크립트일상적인 자동화를 위해.

이 방법의 단점(COM 연결 속도가 느림)에도 불구하고 일반적으로 안정적으로 작동합니다. 모든 언어에서 작업할 수 있는 플랫폼 독립적 형식(SQLite)의 데이터가 있습니다. 그리고 코드의 주요 부분은 Python으로 작성되었습니다. 즉, 1C에서는 상상조차 할 수 없는 많은 도구와 기술을 사용할 수 있습니다.

이것은 다음 중 하나입니다. 가능한 방법 1C와의 상호 작용. 나는 그것이 새로운 것이 아니며 아마도 이미 누군가에 의해 테스트되고 최적화되었을 것이라고 확신합니다. 그러나 나는 내가 직접 밟은 함정에서 당신을 구하기 위해 가능한 한 많은 과정을 자세히 설명하려고 노력했습니다.

나는 당신에게 행운을 빕니다. 1C는 그려진 것처럼 무섭지 않다는 것을 기억하십시오!

인쇄(Ctrl+P)

1C 데이터베이스 간에 데이터를 교환하는 옵션 중 하나는 COM 연결을 통한 교환입니다. COM 연결을 사용하여 한 1C 데이터베이스에서 다른 데이터베이스로 연결하여 데이터를 읽거나 쓸 수 있습니다. 클라이언트-서버 버전의 데이터베이스와 파일 데이터베이스 모두에서 이 방법을 사용할 수 있습니다. 이 문서에서는 8.3 플랫폼에서 이러한 종류의 연결에 대해 설명합니다.

COM 연결

1C 응용 프로그램에 대해 두 가지 유형의 COM 개체를 만들 수 있습니다. 올레 커넥션즈입니다 V83.응용 프로그램 및 com 연결 V83.COM커넥터 . 의 경우 V83.응용 프로그램 1C 응용 프로그램의 거의 본격적인 사본이 시작됩니다. 사용의 경우 V83.COM커넥터작은 서버 부분이 시작됩니다. 이 경우 작업 속도는 더 빠르지만 일부 기능을 사용하지 못할 수 있습니다. 특히, 외부 연결 작업 속성이 설정되지 않은 양식 및 공통 모듈 작업. 주로 사용하셔야 합니다 V83.COM커넥터기능이 부족한 경우에만 V83.응용 프로그램. 속도의 차이는 특히 큰 데이터베이스에서 두드러질 수 있습니다. 플랫폼의 경우 8.2가 사용됩니다. V82.Application 또는 V82.COMConnector

OLE 연결 설정

연결 = 새 COMObject("V83.Application" ) ;

COM 연결 설정

연결 = 새 COMObject("V83.COMConnector" ) ;

연결 문자열

//클라이언트-서버 옵션의 경우
문자열 연결= "Srvr = " "서버 이름" ";Ref = " "베이스 이름" ;
//파일 모드 옵션의 경우:
문자열 연결= "파일 = " "PathBase" "; 사용자 = 사용자 이름; 비밀번호 = 비밀번호”;
시도
연결 = 연결 . 연결하다(연결 문자열) ;
예외
메시지 = 새 MessageToUser;
메시지 . 텍스트 = "데이터베이스에 연결하지 못했습니다" + 설명오류(); 메시지 . 신고하기();
종료 시도 ;

연결 끊기

연결 = 정의되지 않음 ;
개체의 경우 V83.응용 프로그램연결을 끊는 것이 필수입니다. 그렇지 않으면 불완전한 세션이 계속 중단되며 수동으로 삭제해야 합니다. 의 경우 V83.COM커넥터연결이 이루어진 절차가 끝나면 자동으로 연결이 종료되며, 또 한 번의 작은 순간이 있습니다. 연결 중인 사용자의 경우 설정에서 "프로그램을 닫을 때 확인 요청" 확인란을 비활성화해야 합니다.

NewObject() 메서드

새 객체를 생성하려면 NewObject() 메서드를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

~을 위한 V83.COM커넥터

요청COM = 연결. 새 개체( "요구 ") ;
테이블컴 = 연결. 새 개체( "가치 테이블") ;
ArrayCOM = 연결. NewObject("배열") ;

WidCOM = Connection.NewObject

~을 위한 V83.응용 프로그램

쿼리OLE = 연결. NewObject(" 요구 ") ;
TableOLE = 연결. 새 개체("가치 테이블") ;
ArrayOLE = Connection.NewObject("배열") ;
WidCOM = Connection.NewObject("고유 식별자", StringUID);

요청COM . 텍스트 ="선택하다
| 조직의 위치 코드,
| 조직의 직책. 이름
| 부터 | Directory.PositionsOrganizations
조직의 AS 입장”;

결과 = 요청COM. 실행하다 () ;
견본 = 결과. 선택하다 () ;
선택하는 동안. 다음()주기
엔드 사이클 ;
구성 개체 관리자를 사용할 수도 있습니다.
DirectoryCOM = 연결. 참고 도서. 디렉토리 이름;
문서컴 = 연결. 그 문서들. 문서 이름;
RegisterCOM = 연결. 레지스터 정보. 등록명 ;

COM 연결을 통해 열거형 가져오기 및 비교

구성에 정의된 열거 요소의 값을 비교하려면 이러한 요소를 기본 유형 중 하나로 변환해야 하며 비교가 어려움을 일으키지 않습니다. 이러한 유형은 숫자 유형 또는 문자열 유형일 수 있습니다. 열거형 요소의 값을 다음과 같은 숫자 유형으로 변환할 수 있습니다.

열거 요소 = Connection.Directories.Directory1.FindByCode(1).Attribute1;

가능한 값 = EnumElement.Metadata().EnumValues;

EnumElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumElement)));

EnumItemNumber = 0이면 보고( "열거값1");

ElseIf 열거 항목 번호 = 1 그 다음에보고서("열거값2");

EndIf;

COM을 통해 ID로 개체 가져오기

구성 개체 관리자를 통해 com 개체를 얻습니다. 예를 들면 다음과 같습니다.
문서컴 = 연결. 그 문서들. 문서 이름;

그런 다음 고유 식별자 문자열을 얻습니다.

StringUID = Connection.string( DocumentCOM.UniqueIdentifier())

아이디 = 신규 Y 고유ID(문자열UID);
에서 linkByIdentifier = 문서[문서명].GetLink(식별자);

ID로 문서로 com 개체를 찾아야 하는 경우 다음과 같이 작성해야 합니다.

WidCOM = 연결.새 개체("고유 식별자",StringUID );
LinkByIdentifier = Connection.Documents[문서 이름].GetLink(UidCOM);

1C 데이터베이스 간에 데이터를 교환하는 옵션 중 하나는 COM 연결을 통한 교환입니다.

COM 연결을 사용하여 한 1C 데이터베이스에서 다른 데이터베이스로 연결하여 데이터를 읽거나 쓸 수 있습니다. 클라이언트-서버 버전의 데이터베이스와 파일 데이터베이스 모두에서 이 방법을 사용할 수 있습니다. 이 기사에서는 그러한 화합물의 예를 분석할 것입니다. 예제에서는 플랫폼 8.2를 사용합니다.

1C 응용 프로그램에 대해 두 가지 유형의 COM 개체를 만들 수 있습니다. 그것 V82.응용 프로그램그리고 V82.COM커넥터. 의 경우 V82.응용 프로그램 1C 응용 프로그램의 거의 본격적인 사본이 시작됩니다. 사용의 경우 V82.COM커넥터작은 서버 부분이 시작됩니다.
이 경우 작업 속도는 더 빠르지만 일부 기능을 사용하지 못할 수 있습니다. 특히 외부 연결 작업 속성이 설정되지 않은 양식 및 공통 모듈 작업. 주로 사용하셔야 합니다 V82.COM커넥터기능이 부족한 경우에만 V82.응용 프로그램. 속도의 차이는 특히 큰 데이터베이스에서 두드러질 수 있습니다.

시작하겠습니다.

  1. COM 객체를 생성하자
    • ~을 위한 V82.응용 프로그램연결 = 새 COMObject("V82.Application" ) ;
    • ~을 위한 V82.COM커넥터연결 = 새 COMObject("V82.COMConnector" ) ;
  2. 연결 문자열을 생성해 보겠습니다.
    • 데이터베이스의 서버 버전용 ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • 데이터베이스의 파일 버전용 ConnectionString = "File = " "PathKBase" "; Usr = 사용자 이름; Pwd = 암호";
  3. 데이터베이스에 연결하기연결 시도 = 연결. 연결(연결 문자열) ; 예외 메시지 = 새 MessageToUser; 메시지. 텍스트 = + 설명Errors() ; 메시지. 신고하기() ; 종료 시도 ;
  4. 베이스에서 분리연결 = 정의되지 않음 ;

    개체의 경우 V82.응용 프로그램연결을 끊는 것이 필수입니다. 그렇지 않으면 불완전한 세션이 계속 중단되며 수동으로 삭제해야 합니다. 의 경우 V82.COM커넥터연결이 이루어진 절차가 끝나면 자동으로 연결이 종료되며, 또 한 번의 작은 순간이 있습니다.

    연결 중인 사용자의 경우 설정에서 "프로그램을 닫을 때 확인 요청" 확인란을 비활성화해야 합니다.

이제 모든 코드를 통합해 보겠습니다.

연결 = 새 COMObject("V82.Application" ) ; //연결 = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = ""Server1C"";Ref = ""MyBase"", Usr = Peter, Pwd = 123" ; //ConnectionString = "파일 = ""С:\MyBase""; Usr = Peter; Pwd = 123";연결 시도 = 연결. 연결(연결 문자열) ; 예외 메시지 = 새 MessageToUser; 메시지. 텍스트 = "데이터베이스에 연결할 수 없습니다"+ 설명오류() ; 메시지. 신고하기() ; 종료 시도 ; 연결 = 정의되지 않음 ;

연결 유형의 경우 V82.응용 프로그램메서드는 원래 생성된 COM 개체에 적용되며, V82.COM커넥터방법이 연결에 적용됩니다. 요청에 대한 추가 작업이 진행됩니다. 표준 수단 1C. 코드에서 다음과 같이 보입니다.

요청 = 연결. NewObject("요청") ; // 을 위한 V82.COM커넥터 요청 = 연결. NewObject("요청") ; // 을 위한 V82.응용 프로그램 요구. 텍스트 = "선택 | 조직의 위치 코드, | 조직의 직책. 이름| 부터 | 디렉토리. 조직의 위치 AS 조직의 위치 "; 결과 = 요청. 실행하다 () ; 샘플 = 결과. 선택하다() ; 선택하는 동안. Next() 사이클 EndCycle ;

버전 1C:Enterprise 8.3의 경우 COMObject를 생성할 때 "V83.COM커넥터"또는 V83.응용 프로그램.