데이터 분리 메커니즘 1s. RLS 대신 데이터 공유 메커니즘 사용

주목! 다음은 자료가 완전하지 않을 수 있는 강의의 평가판입니다.

학생으로 로그인

학교 콘텐츠에 액세스하려면 학생으로 로그인하세요.

초보 프로그래머를 위한 내부 프로그래밍 언어 1C 8.3: 1C 형식

1C로 프로그래밍할 때 다양한 유형(문자열, 날짜, 숫자 ...)의 값을 (동일한 보고서에) 표시해야 하는 경우가 많습니다. 각 값은 다른 표현을 가지고 있습니다.

예를 들어, 동일한 날짜 "01/01/2005"는 다음과 같은 문자열로 나타낼 수 있습니다.

  1. "01.01.2005"
  2. "2005년 1월 1일"
  3. "01.01.05"

모두 동일한 값의 문자열 표현입니다. 1C에서 특수 기능이 사용되는 형성을 위해 체재.

1C에서 형식 기능 사용

숫자 그룹화 비활성화

숫자 10000을 인쇄하고 싶다고 가정합니다.

우리가 쓰면:

형식 문자열은 일반적으로 등호로 구분된 두 부분으로 구성됩니다. equals의 왼쪽에는 설정할 매개변수의 이름이 있고(도움말이나 예제 참조) 오른쪽에는 이 매개변수의 값이 있습니다.

위의 예에서 형식 문자열 "NG=0"에는 매개변수 NG와 값 0이 있습니다. 이 조합은 숫자의 그룹을 해제합니다. 보시다시피 이제 10000이 표시됩니다.

선행 0 제거

숫자 앞에 선행 0을 출력하는 것도 일반적인 작업입니다. 예를 들어 숫자 5에 0을 앞에 두고 "05" 형식으로 표시하려고 한다고 가정해 보겠습니다.

보고서(Format(5 , "FH=2; FH=" ) ) ; // 출력 05

형식 문자열 "FZ=2; HVN="를 구문 분석해 보겠습니다. 세미콜론으로 구분된 두 개의 형식 문자열로 구성됩니다. 각각을 개별적으로 분석해 봅시다.

"CHT=2" 행은 정수 및 소수 부분에 대해 표시되는 총 소수 자릿수를 설정합니다. 따라서 출력할 때 숫자가 차지하는 총 위치 수는 2가 됩니다.

도움말에서 다음과 같이 문자열 "HVN="은 형식 함수에 숫자가 선언된 길이에 도달하지 않으면(이 경우와 같이 2개의 위치를 ​​표시했고 5는 1개만 차지하기 때문에) 다음을 나타냅니다. 선행 0을 사용해야 합니다. 이 형식 문자열의 특징은 매개변수 이름과 등호만 있고 값이 없다는 것입니다. 당신은 레슨의 평가판을 읽고 있으며, 전체 레슨이 있습니다.

두 형식 문자열의 조합은 "5" 대신 "05"가 필요한 결과를 제공합니다.

소수 구분 기호 변경

점 대신 별표 구분 기호를 사용하여 분수를 표시해야 한다고 가정합니다. 즉, 25.46이 "25 * 46"으로 표시되도록:

형식 문자열은 DF 매개변수와 함수를 나타내는 dddd 값입니다. 체재요일의 긴 표현을 출력합니다(포함된 "d"의 수에 유의하십시오).

날짜의 월 표현

월별 설명은 다음과 같이 표시됩니다.

Report(Format("20050101" , "DF=MMMM" ) ) ; // 1월을 출력

형식 문자열은 앞의 경우와 동일한 DF 매개변수를 가집니다. 그러나 의미는 다릅니다. 이제 MMMM입니다.

시험을보다

테스트 시작

1. 형식("19050505", "DF=MMMM")이 반환됩니다.

2. 소수점 및 정수 구분 기호를 ^로 변경하는 문자열 형식 지정

3. 형식 함수가 5 대신 "00005"를 반환하려면 형식 문자열이 적합합니다.

4. 형식 함수가 10,000 대신 "10000"을 반환하려면 형식 문자열이

5. Format 함수는 다음 유형의 값을 반환합니다.

데이터 공유 메커니즘하나의 정보베이스에 여러 독립 조직의 데이터를 저장할 수 있습니다.

이는 구성 개체의 공통 속성이 "모든 개체가 갖는 동일한 속성"으로 사용될 수 있을 뿐만 아니라 데이터가 여러 독립 영역 중 하나에 속한다는 식별자로도 사용될 수 있기 때문에 가능합니다. 이는 다음 예를 통해 설명할 수 있습니다.

구성에 공통 속성 "조직"이 있다고 가정합니다. 즉, 각 디렉토리, 문서 또는 기타 구성 개체에도 "조직" 특성이 있음을 의미합니다(단순화).

동시에 infobase의 모든 사용자는 예를 들어 특정 문서에 지정된 조직에 관계없이 이 데이터베이스에 저장된 모든 데이터에 액세스할 수 있습니다.

이제 공통 속성 "Organization"이 구분 기호가 되도록 지정하겠습니다.

그런 다음 (단순화) 여러 독립 데이터 영역이 정보베이스에 생성되며 각 영역은 하나의 특정 조직에 대한 데이터만 저장합니다.

이제 프로그램에 들어가면 사용자는 정보베이스에 있는 모든 정보에 액세스할 수 없고 "자신의" 영역 데이터(이 경우 조직의 문서, 디렉토리 등)에만 액세스할 수 있습니다.

정보베이스에 여러 독립 데이터 영역이 있고 이와 함께 프로그램의 모든 사용자가 사용할 수 있는 데이터가 있는 경우 이 메커니즘을 사용하는 또 다른 변형이 가능합니다. 예를 들어 모든 조직에 대해 동일한 은행 디렉토리가 포함되어 있습니다.

이 경우 사용자는 "자신의" 데이터 영역과 모든 사용자에게 공통인 비공유 데이터 영역에 액세스할 수 있습니다.

데이터 공유 메커니즘은 매우 유연하고 보편적입니다.

  • 하나가 아닌 여러 구분 기호를 사용할 수 있습니다.
  • 공유 데이터를 사용하는 다양한 모드가 있습니다. 구분 기호 값이 지정되지 않은 경우 상황을 처리하는 방법이 다릅니다.
  • 공통 속성을 구분 기호로 사용하는 것은 구성을 변경하지 않고 내장 언어에서 프로그램 작동 중에 제어할 수 있습니다. 이것을 조건부 분할이라고 합니다.

[Button 7710967300 BUX RB] Connect=Srvr="%servername%";Ref="%base_name%"; AdditionalParameters=/Z "-0,-0,+7710967300";

/Z 다음에 일반적인 세부 사항을 순서대로 지정합니다. 표준 계정에는 이미 두 가지 공통 시스템 세부 정보가 있으므로 사용되지 않도록 -0 값을 지정하고 세 번째 항목(우리가 생성한 항목)으로 TIN을 전달합니다.

1000 및 1 확인란

이제 데이터의 어떤 부분이 모든 영역에 공통적인지 결정해야 합니다. 이 모든 것은 구성자를 통해 구성됩니다. 방금 생성한 일반 소품의 속성에는 800개 매개변수의 작은 목록을 여는 "Composition" 항목이 있습니다.

매개 변수 선택은 귀하의 재량, 재량 및 환경에 맡깁니다. 여기 우리 버전이 있습니다(20,000픽셀이 있으니 조심하세요).

구분 기호를 사용하면 각 데이터베이스에 대해 별도의 사용자 목록을 설정할 수도 있습니다. 수백 명의 사용자가 있는 경우 유용할 수 있습니다. 투명한 인증을 설정했기 때문에 이것을 사용하지 않습니다.

현재 데이터베이스에서 데이터 업로드

현재 데이터베이스에서 데이터를 업로드하기 위해 범용 XML 교환을 사용합니다. 베이스를 가져가서 언로드할 수 없으며 교환 규칙을 설정해야 합니다. 그렇지 않으면 로드 중에 오류와 충돌이 발생할 수 있으며(확실히 발생할 것임) 두 번째 베이스가 크롤링되지 않습니다. 우리는 각 조직의 기반 영역을 나누고 우리의 경우 이러한 교환 규칙이 작동한다는 것을 기억하십시오. 다른 구분 기호를 사용하기로 결정한 경우 두뇌와 확인란을 사용해야 합니다. 가장 중요한 것은 표준 언로드를 사용하지 않는 것입니다. 이렇게 하면 사전 정의된 모든 레코드가 중복됩니다.

여주인 참고 사항: 디렉터리와 문서를 별도로 업로드하는 것이 좋습니다. 이렇게 하면 업로드 시 불필요한 오류를 피할 수 있습니다.

공유 데이터베이스에 데이터 로드

우리는 데이터를 다운로드할 조직의 구분 기호를 나타내는 / Z 매개변수 "-0, -0, +% your separator%"를 사용하여 1C를 시작합니다. 우리는 보편적인 교환을 시작하고 업로드하는 동안 받은 파일을 제공합니다: 첫 번째 디렉토리, 그 다음 문서. 각 기지 영역에 대해 이 작업을 반복합니다.

작업을 단순화하기 위해 명령줄(/Execute c:\upload.epf)을 통해 약간 수정된 표준 처리를 실행한 후 대량 업로드를 수행합니다. 그런 다음 수신된 파일을 공유 데이터베이스에 수동으로 업로드합니다.

더 적은 시간을 사용하기 위해 더 많은 시간을 사용하는 방법

분리 과정은 빠른 것이 아닙니다. 현재 500개 이상의 조직이 있지만 몇 주 만에 70개만 공유할 수 있었습니다. 그러나 6개월 후에는 작업을 완료하고 많은 시간을 절약하고 노력.

회계사는 정규 기반에서 분할 된 조직으로의 조직 전환을 알아 차리지 못합니다. 그 과정은 고통스럽지 않습니다. 관리자만을 위한 엉덩이 화상 :)

부작용: 공간 절약 1~20, 간접적인 속도 증가 - 매우 중요합니다. 절대적으로 50개의 조직이 SQL에서 2GB의 공간을 차지하는 반면 하나의 개별 데이터베이스는 800MB를 차지합니다.

연고에 약속 된 파리, 심지어 네 가지 :

  • 사용자 중 한 명이 한 조직의 데이터를 엉망으로 만들면 분할된 데이터베이스 전체를 롤백해야 합니다. 하나의 데이터 영역만 가져와서 롤백할 수 없습니다.
  • 업데이트, 특히 디렉토리를 추가하거나 변경하는 업데이트를 더 철저하게 테스트해야 합니다.
  • 데이터베이스를 고객에게 이전(또는 세금을 병합)해야 하는 경우 반대 절차를 수행해야 합니다. 유니버설 교환을 사용하여 분할된 데이터베이스에서 조직을 언로드한 다음 빈 일반 데이터베이스에 로드하고 다음에서 저장합니다. 그것을. dt 파일
  • 분할 데이터베이스에서는 예약된 작업을 관리할 수 없습니다(예: 환율을 자동으로 업데이트할 수 없음).
처음 세 스푼은 그렇게 쓴맛이 아닙니다. 단지 우리가 더 많은 관심을 갖게 만들뿐입니다. 그러나 네 번째로 무엇을 해야할지 아직 알지 못하지만 부지런히 조사하고 있습니다.

현재 사용자에게 편리하기 때문에 양식 영역을 재배포하려면 1C 구분 요소가 필요합니다. 거의 모든 Windows 사용자는 구분 기호를 사용할 수 있습니다. 두 개의 컨트롤이 있는 간단한 양식을 만들었다고 가정해 보겠습니다.

전통적으로 모든 목록의 항목은 왼쪽에 위치할 수 있습니다. 오른쪽에는 바로 이러한 점에 대한 자세한 사양이 각각 있습니다. 왼쪽 목록이 짧은 이름으로 구성되어 있으면 이 열을 최소로 줄이는 것이 논리적입니다. 따라서 이 경우 오른쪽의 가독성이 높아집니다. 반대로 왼쪽에 긴 이름이 있으면 열을 확장해야 합니다. 구분선을 사용하면 마우스로 테두리를 드래그하여 모양을 임의로 사용자 정의할 수 있습니다.

이 제어 방법은 Word 및 Excel에서 테이블을 편집할 때 사용됩니다. 양식을 만들 때 세로 및 가로 구분자 양식 요소를 모두 만들 수 있습니다. 일반적으로 화면에 시각적으로 표시되는 양식을 만드는 것이 가장 좋습니다.

구분 기호 8.2, 8.3(관리되는 양식)

관리되는 양식 1c에는 구분 기호를 추가할 수 없으며 테이블 필드 앞/뒤에 프로그램에 의해 자동으로 추가됩니다.

1. 전문.

하나의 IS에 두 조직의 회계를 구성할 필요가 있었습니다. 상황이 독특하지는 않지만 일반적이지 않은 250GB UPP가 다소 느리게 작동하여 RLS 대신 데이터 분리를 시도하기로 결정했습니다. 예를 들어, 그것이 무엇인지 설명합니다. 즉, RLS가 SQL 쿼리를 조건화하는 경우 데이터 구분 기호는 DBMS 수준의 테이블에 있는 추가 열이므로 구분 기호 메커니즘이 RLS보다 빨라야 합니다.

따라서 OOO 1호에 대한 기록이 보관되어 있는 데이터베이스에서는 OOO 2호의 별도 데이터베이스에서 정보를 이전하여 공동 작업을 구성할 필요가 있다. 그림과 같이:

단순한 필사자는 LLC에서만 작동하며 수석 회계사는 때때로 두 법인의 데이터를 봅니다. 두 LLC에 대한 액세스 모드에서는 데이터를 읽을 수만 있으므로 수석 회계사는 "모두 읽기"/ "한 조직에만 쓰기" 모드 간에 대화식으로 전환하고 LLC를 선택할 수 있어야 합니다(즉, 공통 속성) 예를 들어 비용 계산을 수행합니다.

2. 시행

플랫폼 8.2.19.90, 호환 모드 없음. DBMS - MSSQL 서버 2008 R2 표준.

우리는 "숫자"유형의 공통 속성 조직 구분 기호를 생성하고 세션 매개 변수 생성 제안에 동의하고 속성 구성을 채웠습니다 (여러 디렉토리, 모든 문서, 누적, 회계 및 계산 레지스터 포함). 데이터 분리 - "독립적으로 그리고 공동으로". 세션 매개변수의 값은 세션 모듈의 SetSessionParameters 절차에 있는 기본 사용자 설정에서 설정됩니다.

조직 = UserManagement.GetDefaultValue(glCurrentUser,"MainOrganization");
SessionParameters.OrgDelimiterValue = Organization.DelimiterValue;

수석 회계사의 인터페이스에서 조직 간 전환 및 분리 모드 활성화 / 비활성화 기능이있는 양식을 만들었습니다.

분할이 비활성화된 상태에서 SessionParameters.OrganizationSeparatorUse = False일 때 플랫폼은 문서 작성을 거부하고 "SDBL 오류: 예상 표현식(pos=12)"과 같은 오류를 발생시키므로 사용자가 이 옵션에서 문서를 작성하도록 할 수 없습니다. 안정성을 위해 공통 특성의 일부인 개체에 대한 "녹화 전" 이벤트에 대한 구독을 생성했습니다.

SessionParameters.OrgDelimiterUse = False인 경우
#클라이언트 다음
Warning("데이터 공유가 비활성화되어 있어 쓸 수 없습니다!");
#EndIf
거부 = 참;
EndIf;

우리의 행동 계획은 다음과 같습니다. IB 1번의 수신기 구성을 준비하고 공통 속성 값을 1로 설정하고 IB 2번에서 데이터를 로드합니다. 0) 구분자 값, 조직 구분자 = 2로 설정합니다.

구성이 준비되었고 문서의 일반 속성 값과 닫힌 기간의 이동을 어떻게 설정하고 저울의 숫자가 날아갈 위험없이 신속하게 질문이 생겼습니까? 1C 객체 모델을 통해서는 객체와 구분자를 따로 작성하는 것이 불가능하여 라이센스 계약을 깨고 나가서 MS SQL용 쿼리를 작성해야 했습니다. 공통 속성에는 많은 개체가 있고 이러한 개체에 대한 광대뼈에는 더 많은 테이블이 있으므로 SQL에 대한 쿼리를 생성하는 처리를 작성했습니다(구분자의 일부인 각 메타 데이터 개체에 대해 "update"라고 작성했습니다. + DB_name + ".dbo._" + TableName + " set _" + Field GeneralAttribute + " = 1";)

값을 설정하고 일부 데이터를 IB 2에서 전송하고 테스트를 시작했습니다.

결과는 실망스러웠다. 첫째, 회계 등록 문제. 분리가 활성화되면 분석이 표시되지 않습니다.

이는 DBMS 수준의 회계 레지스터가 여러 개의 테이블로 저장되고 모든 테이블이 공통 속성 값을 갖는 것은 아니기 때문입니다(구조를 보기 위해 처리가 사용됨).


글쎄, 우리는 MS SQL을 통해 구분 기호의 값을 내려 놓고 분석을 봅니다. 이제 보고서가 작동하지 않습니다. 회계 레지스터 "Turnovers" 및 "TurnoversDtKt"의 가상 테이블에 대한 쿼리에 문제가 있음이 밝혀졌습니다.

(Fld27033은 회계 레지스터 테이블의 공통 속성일 뿐입니다)

구분 기호는 모든 테이블에 설정되어 있으며 DBMS 수준에서 볼 수 있으며 무엇이 오류인지 명확하지 않습니다. 일반적인 빈 SCP를 배포하고 위에서 설명한 구성을 변경하고 두 개의 문서를 입력하지만(이 옵션에서는 플랫폼 자체가 모든 회계 레지스터 테이블에서 구분 기호 값을 설정함) 오류가 재현됩니다. 나쁘지만 일반 요구 사항에서 회계 등록을 제외하고 테스트를 계속합니다.

또한 계산 레지스터의 변위 메커니즘이 작동을 멈춘 것으로 나타났습니다. 우리는 계산 유형에 대한 계획을 분리하지 않았으며 계산 레지스터 테이블과 재 계산에서 문제를 찾으려고 노력하고 있습니다. 확인하고 주요 속성의 값을 입력하고 T&I를 수행합니다.

그 과정에서 목록 형식에서 독립 레지스터에 정보를 쓸 때 문제를 진단합니다. 이 경우 데이터가 기록되며 다시 시작한 후에 볼 수 있습니다. 문제는 테스트 기반에서 재현됩니다.


정보 레지스터는 SQL을 조작하여 "복구"할 수 없으므로(세퍼레이터 값은 모든 테이블에 설정됨) 일반 속성에서 제외되었습니다. 며칠 간의 실험 후 변위의 작업 능력을 복원하려는 시도도 실패했습니다.

이 시점에서 우리는 데이터 공유를 끄고 RLS를 계속 사용하기로 결정합니다. 분할을 "사용 안 함"으로 설정하면 "Microsoft OLE DB Provider forSQL Server: CREATE UNIQUE INDEX가 인덱스에 대한 중복 키가 발견되었기 때문에 종료되었습니다." 오류가 발생합니다. 즉, 헤어지기 전의 상태로 돌아가는 것이 그리 쉽지만은 않다. 재계산 테이블의 인덱스, 총계 저장 설정 등에 문제가 있습니다. 사실 테이블은 공통 속성 값만 다른 동일한 행을 저장합니다. 공통 속성을 삭제하면 고유하지 않은 항목이 나타납니다. 다음과 같이 MS SQL에서 직접 불필요한 레코드를 삭제해야 합니다(재계산 테이블의 경우).

사용 기반;
ALTER TABLE_CRgRecalc1399
ID INT IDENTITY(1,1) 추가;
가다
FROM_CRgRecalc1399에서 삭제
WHERE 아이디< (SELECT MAX(id)
FROM _CRgRecalc1399 AS T1
WHERE _CRgRecalc1399._RecorderTRef = T1._RecorderTRef 및
_CRgRecalc1399.[_RecorderRRef] = T1.[_RecorderRRef] 및
_CRgRecalc1399.[_CalcKindRRef] = T1.[_CalcKindRRef] 및
_CRgRecalc1399.[_Fld1400RRef] = T1.[_Fld1400RRef] 및
_CRgRecalc1399.[_Fld1401RRef] = T1.[_Fld1401RRef] 및
_CRgRecalc1399.[_Fld1402RRef] = T1.[_Fld1402RRef]
);
가다
ALTER TABLE_CRgRecalc1399
드롭 열 ID;

그리고 수십 개의 테이블을 정리한 후에야 데이터 파티셔닝을 끌 수 있습니다. 분리를 끈 후에는 문제가 없습니다.

3. 결론.

8.3 문제가 해결될 것이라는 희망이 있었다. 우리는 너무 게으르지 않았고 8.3.4.482(호환성 모드 비활성화)에서 확인했습니다. 우리는 일반 소품에 대해서만 구성을 변경한 거의 전형적인 SCP-shke를 살펴보았습니다. 이 테스트 기반에서는 정보가 입력되기 전에 분할이 활성화되었습니다. 플랫폼은 구분자 값을 모든 테이블에 올바르게 작성해야 했으며 자체적으로 MS SQL에 직접 작성하지 않았습니다.

결과:

    가상 테이블 "Turnovers" 및 "TurnoversDtKt"에 대한 쿼리 문제가 재현됩니다.

    선점 문제는 재현 가능합니다.

    독립 정보 레지스터에 쓰는 문제가 재현됩니다.

    분리를 끄는 문제 - 버튼을 한 번만 클릭하면 제거되지 않습니다!

따라서 RLS를 새로운 메커니즘으로 교체하는 데 실패했습니다. 이 메커니즘은 분명히 클라우드 서비스를 위해 고안되었으며 공유 데이터를 "독립적으로" 사용하는 경우 분리가 작동하지만 공통 NSI가 필요합니다. 1C가 오류를 수정할 때까지 기다려야 하며 더 나은 방법은 표준 구성에서 조직별로 나누는 일반적인 메커니즘을 구현하는 것입니다.



관련 기사: