1s에서 com 연결을 통해 데이터를 수신합니다. COM 개체 작업의 세 가지 원칙. COM 연결을 통한 작업은 생각보다 쉽습니다. OLE 연결 설정

인쇄(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 연결 설정

연결 = New COMObject(“V83.Application” ) ;

COM 연결 설정

연결 = 새 COMObject(“V83.COMConnector” ) ;

연결 문자열

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

단절

연결 = 정의되지 않음;
객체의 경우 V83.응용프로그램연결을 종료해야 합니다. 그렇지 않으면 불완전한 세션이 남아 있으므로 수동으로 삭제해야 합니다. 다음의 경우 V83.COM커넥터연결이 이루어진 절차가 완료되면 연결이 자동으로 끊어집니다.그리고 작은 점이 하나 더 있습니다. 연결 중인 사용자의 경우 해당 설정에서 "프로그램 종료 시 확인 요청" 확인란을 비활성화해야 합니다.

NewObject() 메서드

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

을 위한 V83.COM커넥터

요청COM = 연결. 새객체( "요구 ") ;
테이블COM = 연결. 새객체( “가치표”) ;
ArrayCOM = 연결. NewObject("배열" ) ;

ViewCOM =Connection.NewObject

을 위한 V83.응용프로그램

요청OLE = 연결. NewObject(“ 요구 ") ;
TableOLE = 연결. 새객체(“가치표”) ;
ArrayOLE = Connection.NewObject(“배열”) ;
ViewCOM =Connection.NewObject(“고유 식별자”, StringUID);

요청COM . 텍스트 ="선택하다
| 조직의 위치 코드,
| 조직의 직위.이름
|발신 | 디렉토리.조직의 위치
조직의 위치는 어떻게 되나요?”;

결과 = 요청COM. 달리다();
견본 = 결과. 선택하다 () ;
안녕 선택. 다음()주기
엔드사이클 ;
구성 개체 관리자를 사용할 수도 있습니다.
DirectoryCOM = 연결. 디렉토리. 디렉터리 이름;
DocumentCOM = 연결. 선적 서류 비치. 문서이름;
RegisterCOM = 연결. 정보 레지스터. 등록명 ;

COM 연결을 통해 열거형 수신 및 비교

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

열거형 항목 = Connection.Directories.Directory1.FindByCode(1).Props1;

PossibleValues ​​​​= Enum Element.Metadata().Enum 값;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

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

ElseIfEnumerationItemNumber = 1 그 다음에 Report("EnumerationValue2");

endIf;

식별자로 COM을 통해 객체 검색

구성 개체 관리자를 통해 다음과 같은 com 개체를 얻습니다.
DocumentCOM = 연결. 선적 서류 비치. 문서이름;

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

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

식별자 = 새로운 U 고유 식별자(StringUID);
와 함께 linkByIdentifier = 문서[문서 이름].GetLink(식별자);

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

위드컴 = 연결.새객체(“고유 식별자”, StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

안녕하세요 카브라찬 여러분!

이 기사에서는 조직에서 1C 플랫폼과의 통합이 어떻게 구축되는지에 대해 이야기하고 싶습니다. 제가 이 일을 하게 된 계기는 거의 완전한 부재였습니다. 기술적 인 정보이 주제에 대해서. 1C를 모든 정보 시스템과 연결하는 주제에 대한 다양한 기사와 보고서를 읽으면 해당 내용이 모두 마케팅, 데모 성격이며 기술적이지 않으며 문제와 솔루션의 본질을 반영한다는 것을 계속해서 확신하게 됩니다.

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


1C에 통합될 언어로 Python을 선택했습니다. 프로세스 자동화에 매우 적합합니다. 이는 구문의 미니멀리즘(코드가 매우 빠르게 입력됨)으로 인해 촉진됩니다. 표준 라이브러리(타사 모듈이 덜 필요함), 크로스 플랫폼 - Linux OS로 작성된 코드가 Windows에서 성공적으로 작동할 확률이 높습니다.

우선, 우리가 작업할 데이터의 개요를 설명하겠습니다. 이 조직은 극동 지역의 에너지 판매 회사로 약 40만 명의 가입자에게 서비스를 제공하고 1C 데이터베이스는 맞춤형 구성을 기반으로 합니다. 각 가입자에 대해 지불, 요금, 소비된 서비스 및 계산 체계, 미터, 판독값 및 기타 여러 데이터가 저장됩니다.

옛날 옛적에 한 조직에 델파이로 작성되고 MSSQL/Firebird를 데이터베이스로 사용하는 프로그램이 있었습니다. 그 영광스러운 시절에는 어떤 언어로든 데이터베이스에 연결하고 채무자 구독자 선택, 지불금 지급 후 기록, 기기 판독값 기록 등 다양한 작업을 수행할 수 있었습니다. 루틴을 자동화하는 스크립트 모음이 지속적으로 증가하고 있다는 것은 놀라운 일이 아닙니다. 프로그래머는 프로그램 자체를 열지 않고도 모든 작업을 수행할 수 있습니다.

아아, 1C로 전환하면서 공짜가 종료되었습니다. 더 이상 데이터베이스에 직접 연결할 수 없습니다. 일반적으로 1C 플랫폼 자체는 분할할 수 없으며 다른 시스템과의 통합에 적합하지 않습니다. 그녀는 그들이 말했듯이 그 자체로 사물입니다. 1C에 데이터를 로드할 때 거기에서 데이터를 추출하는 것이 그리 쉽지 않다는 점을 기억해야 합니다. 그러나 조직이 지불 시스템을 구현해야 한다는 사실을 고려하여 개인 영역, 어떤 해결책을 찾아야 했습니다.

제가 직면한 주요 작업은 특정 항목에 대한 데이터를 빠르게 얻는 능력이었습니다. 개인 계정- 이름, 주소, 검침 장치, 검침, 지불, 요금. 또한 문서 생성 - 조정 보고서, 지불 영수증. 따라서 데이터베이스에 직접 연결할 가능성은 없습니다. SQL 서버에서 1C 데이터베이스를 본 사람은 누구나 aaa1, aaa2와 같은 테이블의 질량을 이해하기 어렵다는 것을 알았습니다. 그리고 그러한 테이블 및 필드 이름을 사용하여 쿼리를 작성하는 것은 비현실적입니다. 또한 많은 1C 테이블(특히 최신 조각, 잔액 및 회전과 같은 가장 중요한 테이블)은 가상이며 여러 조인을 통해 수집된 다양한 물리적 테이블에 분산되어 있습니다. 이 방법은 적합하지 않습니다.

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

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

#OuterJoin이 아닌 경우 Warning("Hello!"); #EndIf

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

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

COM 연결이 느립니다. 낮은 성능은 COM 기술의 잘 알려진 단점입니다.
- 구성에 따라 1C와 연결을 설정하는 프로세스는 1~8초(제 경우에는 6초)가 걸릴 수 있습니다. 말할 필요도 없이 각 요청에 대한 연결을 설정하면 각 페이지를 로드하는 데 8초가 걸립니다.
- Python의 웹 애플리케이션은 독립된 서버로 작동하기 때문에 일부 전역 변수에 연결을 저장하고 오류 발생 시 복원함으로써 이전 지점을 보완할 수 있습니다. 솔직히 아직 PHP에서 연결을 유지하는 방법에 대해서는 생각해 본 적이 없습니다.
- 웹 애플리케이션의 크로스 플랫폼 기능이 손실됩니다.

위에 나열된 사항을 바탕으로 상호 작용의 원리를 변경하여 두 부분으로 나누기로 결정했습니다. 첫 번째는 플랫폼 종속적(창 기반)으로 1C 데이터를 편리한 형식으로 업로드하고, 두 번째는 플랫폼 독립적입니다. 원칙적으로 1C에 대해 전혀 의심하지 않고 데이터 작업이 가능합니다.

작업 전략은 다음과 같습니다. Python 스크립트가 1C에 연결하고 필요한 쿼리를 실행하며 데이터를 SQLite 데이터베이스에 업로드합니다. Python, PHP, Java에서 이 데이터베이스에 연결할 수 있습니다. 우리 프로젝트의 대부분은 Python으로 작업하며 원시 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)) 주소 = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) flat = Column(Integer) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "지불" # 등등...

이제 이 모듈을 Python 프로젝트로 가져오기만 하면 데이터 작업을 할 수 있습니다.

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

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

Python에서 COM 개체를 사용하여 작업하는 것은 약간 특이합니다. 첫째, 코드의 "Pythonicity"가 손실됩니다. 1C에서 변수 및 함수 이름을 지정하는 규칙은 가볍게 말하면 Python의 Zen과 일치하지 않습니다. 둘째, 1C 객체의 이름이 키릴 문자로 명명되는 경우가 많아 Python으로 개발할 때 문제를 일으킬 수 있다는 사실은 모두가 알고 있지만... 해결할 수 있습니다. 코드를 살펴보는 것이 좋습니다.

Import pythoncom import 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, ValueTable 등과 같은 범용 개체로 작업할 수 있습니다. COM 연결을 통해 작업할 때 1C는 "외부 연결" 모드에서 작동한다는 점에 유의하는 것이 중요합니다. 팝업 대화 상자, 알림 및 가장 중요한 양식과 같은 대화형 기능을 허용하지 않습니다. 나는 당신이 문서 양식 모듈의 Button1Press() 프로시저에서 가장 중요한 기능을 포함하는 구성 개발자를 여러 번 저주할 것이라고 확신합니다.

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

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Connection string") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... 계정레코드.쓰기()

그러면 Python 코드는 구문 오류로 인해 충돌이 발생합니다. 무엇을 해야 할까요? 구성을 편집하시겠습니까? 아니요, getattr 및 setattr 메소드를 사용하는 것으로 충분합니다. COM 개체와 속성의 키릴 문자 이름을 이러한 함수에 전달하면 그에 따라 값을 가져오고 설정할 수 있습니다.

#coding=cp1251 카탈로그 = getattr(V82.Catalogs, "PersonalAccounts")

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

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

#coding=cp1251 q = """ 개인 계정 선택. 코드 AS 코드, 개인 계정. 건물. 정산. 이름 + ", " + 개인 계정. 짧은 주소 AS 주소, 개인 계정. 가입자. 이름 AS fio, 개인 계정. 부문. 이름 AS psu, EXPRESS(마지막 개인 계정 조각의 특성. 값 AS 디렉터리. 영토 네트워크 조직). 이름 AS tso, 개인 계정. 건물. 거주 지점. 이름 AS np, 개인 계정. 건물. 거리. 이름 AS 거리, 개인 계정 건물. 집 AS 집, 개인 계정 a.MainRoom.RoomNumber AS flat , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts 왼쪽 연결 RegisterInformation.CharacteristicsPersonalAccounts.Slice of the Last(, TypeCharacteristics = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS CharacteristicsL PersonalAccountsSliceLast 소프트웨어 PersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.NewObject("Query", q) 선택 = query.Execute().Choose( ) CONN = db.connect() CONN.query(models.Abonent).delete() while Selection.Next(): abonent = models.Abonent() abonent.account = Selection.code.strip() abonent.code = 선택 .code abonent.fio = Selection.fio abonent.address = Selection.address abonent.psu = Selection.psu abonent.tso = 선택.tso abonent.source = u"ASRN" abonent.np = Selection.np abonent.street = 선택 .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에서 볼 수 있는 스프레드시트 문서를 반환하는 함수를 호출해야 합니다. 이 문서는 엑셀 형식으로 저장되어야 하며, 서버에 복사되거나 데이터베이스에 기록되어야 합니다.

Link = getattr(V82.Catalogs, "시스템 보고서").FindByDescription("Ellen 조정 보고서") nav_url = V82.GetURL(link, "보고서") name = V82.ExternalReports.Connect(nav_url) 외부Report = V82.ExternalReports. (이름) setattr(ExternalReport, "PersonalAccount", 참조) table_doc = 외부Report.GetDoc() 경로 = V82.GetTempFileName("xls") table_doc.Write(경로, V82 .SpreadsheetDocumentFileType.XLS) 보고서 = models.Report() 생성 보고서 .account = reference.Code.strip() 보고서.유형 = u"act" 보고서.문서 = open(경로, "rb").read() CONN.add(보고서)

위 조각은 다음을 수행합니다. 문서를 생성하는 처리가 연결됩니다. 처리는 구성에 내장되어 디스크 또는 1C 데이터베이스(일부 디렉터리)에 저장될 수 있습니다. 처리는 자주 변경되므로 매번 구성을 업데이트하지 않기 위해 가장 자주 변경되는 처리는 "시스템 보고서" 디렉터리의 보고서라는 "값 저장" 속성에 저장됩니다. 처리는 데이터베이스에서 디스크로 언로드한 후 로드하거나 디렉터리 요소에 대한 링크와 속성 이름을 전달해야 하는 GetURL() 메서드를 사용하여 초기화할 수 있습니다. 수신된 처리 개체에 세부 정보 값을 할당하고, 내보낸 함수 GetDoc()을 호출하고, 임시 Excel 파일에 저장된 스프레드시트 문서를 수신합니다. 이 파일의 내용은 SQLite 데이터베이스에 기록됩니다.

마지막으로 고려해야 할 사항은 프로그래밍 방식으로 데이터를 1C에 입력하는 것입니다. 구독자의 증언을 입력해야 한다고 가정해 보겠습니다. 이를 위해서는 "증언을받는 행위"문서를 작성하고 실행하는 것으로 충분합니다.

#coding=cp1251 act = getattr(V82.Documents, "증언을 받는 행위") act = act.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # 작성 다른 세부사항에서는... act.Write()
이제 데이터 입력이 자동화되었습니다.

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

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

이것은 다음 중 하나입니다 가능한 방법 1C와의 상호 작용. 나는 그것이 새로운 것이 아니며 아마도 이미 누군가에 의해 테스트되고 최적화되었을 것이라고 확신합니다. 하지만 제가 밟은 함정으로부터 여러분을 보호하기 위해 가능한 한 많은 과정의 세부 사항을 제시하려고 노력했습니다.

모두에게 행운이 있기를 바라며, 1C는 생각만큼 무섭지 않다는 점을 기억하세요!

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

COM 연결을 사용하면 하나의 1C 데이터베이스에서 다른 데이터베이스로 연결하고 데이터를 읽거나 쓸 수 있습니다. 이 방법은 클라이언트-서버 버전의 데이터베이스와 파일 데이터베이스 모두에서 사용할 수 있습니다. 이 기사에서는 이러한 연결 유형의 예를 살펴보겠습니다. 예제에서는 플랫폼 8.2를 사용합니다.

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

그럼 시작해 볼까요

  1. COM 개체를 만들어 보겠습니다.
    • 을 위한 V82.응용프로그램 Connection = New COMObject("V82.Application" ) ;
    • 을 위한 V82.COM커넥터연결 = New COMObject("V82.COMConnector" ) ;
  2. 연결 문자열을 만들어 보겠습니다.
    • 데이터베이스의 서버 버전인 경우 ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • 데이터베이스의 파일 버전에 대해 ConnectionString = "File = " "PathKBase" "; Usr = 사용자 이름; Pwd = 비밀번호";
  3. 데이터베이스에 연결연결 시도 = 연결. 연결(ConnectionString) ; 예외 메시지 = New MessageToUser; 메시지. 텍스트 = + 오류 설명() ; 메시지. 신고하기() ; 시도 종료 ;
  4. 데이터베이스 연결 끊기연결 = 정의되지 않음;

    객체의 경우 V82.응용프로그램연결을 종료해야 합니다. 그렇지 않으면 불완전한 세션이 남아 있으므로 수동으로 삭제해야 합니다. 다음의 경우 V82.COM커넥터연결이 이루어진 절차가 완료되면 연결이 자동으로 끊어집니다.그리고 작은 점이 하나 더 있습니다.

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

이제 모든 코드를 하나로 묶어보자

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

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

요청 = 연결. NewObject("요청" ) ; // 을 위한 V82.COM커넥터 요청 = 연결. NewObject("요청" ) ; // 을 위한 V82.응용프로그램 요구. 텍스트 = "선택 | 조직의 위치 코드, | 조직의 직위.이름|발신 | 디렉토리. 조직의 위치 AS 조직의 위치"; 결과 = 요청. 달리다(); 샘플 = 결과. 선택하다() ; 안녕 선택. Next() 루프 EndLoop ;

버전 1C:Enterprise 8.3의 경우 COM 개체를 생성할 때 사용해야 한다는 점을 제외하면 모든 것이 변경되지 않았습니다. "V83.COM커넥터"또는 "V83.응용프로그램".

) 좋아요

동시에, 나는 10점에도 도달하지 못한 출판물이 단순히 "떠오르는" 경우를 여러 번 보았습니다.
왜 이런 일이 일어났나요? 분명히 누군가가 그들을 좋아했기 때문인 것 같습니다.


등급 기사를 읽지 않고도 얼마나 필요한지 이해하거나 너무 원시적이지 않게 +/-로 평가하는 것이 좋을 것이라는 것입니다. 내가 좋아하는 점은 이렇게 수정하겠습니다. 별이 정렬되고 많은 사람들이 사이트에 모여서 많은 사람들이 좋아했기 때문에 많은 것을 얻었습니다. 이것이 우연의 문제라는 것을 당신 스스로 이해합니다. 기사가 나오자마자 홈페이지그러면 이미 요청을 통해서만 찾을 수 있으므로 모든 사람이 투표를 통해 전달됩니다. 그리고 제가 아는 한, 지속적인 댓글 = 기사 홍보를 통해 해당 기사를 메인 페이지에 유지할 수 있습니다.
이것이 바로 그들이 공공 거리에 상점을 놓는 이유입니다. 결국 중요한 것은 상품의 품질과 관련성이 아니라 장소의 교통 가능성입니다. 걷는 사람들은 종종 다음날 버릴 물건을 사지만, 과정을 위해서. 이것은 쇼핑 중독이라는 오랫동안 모든 사람에게 알려진 질병입니다. 또는 단순히 흐름을 늘리면 올바른 구매자를 찾을 가능성이 높아집니다.

그리고 장단점은... - 이것은 단지 시간과 노력을 들인 것에 대해 일종의 "감사합니다"입니다.


저것들. 마이너스도 "감사합니다"로 간주되나요? 그러한 경우에 사용해야 하는지, 다른 사람들은 얼마나 흥미롭게 생각하는지에 대한 귀하의 의견을 알고 싶었습니다. 기사가 해롭거나 나쁠 때 넣어야 합니까, 아니면 단순히 쓸모가 없거나 비어 있을 때 넣어야 합니까?
내 생각에 이 기사는 다음과 같은 이유로 단순한 평점 상승처럼 보입니다.
1. 내가 인용한 유형의 문제는 저자가 완전히 무시했지만 그는 많은 댓글을 쓰기에는 너무 게으르지 않았습니다.
2. 기사에는 명백한 부정확성이 있습니다. 이것이 유일한 방법이라고 합니다.

V82 = 새 COMObject("V82.ComConnector"); 코드 = AccountCOM.Code;


하지만 다음과 같은 처리를 사용하면 쉽게 할 수 있습니다.

Report(기본. 디렉터리. 상대방. 이름으로 찾기("LLC"). 코드);


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

대체적으로 진흙탕을 던지지 않고 구체적으로 빈틈을 지적하는데 반응이 0이다. 이것이 당신이 공유하고 있는 경험이라면, 그것은 다소 오류가 있고 불완전한 것입니다.
내 요점은 작성자가 모든 결함을 수집하려는 욕구가 있다면 최소한 다른 사람의 경험을 듣고 댓글을 달지 않을 수 있다는 것입니다. 그것을 읽는 사람이 저자보다 더 많은 것을 알고 그에게 (때로는 부정확하게) 말하고 반격하는 상황이 즉시 발생합니다. 결과적으로 모든 정보는 기사가 아닌 댓글에 있습니다! 재미있는! 이런 일이 자주 발생하지만 최고를 원했다는 사실에 집중할 필요는 없습니다. 나는 최고가 무엇인지 보여주고 다른 사람들은 그것을 보여줍니다! 이 내용을 기사에 포함시키면 가치가 있을 것입니다. 모든 사람이 이 전투를 읽는 데 관심이 있는 것은 아닙니다.

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

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

1C에서 COM 연결을 구현하려면 COMConnector라는 특수 메커니즘이 사용됩니다. 이 객체는 플랫폼과 함께 설치되어 통신에 사용됩니다. 정보 기지. 버전 8.2 및 8.3의 경우 각각 "V82.COMConnector" 및 "V83.COMConnector"라는 서로 다른 이름을 가진 개체가 사용된다는 점에 유의해야 합니다.

데이터베이스에 대한 COM 연결 기간에는 라이센스가 필요하다는 점을 기억하십시오. 여러 연결을 동시에 실행하는 데 너무 몰두하지 마십시오. 이는 제한된 수의 라이선스를 보유한 조직에 특히 중요합니다. 이 문제는 다음을 사용하여 해결할 수 있습니다. 일상적인 작업정보베이스에 대한 활성 사용자 연결이 없을 때 실행됩니다.

다른 데이터베이스에 연결하고 필요한 정보를 요청하려면 다음 데이터를 알아야 합니다.

  1. 파일 또는 클라이언트-서버 유형은 무엇입니까?
  2. 어디에 위치해 있나요?
  3. 로그인할 때 사용할 수 있는 이름과 비밀번호는 무엇입니까?
  4. 어떤 데이터에 관심이 있나요?

처음 세 지점부터 COM 연결을 구현하려면 매개변수 문자열을 생성해야 합니다. 정보보안 종류에 따라 다르지만 모습. 수신된 문자열을 사용하여 연결이 이루어지며 이를 통해 다른 데이터베이스에서 데이터를 수집하여 어떤 방법으로든 분석 및 처리할 수 있습니다.

연결 매개변수FileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; 연결 매개변수ClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

연결 기능은 간단하며 모든 매개변수가 올바르게 지정되면 어떤 의문도 제기해서는 안 됩니다. 디버깅 및 분석 속도를 높이기 위해 가능한 오류"Try" 구성에 연결을 포함하는 것이 좋습니다. 이 함수는 필요한 데이터를 얻기 위해 작업하는 "COM 개체" 유형의 값을 반환합니다.

&OnServer 함수 ConnectToBase() 내보내기ConnectionIB 매개변수 = "File=""E:\1c Database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= 새 COMObject("V83.COMConnector"); V83COMCon.Connect(IB 연결 매개변수) 반환 시도; 예외 보고서(ErrorDescription()); 정의되지 않은 반환; 시도 종료; EndFunction

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

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

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

&OnServer 프로시저 TestCOMOnServer() 연결 = ConnectToBase(); If TypeValue(연결) Type("정의되지 않음") Then RequestBPZO = Connection.NewObject("요청"); RequestBPZO.Text = "처음 15개 선택 | DirectoryUser.Name AS 이름 |FROM | Directory.users AS DirectoryUser"; 선택 = RequestBPZO.Execute().select(); While Selection.next() 루프 Report(Selection.Number); 엔드사이클; endIf; 절차 종료 >

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

  • 선();
  • 숫자();
  • 날짜().
RequestBPZO = Connection.NewObject("요청"); RequestBPZO.Text = "처음 15개 선택 | DirectoryUser.Name AS 이름 | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | 그리고 DirectoryUser.Name like ""%"" + &RequiredName+ ""%""" ; Request BPZO.SetParameter("필수 부서", 연결. 디렉터리. 기업 구조. 코드로 찾기("00-000023")); RequestBPZO.SetParameter("RequiredName","에카테리나"); 선택 = RequestBPZO.Execute().select(); While Selection.next() 루프 Report(Selection.Name); 엔드사이클;

부서와 같은 여러 매개변수를 기반으로 선택하기 위해 배열을 데이터베이스로 전송해야 하는 경우 NewObject 명령도 사용됩니다. 마찬가지로 값 목록이나 테이블을 전달하여 연결을 통해 다른 데이터베이스의 요소로 채울 수 있습니다. 플랫폼의 모든 기존 개체 방법과 메커니즘을 검색에 사용할 수 있습니다.

RequestBPZO = Connection.NewObject.("요청"); RequestBPZO.Text = "첫 번째 15개 선택 | DirectoryUser.Name AS 이름 | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | 그리고 DirectoryUser.Name은 ""%"" + &NecessaryName+ ""%" "와 같습니다. "; 부서 배열 = Connection.NewObject("Array"); 부서 배열.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); 부서 배열.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); 부서 배열.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); Request BPZO.SetParameter("필수 부서", 부서 배열); RequestBPZO.SetParameter("RequiredName","에카테리나"); 선택 = RequestBPZO.Execute().select(); While Selection.next() 루프 Report(Selection.Name); 엔드사이클;

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

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

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

화합물..; VariableFunction = 연결..; 함수 호출>일반 모듈 이름>프로시저 호출>일반 모듈 이름>

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