정보 레지스터의 최신 항목에 대한 스냅샷을 얻는 기능입니다. 정보 레지스터의 최신 항목 조각을 얻는 기능 정보 레지스터 1c 문서의 최신 항목 조각

/
데이터 처리 구현

정기 정보 레지스터의 합계 해결

적용 범위: 관리형 애플리케이션, 모바일 앱, 일반적인 응용 프로그램입니다.

1.1. 주기적 정보 레지스터의 경우 다음 조건이 모두 충족되면 합계를 허용하는 것이 좋습니다.

  • 등록부에 많은 양의 데이터가 예상됩니다(예를 들어 품목 가격이 포함된 등록에는 적합하지만 환율이 포함된 등록에는 적합하지 않음).
  • 구성은 현재 시간의 후자 조각 및/또는 전자의 조각에 대한 빈도 쿼리를 제공하여 현재 데이터를 얻습니다(즉, 가상 테이블의 매개변수에 기간이 지정되지 않은 경우). 첫 번째 조각그리고 최후의 조각);
  • 가상 테이블의 나머지 조건은 첫 번째 조각그리고 최후의 조각측정값(및 모드의 구분 기호)에만 설정됩니다. 독립적으로 그리고 공동으로);
  • 등록 데이터 액세스 제한은 차원(및 모드에 있는 구분 기호)만 사용합니다. 독립적으로 그리고 공동으로).

쿼리가 정보 레지스터 합계를 사용하는 경우 모든 조건의 전체 목록은 다음을 참조하세요.1C:Enterprise 플랫폼에 대한 문서.

예를 들어, 구성에 레지스터에 대해 자주 실행되는 쿼리가 포함된 경우 가격명칭현재 품목 가격을 얻으려면:

물품을 고르시 오. 기사 AS 기사, 가격 명칭. 가격 AS 가격, . . . 디렉토리에서. 명명법 AS 명명법 LEFT CONNECTION 정보 등록. 가격명칭. SliceLast(, 가격보기 = &가격 유형) 가격 명칭소프트웨어 가격명칭. 명명법 = 명명법. 링크. . .

그런 다음 위에 나열된 다른 모든 조건에 따라 속성을 설정합니다. 합계 허용: 최근 항목의 일부마지막 값(마지막 값 자르기)과 첫 번째 값(마지막 값 자르기)만 저장하는 추가 테이블에서 선택이 직접 수행되므로 이러한 쿼리의 실행 속도가 크게 향상됩니다. 첫 번째 것).

1.2. 또한 고려해야 할 사항 대체 옵션이러한 조건이 충족되도록 등록부에 대한 요청을 수정합니다.

예를 들어, 어떤 경우에는 레지스터의 데이터가 가격명칭미래 날짜에 기록되며, 이 레지스터에 상품을 선택할 때 항상 현재 날짜에 대한 쿼리가 실행됩니다(날짜는 가상 테이블 매개변수에 명시적으로 지정됨). 최후의 조각), 결과는 해당 쿼리 실행 속도를 높이지 않습니다. 총계는 레지스터의 첫 번째와 마지막 레코드에 대해서만 작성되기 때문입니다.

그러나 제품 선택 양식을 열 때 미래 날짜의 등록자가 있는지 분석하고, 없는 경우 날짜를 설정하지 않고 후자의 일부에 대해 다른 쿼리를 실행하면 해당 쿼리가 더 빨리 작동합니다. .

2. 다른 모든 경우에는 정기 정보 등록에 대한 합계가 허용되지 않습니다. 우선, 만약에

  • 특정 기간(예: 문서 날짜) 동안 첫 번째/마지막 정보 등록의 가상 테이블에 대한 쿼리가 가장 자주(항상) 이루어집니다.
  • 가상 테이블 조건에서 첫 번째 조각그리고 최후의 조각(항상) 하위 쿼리와 조인이 가장 자주 사용됩니다(관련 테이블의 필드에 "점을 통해" 호출). 예를 들어, 이 경우:

3. 레코드 세트가 레지스터에 기록될 때마다 총계 테이블 업데이트가 자동으로 수행되므로 구성에서 총계를 다시 계산하기 위한 별도의 메커니즘을 제공할 필요가 없습니다.

: 첫 번째 조각그리고 최후의 조각 1C를 사용하여 이러한 가상 테이블로 작업하는 것을 고려해 보겠습니다. 훨씬 더 자주 사용됨 최후의 조각, 그럼 시작해 보겠습니다.

최신 조각을 사용하면 측정과 관련하여 지정된 날짜에 대한 정보 레지스터의 마지막 기록을 얻을 수 있습니다. 마지막(첫 번째) 슬라이스 테이블의 경우 쉼표로 구분하여 괄호 안에 두 개의 매개변수를 지정할 수 있습니다. 첫 번째 매개변수에는 조각이 만들어진 날짜가 포함됩니다(매개변수를 지정하지 않으면 현재 날짜에 조각이 만들어집니다). 두 번째 매개 변수는 1C 쿼리 언어의 조건이며 다양한 선택을 설정할 수 있습니다. 일반적으로 이러한 선택에는 측정이 사용됩니다. 이 모든 것이 매우 모호하게 들리므로 예 없이는 불가능합니다.
그러니 주기적으로 정보를 등록해 봅시다. 가격제품별, 공급자별 가격을 저장하는 곳입니다. 등록 빈도는 일입니다.

레지스터에는 다음 항목이 포함되어 있습니다.

우선 다음 요청을 실행하여 매개변수를 사용하지 않고 후자의 일부를 얻습니다.

SELECT PriceSliceLast.Period AS 기간, PriceSliceLast.Product AS 제품, PriceSliceLast.Supplier AS 공급자, PriceSliceLast.Amount AS 금액 FROM 레지스터 정보.Price.SliceLast AS PriceSliceLast

매개변수가 지정되지 않았으므로 현재 날짜인 2017년 2월 1일에 조각이 수행됩니다. 결과적으로 우리는 다음 표를 얻습니다.

여기에서는 제품 + 공급자 차원의 조합이 고유하다는 것을 알 수 있습니다. 레지스터 측정의 각 조합에 대해 최대 날짜의 기록이 수집되었으며 기록 날짜는 현재 날짜보다 작거나 같습니다.

동일한 작업을 수행해야 하지만 날짜가 2017년 1월 15일 이전인 레코드를 가져오고 싶다고 가정해 보겠습니다. 이렇게 하려면 다음과 같이 요청에서 최신 슬라이스 테이블이 있는 행을 변경해야 합니다.

FROM RegisterInformation.Price.SliceLast(&CutDate,) AS PriceSliceLast

물론 요청을 실행하기 전에 매개변수를 전달해야 합니다. 컷날짜(&C). 이제 쿼리 결과는 다음과 같습니다

그리고 마지막으로, 상품이 있다는 조건으로 같은 날짜의 최신 상품에 대한 스냅샷을 얻어야 한다고 상상해 보세요. 연필, 그리고 공급업체 문방구. 이렇게 하려면 요청에 두 번째 매개변수를 지정하세요.

FROM RegisterInformation.Price.Last Cut(&CutDate, 제품 = &Product AND 공급업체 = &Supplier) AS PriceLast Cut

결과적으로 우리는 단 하나의 레코드만 얻습니다.

이러한 모든 괄호와 쉼표에서 길을 잃지 않으려면 쿼리 빌더를 사용하는 것이 좋습니다. 마지막 요청을 예로 들어 보여드리겠습니다.

쿼리 디자이너에서 최신 테이블 조각이 포함된 테이블을 선택한 후 버튼을 클릭해야 합니다. 가상 테이블 옵션열리는 창에서 쓰기

첫 번째 조각의 경우 절단 날짜 이후 첫 번째 레코드가 선택된다는 점을 제외하면 작동 원리는 동일하다고 추측하기 어렵지 않습니다.

안에 테스트 구성우리는 다음 소스 데이터와 함께 정기적인 정보 레지스터 "PriceNomenclature"를 가지고 있습니다.

그림에는 레지스트리 메타데이터의 구조도 나와 있습니다. 보시다시피, 레지스터에는 참조 유형이 "Products"인 "Product" 차원과 "Price" 숫자 리소스 및 "OldPrice" 속성이 포함되어 있습니다.

보고서에서 이전 가격이 50보다 작거나 같다는 조건으로 제품 및 해당 가격에 대한 최신 기록을 가져와야 한다고 가정해 보겠습니다.

두 가지 요청 옵션

올바른 옵션과 잘못된 옵션을 고려할 것이라고 즉시 말씀 드리고 후자부터 시작하겠습니다. 이것은 초보 프로그래머들이 자주 저지르는 실수입니다. 따라서 보고서에 대해 다음 쿼리가 작성되었습니다.

요청 = 새 요청; 요구. 텍스트 = " 선택 | | | | | 에서 | 정보 등록. 가격명칭. 최신 조각 가격 명명법최신 조각|어디 | 가격명명Slice최신. 이전 가격< = 50 " ;

"WHERE" 섹션의 조건에 주의하세요. 이것이 주요 실수입니다! 이 쿼리는 단일 레코드를 반환하지 않으며 그 이유는 다음과 같습니다. 가상 테이블을 사용할 때(이 경우 "Last Slice") 데이터는 다음에 설명된 조건에 따라 데이터베이스에서 먼저 가져옵니다. 가상 테이블, 그런 다음 요청 텍스트에 설명된 작업이 수행됩니다(그룹화, "WHERE" 섹션의 조건, 정렬 등).

따라서 이 예에서는 요청이 결과를 반환하지 않습니다. 먼저 그는 후자의 일부를 받은 다음 "기존 가격" 속성에 대한 조건을 설정합니다. 다이어그램에 표시되는 내용은 다음과 같습니다.

문제를 올바르게 해결하려면 "Old Price" 속성에 대한 조건을 가상 테이블의 조건으로 전송해야 합니다. 올바른 요청 텍스트는 다음과 같습니다.

요청 = 새 요청; 요구. 텍스트 = " 선택 가격명명Slice최신. 기간, 가격명명Slice최신. 제품, 가격명명Slice최신. 가격, 가격명명Slice최신. 이전 가격 에서 정보 등록. 가격명칭. SliceLast(, OldPrice< = 50 ) 가격이 어떻게 명명법Slice최신"

이제 "OldPrice" 속성의 조건을 고려하여 최신 가격 조각이 수신되므로 요청은 올바른 데이터를 수신하게 됩니다.

결과

위 내용은 쿼리(누적 레지스터, 회계 레지스터, 작업 등)에서 가상 테이블을 사용하는 모든 경우에 적용된다는 점을 이해해야 합니다.

이는 또한 가상 테이블 사용에 대한 주요 규칙을 의미합니다. "가상 테이블을 사용할 때 선택 매개변수를 가상 테이블에서 직접 설정해야 합니다. 그렇지 않으면 쿼리가 불필요한 데이터를 수신하여 선택에 사용됩니다."

때로는 정기적인 정보 등록부에서 여러 날짜의 데이터를 한 번에 가져오기 위해 쿼리를 사용해야 하는 경우가 있습니다. 일반적인 예는 환율 관련 작업입니다. 예제를 사용하여 이 문제를 해결하기 위한 알고리즘을 고려해 보겠습니다.

문제의 공식화

"상품 및 서비스 판매" 문서가 데이터베이스에 생성되었으며 헤더에 "통화" 속성이 있습니다. 요청에서는 각 문서에 대해 문서 날짜의 헤더에서 현재 환율을 가져와야 합니다. 환율은 정기 정보 레지스터 "환율"에 저장됩니다.
이 문제에 대한 직접적인 해결책은 날짜와 통화가 포함된 모든 문서를 가져오고 샘플에서는 최신 "통화 환율" 레지스터 조각을 사용하여 가상 테이블에 액세스하는 루프 쿼리일 수 있습니다. 하지만 왜냐하면 루프의 요청이 "나쁜" 경우, 하나의 요청으로 작업을 구현해 보겠습니다.

해결책

문제를 해결하기 위해 쿼리의 테이블이 필드의 평등을 위해서만 연결될 수 없습니다.

SELECT 상품 및 서비스 판매 링크, 상품 및 서비스 판매 통화, 최대(통화 환율. 기간) AS 기간 PLACE IN TPeriods 설정 환율 FROM 문서 상품 및 서비스 판매 HOW 상품 및 서비스 판매 왼쪽 연결 정보 등록 . 환율 AS 환율 상품 하인 판매.Currency = 환율.통화 및 상품 서비스 판매.Date >= 환율.기간 상품 및 서비스의 GROUP 소프트웨어 판매. 링크, 상품 및 서비스 판매. 통화; /////////////////////////////////////////////// // ///////////////////////// SELECT VTPeriods설정 요율.Link, VTPeriods설정 요율.통화, RatesCurrency.Rate FROM VTPeriods설정 요율 AS VTPeriods설정 요율 왼쪽 연결 RegisterInformation . 환율 AS 환율 ON VTPeriodsRate 설정.기간 = 환율.기간 AND VTPeriodsRate 설정.통화 = 환율.통화

요청 절차:

  1. 각 문서의 환율 설정 기간을 얻습니다.문서는 실제 테이블 "통화율"에 연결됩니다. 여기서 연결 조건에 주의해야 합니다. 통화는 동일해야 하며 문서 날짜 >= 정보 등록 기간이어야 합니다.
    이러한 연결의 결과로 각 문서에 대해 조건을 충족하는 행 세트가 얻어집니다. 문서 통화에 대한 모든 환율 기록은 문서 날짜 이전에 설정됩니다.
    마지막 단계는 최대 비율 기간을 얻기 위해 행을 그룹화하는 것입니다. 결과적으로 각 문서에 대해 원하는 통화에 대한 환율을 설정하는 데 필요한 기간이 확보됩니다(환율 설정을 위한 최대 날짜이지만 문서 날짜를 넘지 않음). 결과는 임시 테이블 VTPeriodsSettingRates에 저장됩니다.
  2. 코스를 받고 있습니다.임시 테이블 VTPeriodsSetting Rates는 실제 테이블 "Currency Rates"에 연결됩니다. 두 번째 임시 테이블에 정의된 문서 통화 및 환율 설정 기간에 따라 연결이 발생합니다.