요청 생성 및 작업(초보자용) 요청 생성 및 작업(초보자용) 1s 8.3 요청 모든 문서 선택

나는 기여하고 위 기사에서 논의되지 않은 언어의 기능을 설명하기로 결정했습니다. 이 기사는 초보 개발자를 대상으로 합니다.

1. “IZ” 디자인.

데이터베이스에서 데이터를 얻기 위해 "FROM" 구성을 사용할 필요가 전혀 없습니다.
예: 은행 디렉토리에서 은행에 관한 모든 정보를 선택해야 합니다.
요구:

디렉토리 선택.은행.*

Banks 디렉터리에서 모든 필드를 선택합니다. 요청과 유사합니다.

뱅크 선택.* FROM Directory.Banks AS 뱅크

2. 참조 필드별로 데이터 정렬

기본 유형("문자열", "숫자", "날짜" 등)으로 쿼리 데이터를 구성해야 할 때 참조 필드별로 데이터를 정렬해야 한다면 "ORDER BY" 구문을 사용하여 모든 것이 해결됩니까? 참조 필드는 링크, 고유 식별자입니다. 대략적으로 말하면 일부 임의의 문자 집합과 일반적인 순서로 인해 완전히 예상하지 못한 결과가 발생할 수 있습니다. 참조 필드를 정렬하려면 "AUTO ORDER" 구성이 사용됩니다. 이렇게 하려면 먼저 "ORDER BY" 구성을 사용하여 참조 유형별로 직접 데이터를 정렬한 다음 "AUTO ORDER" 구성을 사용해야 합니다.

이 경우 문서의 경우 "기본 보기"의 참고 도서의 경우 "날짜->번호" 순서로 정렬됩니다. 참조 필드에 따라 정렬이 발생하지 않는 경우 "AUTO ORDER" 구성을 사용하지 않는 것이 좋습니다.

어떤 경우에는 "AUTO ORDER" 구조로 인해 선택 프로세스가 느려질 수 있습니다. 마찬가지로 문서 자동 정렬 없이 다시 작성할 수 있습니다.

3. 참조 유형의 텍스트 표현을 얻습니다. "프레젠테이션" 디자인.

참조 유형의 필드(예: "Banks" 디렉터리 요소에 대한 링크인 "Bank" 필드)를 표시해야 하는 경우 이 필드를 표시할 때 " Banks" 디렉토리가 자동으로 실행되어 디렉토리 보기를 얻습니다. 이로 인해 데이터 출력 속도가 느려집니다. 이를 방지하려면 요청에 "PREPRESENTATION" 구성을 사용하여 개체의 표현을 즉시 얻은 다음 보기 위해 표시해야 합니다.

데이터 구성 시스템에서는 이 메커니즘이 기본적으로 사용되지만 셀에 레이아웃을 생성할 때 참조 필드의 표현을 지정해야 하며, 예를 들어 링크 자체를 성적표에 배치해야 합니다.

4. 템플릿에 따른 데이터 샘플링 조건.

예를 들어, (8 -123-456-78-912) 형식의 직원 휴대폰을 받아야 합니다. 이렇게 하려면 요청에서 다음 조건을 설정해야 합니다.

직원.이름, 직원.전화 AS 전화 FROM 디렉터리.직원 AS 직원 WHERE 전화 LIKE "__-___-___-__-__" 선택

"_" 문자는 서비스 문자이며 모든 문자를 대체합니다.

5. 합계와 그룹화를 동시에 사용합니다.


합계는 그룹화와 함께 사용되는 경우가 많으며 이 경우 합계에 집계 함수가 지정되지 않을 수 있습니다.

SELECT 서비스 제공.조직 AS 조직, 서비스 제공.명칭 AS 명명법, SUM(서비스 제공.문서 금액) AS 문서 합계 FROM 문서.서비스 제공 AS 서비스 제공 GROUP BY 서비스 제공.조직, 제공 서비스. 명칭 일반, 조직, 명칭별 결과

이 경우 쿼리는 다음 쿼리와 거의 동일한 결과를 반환합니다.

SELECT 서비스 제공.조직 AS 조직, 서비스 제공.명칭 AS 명명법, 서비스 제공.문서 금액 AS 문서 금액 FROM 문서.서비스 제공 AS 서비스 제공 결과 금액(문서 금액) BY GENERAL, 조직, 명명법

첫 번째 쿼리만 동일한 명명법을 사용하는 레코드를 축소합니다.

6. 필드 역참조.

점을 통해 필드를 참조하는 것을 참조 필드 역참조 작업이라고 합니다. 예를 들어 결제.조직.관리 단위. 이 경우 "지불" 문서의 참조 필드 "조직"에서는 "관리 단위" 속성 값을 가져오는 다른 테이블 "조직"을 참조합니다. 점을 통해 필드에 액세스할 때 플랫폼이 암시적으로 하위 쿼리를 생성하고 이러한 테이블을 조인한다는 점을 이해하는 것이 중요합니다.

요구:

다음과 같이 표현될 수 있습니다:

결제.링크, 결제.조직, 결제.조직, 조직을 선택합니다. AdministrativeUnit FROM Document.Payment AS 결제 LEFT JOIN Directory.Organizations AS 조직 소프트웨어 Payment.Organization = Organizations.Link

복합 유형의 참조 필드를 역참조할 때 프레임워크는 해당 필드 유형의 일부인 모든 테이블에 대한 암시적 조인을 생성하려고 시도합니다. 이 경우 쿼리는 최적이 아니며, 어떤 필드인지 명확하게 알 수 있는 경우 구문을 사용하여 해당 필드를 유형별로 제한해야 합니다. 표현하다().

예를 들어, 여러 문서가 등록 기관 역할을 할 수 있는 누적 등록 "미분배 지불"이 있습니다. 이 경우 다음과 같은 방법으로 등록자 세부 정보 값을 얻는 것은 올바르지 않습니다.

할당되지 않은 지불.등록.날짜, ..... RegisterAccumulation.UnallocationPayments AS 할당되지 않은 지불에서 선택

복합 필드의 유형을 로거로 제한해야 합니다.

SELECT EXPRESS(할당되지 않은 지불.등록 AS 문서.지불).날짜, ..... FROM RegisterAccumulation.Unal locatedPayments AS UnallocatedPayments

7. 건설 "어디"

두 테이블의 왼쪽 조인을 사용하여 오른쪽 테이블에 "WHERE" 조건을 적용하면 테이블의 내부 조인과 유사한 결과를 얻을 수 있습니다.

예. 클라이언트 디렉터리에서 모든 클라이언트를 선택해야 하며 "조직" = &조직 속성 값을 가진 지급 문서가 있는 클라이언트의 경우 "지급" 문서를 표시하고, 그렇지 않은 클라이언트의 경우 표시하지 않습니다.

쿼리 결과는 해당 매개변수에 조직별 결제가 있었던 클라이언트에 대한 기록만 반환하고, 다른 클라이언트는 필터링합니다. 따라서 먼저 임시 테이블에서 "이러한" 조직에 대한 모든 지불을 받은 다음 이를 Left 조인을 사용하여 "클라이언트" 디렉터리에 연결해야 합니다.

SELECT Payment.Link AS 지불, Payment.Shareholder AS 클라이언트 PLACE toPayments FROM Document.Payment AS 지불 WHERE Payment.Branch = &Branch; /////////////////////////////////////////////// // ////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Directory .Clients AS 클라이언트 왼쪽 연결 to결제 AS to결제 소프트웨어 Clients.Link = to결제.클라이언트

다른 방법으로 이 상황을 해결할 수 있습니다. 두 테이블 간의 관계에 "WHERE" 조건을 직접 적용해야 합니다. 예:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers 왼쪽 연결 Document.Payment AS 결제 소프트웨어(Clients.Link = Payment.Client AND Payment.Client.Name LIKE "Sugar Packet") GROUP BY Clients.Link, Payment. 링크

8. 중첩 및 가상 테이블과 조인

중첩 쿼리일부 조건에 따라 데이터를 검색하는 데 필요한 경우가 많습니다. 그런 다음 다른 테이블과 함께 사용하면 쿼리 실행 속도가 크게 느려질 수 있습니다.

예를 들어 일부 클라이언트의 경우 현재 날짜 기준 잔액을 가져와야 합니다.

SELECT Unal locatedPaymentsBalances.Customer, Unal locatedPaymentsBalances.AmountBalance FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link B(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.UnallocationPayments.Balances AS Unal locatedPayments BY B falseRequest.Link = Unal locatedPaymentsBalances. 고객

이러한 쿼리를 실행할 때 DBMS 최적화 프로그램은 계획을 선택할 때 오류를 범할 수 있으며, 이로 인해 쿼리가 최적이 아닌 실행으로 이어질 수 있습니다. 두 테이블을 조인할 때 DBMS 최적화 프로그램은 두 테이블의 레코드 수를 기반으로 테이블 조인 알고리즘을 선택합니다. 중첩된 쿼리가 있는 경우 중첩된 쿼리가 반환할 레코드 수를 결정하는 것은 매우 어렵습니다. 따라서 중첩된 쿼리 대신 항상 임시 테이블을 사용해야 합니다. 그럼 요청을 다시 작성해 보겠습니다.

SELECT 클라이언트.링크 AS 링크 장소 tClients FROM Directory.클라이언트 AS 클라이언트 WHERE
클라이언트.링크 B(&클라이언트) ; /////////////////////////////////////////////// // ///////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocationPayments.Balances (, 클라이언트 IN (tClients.Link FROM tClients 선택)) AS UnallocatedPaymentsBalances tClients.Link = Unal locatedPaymentsBalances.Clients

이 경우 최적화 프로그램은 임시 테이블 tClients가 사용하는 레코드 수를 결정하고 테이블 조인을 위한 최적의 알고리즘을 선택할 수 있습니다.

가상 테이블 , 대부분의 응용 작업에 대해 실질적으로 기성 데이터를 얻을 수 있습니다.(Slice of the First, Slice of the Last, Remains, Turnovers, Remains 및 Turnovers) 여기서 핵심 단어는 가상입니다. 이 테이블은 물리적인 것이 아니지만 시스템에 의해 즉석에서 컴파일됩니다. 가상 테이블에서 데이터를 수신하면 시스템은 최종 레지스터 테이블에서 데이터를 수집하고 조립, 그룹화하여 사용자에게 발급합니다.

저것들. 가상 테이블에 연결하면 하위 쿼리에 연결됩니다. 이 경우 DBMS 최적화 프로그램은 최적이 아닌 연결 계획을 선택할 수도 있습니다. 쿼리가 충분히 빠르게 생성되지 않고 쿼리가 가상 테이블의 조인을 사용하는 경우 가상 테이블에 대한 액세스를 임시 테이블로 이동한 다음 두 임시 테이블 간에 조인을 만드는 것이 좋습니다. 이전 요청을 다시 작성해 보겠습니다.

SELECT 클라이언트.링크 AS 링크 장소 tClients FROM Directory.클라이언트 AS 클라이언트 INDEX BY 링크 WHERE
클라이언트.링크 B(&클라이언트) ; /////////////////////////////////////////////// // ///////////////////////// SELECT Unal locatedPayments.AmountBalance, Unal locatedPayments.Client AS Client PLACE 잔액 FROM RegisterAccumulations.UnallocationPayments.Balances(, 클라이언트 B ( tClients를 선택하세요. tClients에서 링크)) AS UnallocatedPaymentsBalances; /////////////////////////////////////////////// // ///////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9.요청 결과를 확인합니다.

쿼리 결과는 비어 있을 수 있습니다. 빈 값을 확인하려면 다음 구문을 사용하세요.

ResRequest = 요청.실행(); resQuery.Empty()이면 Return; endIf;

방법 비어 있는()메서드보다 먼저 사용해야 합니다. 선택하다()또는 부리다(), 컬렉션을 검색하는 데 시간이 걸리기 때문입니다.

루프에서 쿼리를 사용하는 것이 매우 바람직하지 않다는 사실은 누구에게도 드러나지 않습니다. 이는 특정 기능의 작동 시간에 심각한 영향을 미칠 수 있습니다. 요청의 모든 데이터를 수신한 다음 루프에서 데이터를 처리하는 것이 매우 바람직합니다. 그러나 때로는 요청을 루프 외부로 이동하는 것이 불가능해지는 경우가 있습니다. 이 경우 최적화를 위해 쿼리 생성을 루프 외부로 옮기고, 루프 내에서는 필요한 매개변수를 대체하여 쿼리를 실행하면 됩니다.

요청 = 새 요청; Query.Text = "선택 | Clients.Link, | Clients.Birthdate | FROM | Directory.Clients AS 클라이언트 |WHERE | Clients.Link = &클라이언트"; TableClients 루프의 각 행에 대해 Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); 엔드사이클;

이렇게 하면 시스템이 루프에서 요청을 구문 검사하지 않아도 됩니다.

11. 건설 "HAVING".

요청이 꽤 드문 디자인입니다. 집계 함수(SUM, MINIMUM, AVERAGE 등)의 값에 조건을 부과할 수 있습니다. 예를 들어, 9월 결제 금액이 13,000루블을 초과한 고객만 선택하면 됩니다. “WHERE” 조건을 사용하는 경우 먼저 임시 테이블이나 중첩 쿼리를 생성하고 결제 금액별로 레코드를 그룹화한 후 조건을 적용해야 합니다. “HAVING” 구성은 이를 방지하는 데 도움이 됩니다.

SELECT Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

이렇게 하려면 생성자에서 “조건” 탭으로 이동하여 새 조건을 추가하고 “사용자 지정” 확인란을 선택하세요. 그럼 그냥 쓰세요 금액(결제.금액) > 13000


12. NULL 값

여기서는 데이터베이스의 3값 논리 원리를 설명하지 않겠습니다. 이 주제에 대한 많은 기사가 있습니다. 방법에 대해 간단히 없는쿼리 결과에 영향을 줄 수 있습니다. NULL 값은 실제로는 값이 아니며, 값이 정의되지 않았다는 사실은 알 수 없습니다. 따라서 NULL을 사용한 모든 연산은 덧셈, 뺄셈, 나눗셈 또는 비교 등 NULL을 반환합니다. NULL 값은 무엇을 비교할지 모르기 때문에 NULL 값과 비교할 수 없습니다. 저것들. 두 비교는 모두 다음과 같습니다. NULL = NULL, NULL<>NULL은 True 또는 False가 아니며 알 수 없습니다.

예를 살펴보겠습니다.

결제가 없는 고객의 경우 "결제 없음" 값과 함께 "서명" 필드를 표시해야 합니다. 게다가 우리는 그러한 고객이 있다는 것을 확실히 알고 있습니다. 그리고 위에서 쓴 내용의 본질을 반영하기 위해 이렇게 해보겠습니다.

SELECT "결제 없음" AS 속성, NULL AS Document PLACE to Payments; /////////////////////////////////////////////// // ///////////////////////// Clients.Link AS 클라이언트 선택, Payment.Link 결제 방법 Directory.Clients AS 클라이언트에서 tClientPayment를 넣는 방법 왼쪽 연결 문서. 결제 AS 결제 소프트웨어 Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // ///////////////////////// tClientPayment AS tClientPayment에서 tClientPayment.Client를 선택 내부적으로 tPayment AS tTopay BY tClientPayment.Payment = tPayment.Document에 가입

두 번째 임시 테이블 tClientPayment에 주목하세요. 왼쪽 조인을 사용하여 모든 고객과 해당 고객에 대한 모든 지불을 선택합니다. 지불이 없는 고객의 경우 "지불" 필드는 NULL이 됩니다. 논리에 따라 첫 번째 임시 테이블 “tPayments”에서 2개의 필드를 지정했습니다. 그 중 하나는 NULL이고 두 번째 줄은 “Does not have Payments”입니다. 세 번째 테이블에서는 내부 조인을 통해 "Payment" 및 "Document" 필드를 사용하여 "tClientPayment" 및 "tPayment" 테이블을 연결합니다. 첫 번째 테이블의 “Document” 필드는 NULL이고, 두 번째 테이블의 “Payment” 필드에는 결제가 없는 사람도 NULL이라는 것을 알 수 있습니다. 그러한 연결은 우리에게 무엇을 돌려줄까요? 하지만 아무것도 반환하지 않습니다. NULL = NULL 비교가 True로 평가되지 않기 때문입니다.

요청이 예상된 결과를 반환하도록 다시 작성해 보겠습니다.

SELECT "결제 없음" AS 속성, VALUE(Document.Payment.EmptyLink) AS Document PLACE toPayments; /////////////////////////////////////////////// // ////////////////////////// SELECT Clients.Link AS 클라이언트, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) HOW 지불 PUT tClientPayment FROM Directory.Clients AS 클라이언트 왼쪽 연결 Document.Payment AS 지불 BY Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // ///////////////////////// tClientPayment AS tClientPayment에서 tClientPayment.Client를 선택 내부적으로 tPayment AS tTopay BY tClientPayment.Payment = tPayment.Document에 가입

이제 두 번째 임시 테이블에서 "결제" 필드가 NULL이면 이 필드는 결제 문서에 대한 빈 링크임을 표시했습니다. 첫 번째 테이블에서는 NULL을 빈 참조로 대체했습니다. 이제 연결에는 NULL이 아닌 필드가 포함되며 요청은 예상된 결과를 반환합니다.

기사에 포함된 모든 요청은 제가 고려하고 싶은 상황을 반영하며 그 이상은 아닙니다. 에 대한 그것들은 망상적이거나 차선책이 아닐 수도 있습니다. 가장 중요한 것은 예시의 본질을 반영한다는 것입니다.

13. "CHOICE WHEN...THEN...END" 디자인의 문서화되지 않은 기능입니다.

요청에서 "조건" 구성을 설명해야 하는 경우 표준 구문을 사용합니다.

SELECT SELECTION WHEN Users.Name = "Vasya Pupkin" THEN "우리가 가장 좋아하는 직원" ELSE "우리는 이것을 모릅니다" END AS Field1 FROM Directory.Users AS Users

하지만 예를 들어 요청에서 월 이름을 가져와야 한다면 어떻게 될까요? 요청에 거대한 구성을 작성하는 것은 추악하고 시간 소모적이므로 위의 작성 형식이 도움이 될 수 있습니다.

SELECT MONTH(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WHEN 1 THEN "1월" WHEN 2 THEN "2월" WHEN 3 THEN "3월" WHEN 4 THEN "4월" WHEN 5 THEN "5월" WHEN 6 THEN "6월" WHEN 7 그다음 "7월" " WHEN 8 그러면 "8월" WHEN 9 그러면 "9월" WHEN 10 그러면 "10월" WHEN 11 그러면 "11월" WHEN 12 그러면 "12월"은 한 달로 끝납니다

이제 디자인이 덜 번거로워 보이고 이해하기 쉽습니다.

14. 일괄 쿼리 실행.


요청이 늘어나지 않도록 하려면 하나의 큰 요청을 생성하고 이를 패키지로 분할하여 작업할 수 있습니다.
예를 들어, "Users" 디렉터리에서 "생년월일" 필드와 각 사용자가 사용할 수 있는 역할을 가져와야 합니다. 이를 양식의 다른 표 형식 부분에 업로드하십시오. 물론 한 번의 요청으로 이 작업을 수행할 수 있으며, 그런 다음 레코드를 반복하거나 축소해야 합니다. 또는 다음을 수행할 수 있습니다.

SELECT Users.Link AS 전체 이름, Users.생년월일, Users.Role PUT vtUsers FROM Directory.Users AS Users; /////////////////////////////////////////////// // ///////////////////////// SELECT tueUsers.전체 이름, tueUsers.생년월일 FROM tueUsers AS tueUsers GROUP BY tueUsers.전체 이름, tueUsers .생년월일 /////////////////////////////////////////////// // ///////////////////////// SELECT wUsers.전체 이름, wUsers.Role FROM wUsers AS wUsers GROUP BY wUsers.전체 이름, wUsers. 날짜 출생

tPackage = 요청.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

보시다시피 쿼리는 일괄적으로 실행될 수 있으며 결과는 배열로 처리될 수 있습니다. 어떤 경우에는 매우 편리합니다.

15. 일괄 요청의 조건

예를 들어, 먼저 "사용자" 디렉터리에서 "이름, 생년월일, 코드" 필드를 가져오고 "개인" 디렉터리에서 이러한 필드에 대한 조건이 포함된 레코드를 가져오는 일괄 요청이 있습니다.

SELECT Users.Individual.Name AS 이름, Users.Individual.생년월일 AS 생년월일, Users.Individual.Code AS 코드 PLACE vtUsers FROM Directory.Users AS Users; /////////////////////////////////////////////// // /////////////////////////// 개인 선택. 디렉터리에서 개인으로 연결. 개인 AS 개인

다음과 같은 조건을 부과할 수 있습니다.

WHERE Individuals.Code IN(vtUsers에서 vtUsers.Code 선택) AND Individuals.Name IN(vtUsers에서 vtUsers.Code 선택) AND Individuals.BirthDate IN(tvUsers에서 vtUsers.DateBirth 선택)

그리고 다음과 같이 할 수 있습니다:

WHERE (개인.코드, 개인.이름, 개인.생년월일) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Date of Birth FROM tueUsers)

게다가 질서를 유지하는 것도 필요하다.

16. 일괄 요청에서 "조건"에 대한 쿼리 빌더 호출

위의 예와 같이 조건을 부과해야 하는 경우 가상 테이블에서 이 필드 또는 해당 필드가 어떻게 호출되는지 잊어버릴 수 있습니다.
예를 들어 "생년월일" 필드에 조건을 부과해야 하는데, 가상 테이블에서는 이 필드를 "채무자의 생년월일"이라고 하며, 이름을 잊어버린 경우 조건 편집을 종료하지 않고 종료해야 합니다. 저장하고 필드 이름을 확인하세요. 이를 방지하려면 다음 기술을 사용할 수 있습니다.

구성 “B” 뒤에 대괄호를 넣고 대괄호 사이에 빈 공간(공백)을 남겨두고 이 공간을 선택하고 쿼리 생성자를 호출해야 합니다. 디자이너는 일괄 쿼리의 모든 테이블에 액세스할 수 있습니다. 이 기술은 가상 레지스터 테이블과 "조건" 탭 모두에서 작동합니다. 후자의 경우에는 "P(임의 조건)" 상자를 체크하고 편집 모드 "F4"로 들어가야 합니다.

쿼리는 종종 즉석에서 작성되었으며 단순히 제가 고려하고 있던 "기술"을 설명하는 역할을 했습니다.

쿼리에서 인덱스의 사용을 살펴보고 싶었지만 이는 매우 광범위한 주제입니다. 별도의 글에 올리거나 나중에 여기에 추가하겠습니다.

upd1. 포인트 11,12
upd2. 포인트 13,14,15,16

중고 도서:
쿼리 언어 "1C:Enterprise 8" - E.Yu. 흐루스탈레바
1C:Enterprise 8 시스템의 전문 개발."

요청사항데이터베이스에서 정보를 추출하고 처리하여 사용자에게 필요한 형식으로 제공하도록 설계되었습니다. 여기서 처리란 필드 그룹화, 행 정렬, 합계 계산 등을 의미합니다. 1C에서는 쿼리를 사용하여 데이터를 변경할 수 없습니다!

요청은 주어진 지침에 따라 실행됩니다. 요청 텍스트. 요청 텍스트는 구문 및 규칙에 따라 컴파일됩니다. 쿼리 언어. 1C:Enterprise 8 쿼리 언어는 표준을 기반으로 합니다. SQL이지만 몇 가지 차이점과 확장 기능이 있습니다.

요청 작업 계획

요청 작업의 일반적인 계획은 여러 연속 단계로 구성됩니다.

  1. 요청 객체 생성 및 요청 텍스트 설정
  2. 요청 매개변수 설정
  3. 요청을 실행하고 결과를 얻습니다.
  4. 요청 결과를 우회하고 수신된 데이터를 처리합니다.

1. 객체 요구재산을 가지고 있다 텍스트, 요청 텍스트를 할당해야 합니다.

// 옵션 1
요청 = 새 요청;
요구 . 텍스트 =
"선택하다
| 환율.기간,
| 환율.통화,
| 환율.비율
|발신

|어디
;

// 옵션 2
요청 = 새 요청("선택하다
| 환율.기간,
| 환율.통화,
| 환율.비율
|발신
| 정보 등록. 환율 AS 환율
|어디
| 환율.통화 = 통화(&C)");

2. 매개변수 값 설정은 다음 방법을 사용하여 수행됩니다. 매개변수 설정(< Имя>, < Значение>) . 요청 텍스트의 매개변수는 " 기호로 표시됩니다. & "이며 일반적으로 선택 조건(WHERE 섹션) 및 가상 테이블 매개변수에 사용됩니다.

요구);

3. 텍스트를 할당하고 매개변수를 설정한 후 요청을 실행하고 실행 결과를 얻어야 합니다. 실행은 객체를 반환하는 Execute() 메서드에 의해 수행됩니다. 쿼리 결과. 쿼리 결과에서 다음을 수행할 수 있습니다.

  • Select 메서드를 사용하여 선택 항목 가져오기 (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • Upload 메소드를 사용하여 값 테이블 또는 값 트리에 값 업로드 (< ТипОбхода>) .

// 샘플 받기

견본 = 쿼리 결과. 선택하다();

// 값 테이블 얻기
요청결과 = 요청. 달리다();
테이블 = 쿼리 결과. 부리다();

4. 루프를 사용하여 쿼리 결과 선택을 우회할 수 있습니다.

안녕 Sample.Next() 루프
보고서(선택.과정);
엔드사이클;

요청 작업의 전체 예는 다음과 같습니다.

// 1단계. 요청 생성 및 요청 텍스트 설정
요청 = 새 요청;
요구 . 텍스트 =
"선택하다
| 환율.기간,
| 환율.통화,
| 환율.비율
|발신
| 정보 등록. 환율 AS 환율
|어디
| 환율.통화 = 통화(&C)";

// 2단계. 매개변수 설정
요구 . SetParameter("통화" , Selected통화);

// 3단계. 쿼리 실행 및 샘플 가져오기
요청결과 = 요청. 달리다();
견본 = 쿼리 결과. 선택하다();

// 선택 영역 탐색
안녕 Sample.Next() 루프
보고서(선택.과정);
엔드사이클;

요청 텍스트 구성

요청 텍스트는 여러 섹션으로 구성됩니다.

  1. 요청 설명— 선택 가능한 필드 및 데이터 소스 목록
  2. 쿼리 병합- "UNITE" 및 "UNITE ALL" 표현;
  3. 결과 정리- "ORDER BY..."라는 표현
  4. 자동주문- "자동 주문" 표현;
  5. 결과 설명- "결과 ... BY ..."라는 표현.

첫 번째 섹션만 필수입니다.

임시 테이블 및 일괄 쿼리

1C 쿼리 언어는 사용을 지원합니다 임시 테이블— 쿼리 결과로 얻어지고 임시로 저장되는 테이블입니다.

데이터베이스 테이블을 쿼리 소스로 사용하지 않고 다른 쿼리 실행 결과를 사용해야 하는 상황이 자주 발생할 수 있습니다. 이 문제는 중첩된 쿼리를 사용하거나 임시 테이블. 임시 테이블을 사용하면 복잡한 쿼리를 구성 요소 부분으로 나누어 텍스트를 단순화할 수 있으며 경우에 따라 쿼리 실행 속도를 높이고 잠금 수를 줄일 수도 있습니다. 임시 테이블로 작업하려면 객체를 사용하십시오. 시간표 관리자. 임시 테이블은 PLACE 키워드와 임시 테이블 이름을 사용하여 생성됩니다.

ManagerVT = 새로운 TemporaryTablesManager;
요청 = 새 요청;
요구 . ManagerTemporaryTables = ManagerVT;

요구 . 텍스트 =
"선택하다
| 통화.코드,
| 통화.이름
|통화로 배치
|발신
| Directory.통화 AS 통화";

요청결과 = 요청. 실행하다();

다른 쿼리에서 VTVcurrency 임시 테이블을 사용하려면 이러한 쿼리에 공통 임시 테이블 관리자인 VT Manager를 할당해야 합니다.

일괄요청";" 문자로 구분된 여러 요청이 포함된 요청입니다. 일괄 쿼리를 실행하면 그에 포함된 모든 쿼리가 순차적으로 실행되며, 모든 임시 테이블의 결과는 이후의 모든 쿼리에서 사용할 수 있습니다. 일괄 쿼리에 임시 테이블 관리자를 명시적으로 할당할 필요는 없습니다. 임시 테이블 관리자가 지정되지 않은 경우 쿼리 실행 후 모든 임시 테이블이 즉시 삭제됩니다.

일괄 쿼리의 경우 모든 쿼리를 실행하고 결과 배열을 반환하는 ExecuteBatch() 메서드를 사용할 수 있습니다. 일괄 쿼리의 임시 테이블은 레코드 수를 저장하는 "Count"라는 1개의 행과 1개의 열이 있는 테이블로 표시됩니다. 일괄 요청을 디버그하려면 다음 메소드를 사용할 수 있습니다. 중간 데이터로 일괄 실행() : 레코드 개수가 아닌 임시 테이블의 실제 내용을 반환합니다.

// 일괄 요청 작업의 예
요청 = 새 요청;
요구 . 텍스트 =
"선택하다
| 통화.이름
|발신
| 디렉토리.통화 AS 통화
|;
|선택
| 명칭.이름
|발신
| 디렉토리. 명명법 AS 명명법";

일괄 결과 = 요청. 실행배치();

TZ통화 =패킷결과[ 0 ]. 부리다();
TZNomenclature = 패키지 결과[ 1 ]. 부리다();

// 일괄 요청에서 임시 테이블을 사용하는 예
요청 = 새 요청;
요구 . 텍스트 =
"선택하다
| 제품.제품안내 링크
|PLACE VT제품
|발신
| 디렉토리.명칭 HOW 제품
|어디
| 제품.제조업체 = 제조업체(&Manufacturer)
|;
|선택
| VTT제품.제품,
| 직업 학교.수량,
| 직업 학교.가격,
| 직업 학교.AS 문서 영수증 링크
|발신
| VT 제품은 VT 제품과 같습니다.
| 왼쪽 연결 문서 상품 및 서비스 수령 PTU 상품
| 소프트웨어 VTProducts.Product = PTU.Nomenclature"
;

요구 . 매개변수 설정( "제조업체", 제조업체);

요청결과 = 요청. 달리다();
견본 = 쿼리 결과. 선택하다();

안녕 Sample.Next() 루프

엔드사이클;

가상 테이블

가상 테이블- 데이터베이스에 저장되지 않지만 플랫폼에 의해 생성되는 테이블입니다. 핵심은 플랫폼에서 실행되는 하나 이상의 물리적 테이블에 대한 중첩 쿼리입니다. 가상 테이블은 레지스터에서만 정보를 수신하며 주로 고도로 전문화된 문제를 해결하기 위한 것입니다.

다음과 같은 가상 테이블이 존재합니다(가능한 매개변수는 괄호 안에 표시됨).

  • 정보 레지스터의 경우:
    • 슬라이스첫번째(<Период>, <Условие>) — 지정된 날짜의 가장 빠른 레코드입니다.
    • 슬라이스마지막(<Период>, <Условие>) — 지정된 날짜의 최신 기록입니다.
  • 누적 레지스터의 경우:
    • 나머지(<Период>, <Условие>) — 지정된 날짜의 잔액
    • 혁명(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - 기간 거래;
    • 잔여 및 회전율(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) - 해당 기간의 잔액 및 매출액
  • 회계 기록부의 경우:
    • 나머지(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) - 계정, 측정 및 하위 콘토의 맥락에서 지정된 날짜의 잔액입니다.
    • 혁명(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) - 계정, 측정 등의 맥락에서 해당 기간 동안의 매출액. 계정, 하위 콘토, 오호. 하위 계속;
    • 잔여 및 회전율(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) - 계정, 측정 및 하위 계산과 관련된 잔액 및 매출액
    • 매출액DtKt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) - 계정 Dt, 계정 Kt, Subconto Dt, Subconto Kt와 관련된 기간 동안의 매출액
    • 무브먼트Subconto(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) - 하위 콘토 값과 함께 이동합니다.
  • 계산 레지스터의 경우:
    • 베이스(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) - 계산 레지스터의 기본 데이터;
    • 데이터그래픽(<Условие>) - 그래프 데이터;
    • 실제작업기간(<Условие>)는 실제 유효기간입니다.

가상 테이블 작업 시 WHERE 조건이 아닌 가상 테이블의 매개변수에 선택 사항을 적용해야 합니다. 이는 쿼리 실행 시간에 큰 영향을 미칩니다.

쿼리 생성자

쿼리 텍스트 입력 속도를 높이기 위해 플랫폼에는 다음과 같은 특수 도구가 있습니다. 쿼리 생성자그리고 결과 처리 기능이 있는 쿼리 생성자. 생성자를 호출하려면 마우스 오른쪽 버튼을 클릭하고 필요한 항목을 선택해야 합니다.

메인 메뉴에서 생성자를 호출할 수도 있습니다. 텍스트.

프로그래머는 쿼리 빌더를 사용하여 쿼리 텍스트를 대화형으로 구성할 수 있습니다. 이렇게 하려면 마우스로 필요한 테이블과 필드를 선택하고 관계, 그룹화, 합계 등을 설정합니다. 이 접근 방식은 시간을 절약하고 가능한 오류를 제거합니다. 작업 결과 쿼리 생성자는 쿼리 텍스트를 생성합니다.

결과 처리 기능이 있는 쿼리 생성자는 쿼리 텍스트를 생성하는 것 외에도 데이터 수신 및 처리를 위해 미리 만들어진 코드 조각을 생성합니다.

RequestSchema 개체

플랫폼을 사용하면 객체를 사용하여 요청 텍스트를 프로그래밍 방식으로 생성하고 편집할 수 있습니다. 스키마 요청. 객체에는 단일 속성이 있습니다. 일괄 요청, 개체는 현재 편집 중인 모든 쿼리의 속성을 저장합니다. RequestSchema 개체는 다음 메서드를 지원합니다.

  • SetQueryText(< Текст>) — 제출된 요청 텍스트를 기반으로 Query Packet 속성을 채웁니다.
  • 쿼리텍스트 가져오기() - 요청 패킷 속성을 기반으로 생성된 요청 텍스트를 반환합니다.
  • FindParameters() - 요청 매개변수를 반환합니다.

RequestSchema 개체 작업의 예를 살펴보겠습니다. 요청 텍스트를 프로그래밍 방식으로 생성하려면

정렬 기준
통화.코드

포함된 언어 코드는 다음과 같습니다.

RequestScheme = 새로운 RequestScheme;
패키지 1 = 요청 방식. 요청배치[ 0 ];
Operator1 = 패키지1. 연산자[ 0 ];
// 소스 추가
RegisterTable = Operator1. 출처. 추가하다( "디렉토리.통화", "통화" );
// 필드 추가
필드링크 = 운영자1. 선택 가능한 필드. Add("통화.링크" , 0 );
필드 코드 = 운영자1. 선택 가능한 필드. Add("통화.코드", 1);
// 필드 별칭 지정
패키지 1 . 열[ 0 ]. 별칭 = "통화" ;
패키지 1 . 열[ 1 ]. 별칭 = "코드" ;
// 조건 추가
Operator1 . 선택. 추가하다( "플래그 삭제가 아님");
// 순서 추가
패키지 1 . 주문하다. 추가(필드 코드);
RequestText = RequestScheme. 쿼리텍스트 가져오기();

1C 8의 쿼리 언어는 잘 알려진 "구조적 프로그래밍 언어"(더 자주 SQL이라고 함)의 단순화된 유사체입니다. 그러나 1C에서는 데이터를 읽는 데에만 사용되며 객체 데이터 모델은 데이터를 변경하는 데 사용됩니다.

또 다른 흥미로운 차이점은 러시아어 구문입니다. 실제로 영어 구성을 사용할 수 있습니다.

요청 예시:

선택하다
은행.이름,
Banks.Corr계정
에서
Directory.Banks HOW 은행

이 요청을 통해 우리는 데이터베이스에 존재하는 모든 은행의 이름과 거래 계좌에 대한 정보를 볼 수 있습니다.

쿼리 언어는 정보를 얻는 가장 간단하고 효과적인 방법입니다. 위의 예에서 볼 수 있듯이 쿼리 언어에서는 메타데이터 이름(구성을 구성하는 시스템 개체 목록, 즉 디렉터리, 문서, 레지스터 등)을 사용해야 합니다.

쿼리 언어 구성에 대한 설명

쿼리 구조

데이터를 얻으려면 "SELECT" 및 "FROM" 구성을 사용하는 것으로 충분합니다. 가장 간단한 요청은 다음과 같습니다.

SELECT * FROM 디렉터리.명칭

여기서 "*"는 테이블의 모든 필드 선택을 의미하고 Directories.Nomenclature는 데이터베이스의 테이블 이름을 의미합니다.

좀 더 복잡하고 일반적인 예를 살펴보겠습니다.

선택하다
<ИмяПоля1>어떻게<ПредставлениеПоля1>,
합집합(<ИмяПоля2>) 어떻게<ПредставлениеПоля2>
에서
<ИмяТаблицы1>어떻게<ПредставлениеТаблицы1>
<ТипСоединения>화합물<ИмяТаблицы2>어떻게<ПредставлениеТаблицы2>
에 의해<УсловиеСоединениеТаблиц>

어디
<УсловиеОтбораДанных>

그룹 기준
<ИмяПоля1>

정렬 기준
<ИмяПоля1>

결과
<ИмяПоля2>
에 의해
<ИмяПоля1>

이 쿼리에서는 "TableName1" 및 "TableName" 테이블에서 "FieldName1" 및 "FieldName1" 필드의 데이터를 선택하고 "HOW" 연산자를 사용하여 필드에 동의어를 할당한 다음 특정 조건 "TableConnectionCondition"을 사용하여 연결합니다. ".

수신된 데이터 중 “WHERE” “데이터 선택 조건”의 조건을 만족하는 데이터만 선택하고 “Field Name1” 필드별로 요청을 그룹화하고 “Field Name2”를 합산하여 해당 필드에 대한 합계를 생성합니다. "필드 이름1"과 마지막 필드 "필드 이름2"입니다.

마지막 단계는 "ORDER BY" 구문을 사용하여 쿼리를 정렬하는 것입니다.

일반 디자인

1C 8.2 쿼리 언어의 일반적인 구조를 살펴 보겠습니다.

첫 번째N

이 연산자를 사용하면 n개의 첫 번째 레코드를 얻을 수 있습니다. 레코드의 순서는 쿼리의 순서에 따라 결정됩니다.

처음 100개 선택
은행.이름,
은행. 코드 AS BIC
에서
Directory.Banks HOW 은행
정렬 기준
은행.이름

쿼리는 알파벳순으로 정렬된 "Banks" 디렉터리의 처음 100개 항목을 수신합니다.

허용된

이 디자인은 메커니즘 작업과 관련이 있습니다. 메커니즘의 핵심은 테이블 전체가 아닌 데이터베이스 테이블의 특정 레코드에 대한 사용자의 읽기(및 기타 작업)를 제한하는 것입니다.

사용자가 쿼리를 통해 사용할 수 없는 레코드를 읽으려고 하면 오류 메시지가 표시됩니다. 이를 방지하려면 "허용" 구성을 사용해야 합니다. 즉, 요청은 허용된 레코드만 읽습니다.

허용됨 선택
추가 정보 저장소 링크
에서
디렉토리.추가 정보 저장소

다양한

"DIFFERENT"를 사용하면 1C 쿼리 결과 입력에서 중복 행을 제외할 수 있습니다. 중복은 모든 요청 필드가 일치함을 의미합니다.

처음 100개 선택
은행.이름,
은행. 코드 AS BIC
에서
Directory.Banks HOW 은행

빈테이블

이 구성은 쿼리를 결합하는 데 거의 사용되지 않습니다. 조인 시 테이블 중 하나에 빈 중첩 테이블을 지정해야 할 수도 있습니다. 여기에는 "EmptyTable" 연산자가 적합합니다.

1C 8 도움말의 예:

SELECT Link.번호, EMPTY TABLE.(번호, 품목, 수량) AS 구성
FROM 문서.비용 청구서
모든 것을 결합하세요
SELECT 링크.번호, 내용.(라인번호, 제품, 수량)
FROM 문서.송장 문서.송장.구성.*

ISNULL

많은 실수를 방지할 수 있는 매우 유용한 기능입니다. YesNULL()을 사용하면 NULL 값을 원하는 값으로 바꿀 수 있습니다. 조인된 테이블에 값이 있는지 확인하는 데 매우 자주 사용됩니다. 예를 들면 다음과 같습니다.

선택하다
명명법 참조 링크,
IsNULL(남은 항목.QuantityRemaining,0) AS QuantityRemaining
에서


다른 방법으로 사용할 수 있습니다. 예를 들어, 각 행에 대해 어느 테이블에 값이 존재하는지 알 수 없는 경우:

ISNULL(InvoiceReceived.Date, InvoiceIssued.Date)

HOW는 테이블이나 필드에 이름(동의어)을 할당할 수 있는 연산자입니다. 위에서 사용 예를 보았습니다.

이러한 구성은 매우 유사합니다. 이를 통해 원하는 값의 문자열 표현을 얻을 수 있습니다. 유일한 차이점은 REPRESENTATION은 모든 값을 문자열 유형으로 변환하는 반면 REPRESENTATIONREF는 참조 값만 변환한다는 것입니다. REFERENCE REPRESENTATION은 물론 참조 데이터 필드가 선택에 사용되도록 계획되지 않은 한 최적화를 위한 데이터 구성 시스템 쿼리에 사용하는 것이 좋습니다.

선택하다
View(Link), //string, 예를 들어 "2015년 10월 10일자 사전보고서 123호"
Representation(DeleteMark) AS DeleteMarkText, //문자열, "예" 또는 "아니요"
ReferenceRepresentation(DeletionMark) AS DeletionMarkBoolean //부울, True 또는 False
에서
문서.사전보고

표현하다

Express를 사용하면 필드 값을 원하는 데이터 유형으로 변환할 수 있습니다. 값을 기본 유형 또는 참조 유형으로 변환할 수 있습니다.

참조 유형용 Express는 시스템 성능을 최적화하는 데 자주 사용되는 복합 유형 필드에서 요청된 데이터 유형을 제한하는 데 사용됩니다. 예:

EXPRESS(비용 테이블.Subconto1 AS 디렉터리.비용 항목).활동 유형비용 세무 회계용

기본 유형의 경우 이 함수는 길이가 무제한인 필드의 문자 수를 제한하는 데 자주 사용됩니다(해당 필드와 비교할 수 없음). 오류를 방지하려면 " 비교 작업의 매개변수가 잘못되었습니다. 필드를 비교할 수 없습니다.
무제한 길이 및 호환되지 않는 유형의 필드
"의 경우 해당 필드를 다음과 같이 표현해야 합니다.

EXPRESS(댓글 AS라인(150))

차이 날짜

1C에서 267개의 비디오 강의를 무료로 받으세요:

1C 요청에서 IS NULL을 사용하는 예:

다음에서 선택하세요
참조
왼쪽 연결 RegisterAccumulations.ProductsInWarehouses.Remaining AS 남은 제품
소프트웨어 NomenclatureRef.Link = Sold GoodsCommitteesRemains.Nomenclature
남은 상품이 없는 곳. QuantityRemaining IS NULL

쿼리의 데이터 유형은 TYPE() 및 VALUETYPE() 함수를 사용하거나 논리 REFERENCE 연산자를 사용하여 확인할 수 있습니다. 두 기능은 비슷합니다.

사전 정의된 값

1C 쿼리 언어의 쿼리에 전달된 매개변수를 사용하는 것 외에도 사전 정의된 값 또는 . 예를 들어 이체, 사전 정의된 디렉토리, 계정과목표 등을 위해 "Value()" 구성이 사용됩니다.

사용 예:

WHERE Nomenclature.Type of Nomenclature = 값(디렉토리.Types of Nomenclature.Product)

WHERE 상대방.연락처 정보 유형 = 값(열거.연락처 정보 유형.전화)

WHERE 계정 잔액.회계 계정 = 값(계정 차트.Profit.ProfitsLoss)

사이

연결에는 4가지 유형이 있습니다. 왼쪽, 오른쪽, 전체, 내부.

왼쪽 및 오른쪽 연결

조인은 특정 조건에 따라 두 테이블을 연결하는 데 사용됩니다. 언제 기능 왼쪽 조인첫 번째 지정된 테이블 전체를 가져와 두 번째 테이블을 조건부로 바인딩하는 것입니다. 조건으로 바인딩할 수 없는 두 번째 테이블의 필드는 해당 값으로 채워집니다. 없는.

예를 들어:

거래 당사자의 전체 테이블을 반환하고 "상대방.이름 = 은행.이름" 조건이 충족되는 위치에만 "은행" 필드를 채웁니다. 조건이 충족되지 않으면 은행 필드가 다음으로 설정됩니다. 없는.

1C 언어로 RIGHT JOIN완전 비슷하다 왼쪽 연결, 한 가지 차이점을 제외하고는 연결 권리"기본" 테이블은 첫 번째가 아닌 두 번째 테이블입니다.

완전한 연결

완전한 연결두 테이블의 모든 레코드를 표시하고 조건에 따라 연결할 수 있는 레코드만 연결한다는 점에서 왼쪽과 오른쪽과 다릅니다.

예를 들어:

에서

완전한 연결
Directory.Banks HOW 은행

에 의해

쿼리 언어는 레코드 조인 조건이 충족되는 경우에만 두 테이블을 완전히 반환합니다. 왼쪽/오른쪽 조인과 달리 NULL이 두 필드에 나타날 수 있습니다.

내부 조인

내부 조인주어진 조건에 따라 연결될 수 있는 레코드만 표시한다는 점에서 전체 레코드와 다릅니다.

예를 들어:

에서
디렉터리. 상대방 AS 클라이언트

내부 조인
Directory.Banks HOW 은행

에 의해
클라이언트.이름 = 은행.이름

이 쿼리는 은행과 상대방의 이름이 동일한 행만 반환합니다.

협회

JOIN 및 JOIN ALL 구문은 두 결과를 하나로 결합합니다. 저것들. 두 가지를 수행한 결과는 하나의 공통된 결과로 "병합"됩니다.

즉, 시스템은 임시 테이블에 대해서만 일반 시스템과 동일하게 작동합니다.

INDEX BY 사용 방법

그러나 한 가지 점을 고려해야 합니다. 임시 테이블에 인덱스를 구축하는 것도 완료하는 데 시간이 걸립니다. 따라서 임시 테이블에 1~2개 이상의 레코드가 있을 것이 확실하게 알려진 경우에만 “ ” 구성을 사용하는 것이 좋습니다. 그렇지 않으면 효과가 반대가 될 수 있습니다. 인덱스된 필드의 성능은 인덱스를 작성하는 데 걸리는 시간을 보상하지 않습니다.

선택하다
환율 최신 단면 통화 AS 통화,
환율 최신 단면.
PUT 환율
에서
정보 등록.통화 환율.마지막 조각(&기간,) AS 환율마지막 조각
색인 기준
통화
;
선택하다
가격명칭.명칭,
가격명칭. 가격,
가격명칭.통화,
환율.비율
에서
정보 등록.명목 가격.마지막 슬라이스(&기간,
명명법 B (&Nomenclature) AND PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN 환율 AS 환율
소프트웨어 가격Nomenclatures.Currency = 환율.Currency

그룹화

1C 쿼리 언어를 사용하면 쿼리 결과를 그룹화할 때 특수 집계 함수를 사용할 수 있습니다. 중복을 "제거"하기 위해 집계 함수 없이 그룹화를 사용할 수도 있습니다.

다음과 같은 기능이 있습니다:

금액, 수량, 개수, 최대, 최소, 평균.

예시 #1:

선택하다
상품 및 서비스 상품 판매.
SUM(Sales of GoodsServicesGoods.Quantity) AS 수량,
SUM(Sales of GoodsServicesGoods.Amount) AS 금액
에서

그룹 기준
상품 및 서비스 상품 판매.

쿼리는 상품이 포함된 모든 라인을 수신하고 품목 컨텍스트에서 수량 및 금액별로 요약합니다.

예 2

선택하다
은행.코드,
수량(다른 은행.링크) AS 중복 수
에서
Directory.Banks HOW 은행
그룹 기준
은행.코드

이 예에서는 "Banks" 디렉터리에 있는 BIC 목록을 표시하고 각 BIC에 대해 존재하는 중복 항목 수를 보여줍니다.

결과

결과는 계층 구조를 가진 시스템에서 데이터를 얻는 방법입니다. 그룹화와 마찬가지로 요약 필드에도 집계 함수를 사용할 수 있습니다.

실제로 총계를 사용하는 가장 널리 사용되는 방법 중 하나는 상품 일괄 상각입니다.

선택하다




에서
문서 상품 및 서비스 판매 상품 상품 및 서비스 판매 방법 상품
정렬 기준

결과
합계(수량),
SUM(합계)
에 의해
명명법

쿼리 결과는 다음과 같은 계층 구조가 됩니다.

일반 결과

모든 "총계"에 대한 합계를 구해야 하는 경우 "TOTAL" 연산자를 사용하세요.

선택하다
상품 및 서비스 상품 판매 명칭 AS 명칭,
상품 및 서비스 상품 판매 AS 문서 링크,
상품 및 서비스 상품 판매 수량 AS 수량,
상품 및 서비스 상품 판매 금액 AS 금액
에서
문서 상품 및 서비스 판매 상품 상품 및 서비스 판매 방법 상품
정렬 기준
상품 및 서비스 상품 판매 링크 날짜
결과
합계(수량),
SUM(합계)
에 의해
흔하다,
명명법

요청을 실행한 결과 다음과 같은 결과를 얻습니다.

1단계 그룹화는 필요한 모든 필드를 집계하는 것입니다.

정리

ORDER BY 연산자는 쿼리 결과를 정렬하는 데 사용됩니다.

기본 유형(문자열, 숫자, 부울) 정렬은 일반적인 규칙을 따릅니다. 참조 유형 필드의 경우 정렬은 코드나 참조 표현이 아닌 참조의 내부 표현(고유 식별자)에서 발생합니다.

선택하다

에서
디렉토리.명칭 AS 명명법
정렬 기준
이름

요청은 명명법 디렉토리의 이름 목록을 알파벳순으로 정렬하여 표시합니다.

자동주문

정렬되지 않은 쿼리의 결과는 무작위로 표시된 행 집합입니다. 1C 플랫폼 개발자는 동일한 쿼리를 실행할 때 행이 동일한 순서로 출력된다는 것을 보장하지 않습니다.

테이블 레코드를 일정한 순서로 표시해야 하는 경우 자동 순서 구성을 사용해야 합니다.

선택하다
명명법.이름 AS 이름
에서
디렉토리.명칭 AS 명명법
자동 주문

가상 테이블

1C의 가상 테이블은 다른 유사한 구문에서는 찾을 수 없는 1C 쿼리 언어의 고유한 기능입니다. 가상 테이블은 레지스터에서 프로필 정보를 얻는 빠른 방법입니다.

각 레지스터 유형에는 레지스터 설정에 따라 다를 수 있는 자체 가상 테이블 세트가 있습니다.

  • 첫 번째 컷;
  • 후자의 컷.
  • 나머지;
  • 혁명;
  • 잔액과 매출액.
  • subconto의 움직임;
  • 혁명;
  • 속도 Dt Kt;
  • 나머지;
  • 잔액 및 매출액
  • 하위 계속.
  • 베이스;
  • 그래프 데이터;
  • 실제 유효기간.

솔루션 개발자의 경우 하나의 (가상) 테이블에서 데이터를 가져오지만 실제로 1C 플랫폼은 여러 테이블에서 가져와 원하는 형식으로 변환합니다.

선택하다
창고에 남아있는 제품과 회전율.
제품InWarehousesRemainingAndTurnover.QuantityInitialRemaining,
제품창고유지및회전율.수량회전율,
GoodsInWarehousesRemainsAndTurnover.QuantityIncoming,
GoodsInWarehousesRemainsAndTurnover.Quantity소비,
제품창고남음및회전율.최종남은수량
에서
등록집적.창고에 있는 물품.잔고 및 회전율 AS 물품창고에 남아 있고 회전율

이 쿼리를 사용하면 많은 양의 데이터를 빠르게 검색할 수 있습니다.

가상 테이블 옵션

가상 테이블 작업에서 매우 중요한 측면은 매개변수 사용입니다. 가상 테이블 매개변수는 선택 및 구성을 위한 특수 매개변수입니다.

이러한 테이블의 경우 "WHERE" 구성에서 선택을 사용하는 것은 잘못된 것으로 간주됩니다. 쿼리가 최적이 아닐 뿐만 아니라 잘못된 데이터를 받을 수도 있습니다.

이러한 매개변수를 사용하는 예:

누적 등록, 창고의 상품, 잔액 및 회전율(& 기간 시작, 기간 종료, 월, 이동 및 경계, 명명법 = & 필수 명명법)

가상 테이블 알고리즘

예를 들어, 가장 많이 사용되는 "Remains" 유형의 가상 테이블은 균형과 이동이라는 두 가지 물리적 테이블의 데이터를 저장합니다.

가상 테이블을 사용할 때 시스템은 다음 조작을 수행합니다.

  1. 총계 표에는 날짜와 측정값 측면에서 가장 가까운 계산 값이 표시됩니다.
  2. 이동 테이블의 금액을 총계 테이블의 금액에 "추가"합니다.


이러한 간단한 조치는 시스템 전체의 성능을 크게 향상시킬 수 있습니다.

쿼리 빌더 사용

쿼리 빌더– 데이터베이스 쿼리 개발을 크게 촉진하는 1C Enterprise 시스템에 내장된 도구입니다.

쿼리 빌더는 매우 간단하고 직관적인 인터페이스를 가지고 있습니다. 그럼에도 불구하고 쿼리 생성자를 사용하는 방법을 좀 더 자세히 살펴보겠습니다.

쿼리 텍스트 생성자는 프로그램 코드의 원하는 위치에 있는 상황에 맞는 메뉴(마우스 오른쪽 버튼)에서 실행됩니다.

1C 요청 생성자에 대한 설명

디자이너의 각 탭을 좀 더 자세히 살펴보겠습니다. 다른 토론 주제인 Builder 탭은 예외입니다.

테이블 및 필드 탭

이 탭에서는 보고서에 표시해야 하는 데이터 소스와 필드를 지정합니다. 본질적으로 여기에는 SELECT.. FROM 구성이 설명되어 있습니다.

소스는 물리적 데이터베이스 테이블, 가상 레지스터 테이블, 임시 테이블, 중첩 쿼리 등이 될 수 있습니다.

가상 테이블의 컨텍스트 메뉴에서 가상 테이블의 매개변수를 설정할 수 있습니다.

연결 탭

탭은 여러 테이블의 연결을 설명하는 데 사용되며 JOIN이라는 단어로 구성을 만듭니다.

그룹화 탭

이 탭에서는 테이블 결과의 원하는 필드를 그룹화하고 요약할 수 있습니다. GROUP BY, SUM, MINIMUM, AVERAGE, MAXIMUM, NUMBER, NUMBER OF DIFFERENT 구조의 사용이 설명됩니다.

조건 탭

WHERE 구문 뒤의 요청 텍스트에 포함되는 모든 내용, 즉 수신된 데이터에 적용되는 모든 조건을 담당합니다.

고급 탭

추가적으로매우 중요한 모든 종류의 매개변수로 가득 차 있습니다. 각각의 속성을 살펴보겠습니다.

그룹화 레코드 선택:

  • 첫 번째 N– 쿼리에 N개의 레코드만 반환하는 매개변수(FIRST 연산자)
  • 중복 없음– 수신된 레코드의 고유성을 보장합니다(DIFFERENT 연산자).
  • 허용된– 시스템에서 고려할 수 있는 레코드만 선택할 수 있습니다(허용된 구성).

그룹화 요청 유형데이터 가져오기, 임시 테이블 생성, 임시 테이블 삭제 등 쿼리 유형을 결정합니다.

아래에는 깃발이 있습니다 나중에 수정하기 위해 수신된 데이터를 잠급니다.. 이를 통해 데이터를 읽는 순간부터 수정하는 순간까지 데이터의 안전을 보장하는 데이터 잠금 설정 기능을 활성화할 수 있습니다(자동 잠금 모드에만 해당, 변경을 위한 구성).

조인/별칭 탭

쿼리 디자이너의 이 탭에서는 다양한 테이블과 별칭(HOW 구문)을 조인하는 기능을 설정할 수 있습니다. 테이블은 왼쪽에 표시되어 있습니다. 테이블 반대편에 플래그를 설정하면 UNITE 구성이 사용되고, 그렇지 않으면 UNITE ALL(두 방법 간의 차이점)이 사용됩니다. 오른쪽에는 서로 다른 테이블에 있는 필드의 대응이 표시되며, 대응이 지정되지 않은 경우 쿼리는 NULL을 반환합니다.

주문 탭

값이 정렬되는 순서(ORDER BY) - 내림차순(DESC) 또는 오름차순(ASC)을 지정합니다.

흥미로운 깃발도 있습니다 - 자동주문(요청에서 - 자동 주문). 기본적으로 1C 시스템은 데이터를 "혼란스러운"순서로 표시합니다. 이 플래그를 설정하면 시스템은 내부 데이터를 기준으로 데이터를 정렬합니다.

쿼리 배치 탭

쿼리 디자이너 탭에서 새 쿼리를 생성하고 탐색으로 사용할 수도 있습니다. 요청 텍스트에서 패킷은 ";"(쉼표) 기호로 구분됩니다.

쿼리 디자이너의 "쿼리" 단추

요청 디자이너의 왼쪽 하단에는 언제든지 요청 텍스트를 볼 수 있는 요청 버튼이 있습니다.

이 창에서 요청을 조정하고 실행할 수 있습니다.


쿼리 콘솔 사용

쿼리 콘솔은 복잡한 쿼리를 디버깅하고 신속하게 정보를 얻을 수 있는 간단하고 편리한 방법입니다. 이번 글에서는 Query Console 사용법을 설명하고, Query Console을 다운로드할 수 있는 링크를 제공하겠습니다.

이 도구를 자세히 살펴보겠습니다.

1C 쿼리 콘솔 다운로드

우선, 쿼리 콘솔 작업을 시작하려면 어딘가에서 다운로드해야 합니다. 치료법은 일반적으로 통제형과 기존 치료법(또는 때로는 8.1 및 8.2/8.3이라고도 함)의 두 가지 유형으로 나뉩니다.

나는 이 두 가지 보기를 하나의 처리로 결합하려고 했습니다. 원하는 양식이 원하는 작동 모드에서 열립니다(관리 모드에서는 콘솔이 Thick 모드에서만 작동함).

1C 쿼리 콘솔에 대한 설명

기본 처리 패널에 대한 설명과 함께 쿼리 콘솔을 살펴보겠습니다.

쿼리 콘솔 헤더에서 마지막 쿼리의 실행 시간을 밀리초 단위의 정확도로 확인할 수 있으며, 이를 통해 성능 측면에서 다양한 디자인을 비교할 수 있습니다.

명령 모음의 첫 번째 버튼 그룹은 현재 쿼리를 외부 파일에 저장하는 역할을 합니다. 이는 매우 편리하며 언제든지 복잡한 요청 작성으로 돌아갈 수 있습니다. 또는 예를 들어 특정 디자인의 일반적인 예 목록을 저장합니다.

왼쪽의 '요청' 필드에서 새 요청을 생성하고 이를 트리 구조로 저장할 수 있습니다. 두 번째 버튼 그룹은 요청 목록을 관리하는 역할을 합니다. 이를 사용하여 요청을 생성, 복사, 삭제, 이동할 수 있습니다.

  • 실행하다요구– 간단한 실행 및 결과
  • 패키지 실행– 일괄 쿼리에서 모든 중간 쿼리를 볼 수 있습니다.
  • 임시 테이블 보기– 임시 쿼리가 테이블에 반환하는 결과를 볼 수 있습니다.

요청 매개변수:

요청에 대한 현재 매개변수를 설정할 수 있습니다.

쿼리 매개변수 창에서 다음이 흥미롭습니다.

  • 단추 요청에서 가져오기개발자의 편의를 위해 요청의 모든 매개변수를 자동으로 찾습니다.
  • 깃발 모든 요청에 ​​대한 공통 매개변수– 설치 시 일반 요청 목록에서 요청 간에 이동할 때 처리 과정에서 매개변수가 지워지지 않습니다.

값 목록으로 매개변수 설정매우 간단합니다. 매개변수 값을 선택할 때 값 지우기 버튼(십자)을 클릭하면 시스템에서 데이터 유형을 선택하라는 메시지를 표시하며 여기서 "값 목록"을 선택해야 합니다.

또한 상단 패널에는 쿼리 콘솔 설정을 불러오는 버튼이 있습니다.

여기서 자동 저장 쿼리 및 쿼리 실행 매개변수에 대한 매개변수를 지정할 수 있습니다.

요청 텍스트가 콘솔 요청 필드에 입력됩니다. 이는 단순히 쿼리 테스트를 입력하거나 특수 도구인 쿼리 디자이너를 호출하여 수행할 수 있습니다.

1C 8 쿼리 디자이너는 입력 필드를 클릭하면 상황에 맞는 메뉴(마우스 오른쪽 버튼)에서 호출됩니다.

이 메뉴에는 요청에 줄 바꿈("|")을 지우거나 추가하거나 다음과 같은 편리한 형식으로 요청 코드를 받는 등의 유용한 기능도 있습니다.

요청 = 새 요청;
요청.텍스트 = ”
|선택
| 통화.링크
|발신
| 디렉토리.통화 AS 통화”;
RequestResult = 요청.실행();

쿼리 콘솔의 아래쪽 필드에는 쿼리 결과 필드가 표시되며, 이것이 바로 이 처리가 생성된 이유입니다.



또한 쿼리 콘솔은 목록 외에도 합계가 포함된 쿼리의 경우 트리 형태로 데이터를 표시할 수 있습니다.

쿼리 최적화

1C Enterprise 8.3의 생산성을 높이는 데 가장 중요한 포인트 중 하나는 다음과 같습니다. 최적화요청. 이 점은 다음과 같은 경우에도 매우 중요합니다. 인증을 통과. 아래에서는 쿼리 성능이 최적화되지 않은 일반적인 이유와 최적화 방법에 대해 설명합니다.

WHERE 구문을 사용하여 가상 테이블에서 선택

VT 매개변수를 통해서만 가상 테이블 세부사항에 필터를 적용해야 합니다. 어떤 상황에서도 가상 테이블 선택을 위해 WHERE 구성을 사용해서는 안 됩니다. 이는 최적화 관점에서 볼 때 심각한 실수입니다. 실제로 WHERE를 사용하여 선택하는 경우 시스템은 모든 레코드를 수신한 다음 필요한 레코드만 선택합니다.

오른쪽:

선택하다

에서
누적 등록 조직 참가자와의 상호 정산 잔액 (
,
조직 = 조직(&Organization)
AND 개인 = &개인) 조직 잔액 참가자와의 상호 정산 방법

잘못된:

선택하다
조직 잔액 참가자와의 상호 정산 금액 잔액
에서
누적등록 기관참여자와의 상호정산 잔액(,) HOW 기관참여자와의 상호정산 잔액
어디
조직 잔액 참가자와의 상호 정산 조직 = & 조직
AND 조직 잔액 참여자와의 상호 정산. 개인 = &개인

점을 사용하여 복합 유형의 필드 값 가져오기

시스템은 쿼리에서 복합형 데이터를 도트를 통해 수신할 때 복합형 필드에 가능한 테이블 수만큼 정확하게 Left 조인으로 연결한다.

예를 들어, 등록 기록 필드(registrar)에 액세스하는 최적화는 매우 바람직하지 않습니다. 등록자는 복합 데이터 유형을 가지며, 그 중에는 레지스터에 데이터를 쓸 수 있는 가능한 모든 문서 유형이 있습니다.

잘못된:

선택하다
레코드 세트.녹음기.날짜,
RecordSet.Quantity
에서
RegisterAccumulations.ProductsOrganizations AS SetRecords

즉, 실제로 이러한 쿼리는 하나의 테이블이 아닌 22개의 데이터베이스 테이블에 액세스합니다(이 레지스터에는 21개의 등록자 유형이 있음).

오른쪽:

선택하다
선택
WHEN 제품조직.등록기관 LINK 문서.제품 및 서비스 판매
THEN EXPRESS(제품 조직.AS 문서 등록.상품 서비스 판매).날짜
언제 상품조직.등록기관 링크 문서.상품서비스 수령
THEN EXPRESS(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).날짜
날짜로 종료,
제품조직.수량
에서
RegisterAccumulations.ProductsOrganizations AS 제품조직

또는 두 번째 옵션은 이러한 정보를 세부 정보에 추가하는 것입니다(예: 우리의 경우 날짜 추가).

오른쪽:

선택하다
제품조직.날짜,
제품조직.수량
에서
누적 등록부 조직 물품 AS 조직 물품

조인 조건의 하위 쿼리

최적화를 위해 조인 조건에서 하위 쿼리를 사용하는 것은 허용되지 않습니다. 이로 인해 쿼리 속도가 크게 느려집니다. 이러한 경우에는 VT를 사용하는 것이 좋습니다. 연결하려면 이전에 연결 필드별로 인덱싱한 메타데이터 및 VT 개체만 사용해야 합니다.

잘못된:

선택하다 …

왼쪽 조인(
SELECT FROM 정보 등록.한계
어디 …
그룹 기준...
) 에 의해 …

오른쪽:

선택하다 …
PUT 한도
FROM 정보 레지스터.한계
어디 …
그룹 기준...
색인 기준...;

선택하다 …
FROM 문서.상품서비스 실현
LEFT JOIN 제한
에 의해 …;

레코드를 가상 테이블에 연결

가상 테이블을 다른 테이블에 연결할 때 시스템이 최적으로 작동하지 않는 상황이 있습니다. 이 경우 쿼리 성능을 최적화하려면 임시 테이블 쿼리에서 조인된 필드를 인덱싱하는 것을 잊지 말고 임시 테이블에 가상 테이블을 배치해 보세요. 이는 VT가 여러 개의 물리적 DBMS 테이블에 포함되는 경우가 많기 때문에 이를 선택하기 위해 서브 쿼리를 컴파일하게 되는데, 문제는 앞선 지점과 유사한 것으로 나타났다.

색인화되지 않은 필드에 필터 사용

쿼리를 작성할 때 가장 흔히 저지르는 실수 중 하나는 인덱싱되지 않은 필드에 조건을 사용하는 것입니다. 이는 모순됩니다. 쿼리 최적화 규칙.쿼리에 인덱싱할 수 없는 필드에 대한 선택이 포함된 경우 DBMS는 쿼리를 최적으로 실행할 수 없습니다. 임시 테이블을 사용하는 경우 연결 필드도 인덱싱해야 합니다.

각 조건에 적합한 인덱스가 있어야 합니다. 적합한 인덱스는 다음 요구 사항을 충족하는 인덱스입니다.

  1. 인덱스에는 조건에 나열된 모든 필드가 포함됩니다.
  2. 이러한 필드는 인덱스의 맨 처음에 있습니다.
  3. 이러한 선택은 연속적입니다. 즉, 쿼리 조건에 포함되지 않은 값은 둘 사이에 "고정"되지 않습니다.

DBMS가 올바른 인덱스를 선택하지 않으면 전체 테이블이 스캔됩니다. 이는 성능에 매우 부정적인 영향을 미치고 전체 레코드 세트가 장기간 차단될 수 있습니다.

조건에 논리적 OR 사용

그게 전부입니다. 이 기사에서는 모든 1C 전문가가 알아야 할 쿼리 최적화의 기본 측면을 다루었습니다.

쿼리 개발 및 최적화에 대한 매우 유용한 무료 동영상 강좌입니다. 나는 강력히 추천한다초보자와 그 이상을 위한!

쿼리 언어는 개발자를 위한 1C 8.3의 기본 메커니즘 중 하나입니다. 쿼리를 사용하면 데이터베이스에 저장된 모든 데이터를 빠르게 검색할 수 있습니다. 구문은 SQL과 매우 유사하지만 몇 가지 차이점이 있습니다.

SQL에 비해 1C 8.3 (8.2) 쿼리 언어의 주요 장점은 다음과 같습니다.

  • 참조 필드 역참조(객체 세부정보에 대한 하나 이상의 포인트 참조)
  • 결과 작업은 매우 편리합니다.
  • 가상 테이블을 생성하는 기능;
  • 요청은 영어와 러시아어로 작성할 수 있습니다.
  • 교착상태를 피하기 위해 데이터를 차단하는 능력.

1C 쿼리 언어의 단점:

  • SQL과 달리 1C 쿼리에서는 데이터 변경을 허용하지 않습니다.
  • 저장 프로시저 부족;
  • 문자열을 숫자로 변환하는 것이 불가능합니다.

1C 쿼리 언어의 기본 구성에 대한 미니 튜토리얼을 살펴보겠습니다.

1C의 쿼리에서는 데이터 수신만 허용되므로 모든 쿼리는 "SELECT"라는 단어로 시작해야 합니다. 이 명령 뒤에는 데이터를 가져와야 하는 필드가 표시됩니다. "*"를 지정하면 사용 가능한 모든 필드가 선택됩니다. 데이터가 선택되는 위치(문서, 레지스터, 디렉토리 등)는 "FROM"이라는 단어 뒤에 표시됩니다.

아래에 설명된 예에서는 전체 명명법의 이름이 "Nomenclature" 디렉터리에서 선택됩니다. HOW라는 단어 뒤에는 테이블과 필드의 별칭(이름)이 표시됩니다.

선택하다
명명법 이름 AS 명명법의 이름
에서
디렉토리.명칭 AS 명명법

"SELECT" 명령 옆에 키워드를 지정할 수 있습니다.

  • 다양한. 쿼리는 하나 이상의 필드가 다른 행만 선택합니다(중복 항목 없음).
  • 첫 번째 n, 어디 N– 선택해야 하는 결과의 시작 부분부터 행 수입니다. 대부분 이 구성은 정렬(ORDER BY)과 함께 사용됩니다. 예를 들어, 날짜별로 최근 문서 중 특정 수를 선택해야 하는 경우입니다.
  • 허용된. 이 디자인을 사용하면 현재 사용자가 사용할 수 있는 레코드만 데이터베이스에서 선택할 수 있습니다. 이 키워드를 사용하면 사용자가 액세스 권한이 없는 레코드를 쿼리하려고 하면 오류 메시지가 표시됩니다.

이러한 키워드는 함께 또는 별도로 사용할 수 있습니다.

변화를 위해

이 제안은 상호 충돌을 방지하기 위해 데이터를 차단합니다. 잠긴 데이터는 트랜잭션이 끝날 때까지 다른 연결에서 읽을 수 없습니다. 이 절에서는 잠그려는 특정 테이블을 지정할 수 있습니다. 그렇지 않으면 모든 사람이 차단됩니다. 이 디자인은 자동 잠금 모드에만 해당됩니다.

대부분 잔액을 받을 때 “FOR CHANGE” 조항이 사용됩니다. 실제로 여러 사용자가 동시에 프로그램에서 작업하는 경우 한 사람이 잔액을 받는 동안 다른 사람은 잔액을 변경할 수 있습니다. 이 경우 결과 나머지는 더 이상 정확하지 않습니다. 이 제안으로 데이터를 차단하면 첫 번째 직원이 올바른 잔액을 받고 필요한 모든 조작을 수행할 때까지 두 번째 직원은 기다려야 합니다.

선택하다
상호 합의 직원,
상호결제 상호결제금액 잔액
에서
누적등록, 직원과의 상호정산, 잔액 AS 상호정산
변화를 위해

어디

업로드된 데이터에 일종의 선택을 부여하려면 디자인이 필요합니다. 레지스터에서 데이터를 얻는 경우에는 가상 테이블의 매개변수에 선택 조건을 지정하는 것이 더 합리적입니다. "WHERE"를 사용하면 모든 레코드가 먼저 검색된 후 선택 항목만 적용되므로 쿼리 속도가 크게 느려집니다.

다음은 특정 직위에 대한 연락 담당자를 확보하기 위한 요청의 예입니다. 선택 매개변수의 형식은 &ParameterName입니다(매개변수 이름은 임의임).

선택(사례)

이 디자인을 사용하면 요청 본문에 직접 조건을 지정할 수 있습니다.

아래 예에서 "AdditionalField"에는 문서 게시 여부에 따라 텍스트가 포함됩니다.

선택하다
입학T&U.Link,
선택
입학시기T&U.수행
그런 다음 "문서가 통과되었습니다!"
ELSE "문서가 게시되지 않았습니다..."
추가 필드로 종료
에서
문서 상품 및 서비스 수령 방법 수령 T&C

가입하다

조인은 특정 관계 조건에 따라 두 테이블을 연결합니다.

왼쪽/오른쪽 연결

LEFT 조인의 핵심은 지정된 첫 번째 테이블 전체를 가져오고 두 번째 테이블을 연결 조건에 따라 연결한다는 것입니다. 두 번째 테이블의 첫 번째 테이블에 해당하는 레코드가 없으면 해당 값은 NULL로 대체됩니다. 간단히 말해서 기본 테이블은 첫 번째로 지정된 테이블이고 두 ​​번째 테이블의 데이터(있는 경우)가 이미 해당 데이터로 대체되었습니다.

예를 들어, "상품 및 서비스 수령" 문서에서 품목 항목을 가져와야 하며 "품목 가격" 정보 레지스터에서 가격을 가져와야 합니다. 이 경우 포지션의 가격을 찾을 수 없으면 대신 NULL을 대체합니다. 가격 유무에 관계없이 문서의 모든 항목이 선택됩니다.

선택하다
영수증&U. 명칭,
가격.가격
에서
문서 상품 및 서비스 수령 상품 수령 방법 및 사양
내부 조인 RegisterInformation.PricesNomenclature.SliceLast AS 가격
소프트웨어 영수증&U.명칭 = 가격.명칭

오른쪽에서는 모든 것이 정반대입니다.

완전한 연결

이 유형의 연결은 결과적으로 첫 번째 테이블과 두 번째 테이블의 모든 레코드가 반환된다는 점에서 이전 연결과 다릅니다. 지정된 링크 조건에 따라 첫 번째 또는 두 번째 테이블에 레코드가 없으면 대신 NULL이 반환됩니다.

이전 예에서 전체 연결을 사용하는 경우 "상품 및 서비스 수령" 문서의 모든 항목 항목과 "항목 가격" 레지스터의 모든 최신 가격이 선택됩니다. 첫 번째 테이블과 두 번째 테이블 모두에서 찾을 수 없는 레코드의 값은 NULL과 같습니다.

내부 조인

INNER JOIN과 FULL JOIN의 차이점은 테이블 중 하나 이상에서 레코드를 찾을 수 없으면 쿼리가 해당 레코드를 전혀 표시하지 않는다는 것입니다. 결과적으로 이전 예에서 "FULL"을 "INTERNAL"로 대체한 경우 "상품 및 서비스 수령" 문서의 항목 항목만 선택되며 정보 레지스터 "항목 가격"에 기록이 있습니다.

그룹 기준

1C 쿼리에서 그룹화하면 특정 공통 특성(그룹화 필드)에 따라 테이블 행(그룹화 필드)을 축소할 수 있습니다. 그룹화 필드는 집계 함수를 통해서만 표시할 수 있습니다.

다음 쿼리의 결과는 최대 가격이 포함된 제품 유형 목록입니다.

선택하다
,
MAX(가격.가격) AS 가격
에서

그룹 기준
가격.명칭.명칭 유형

결과

그룹화와 달리 합계를 사용하면 모든 기록이 표시되고 여기에 합계 행이 추가됩니다. 그룹화하면 일반화된 레코드만 표시됩니다.

전체 테이블(“GENERAL” 키워드 사용), 여러 필드, 계층 구조가 있는 필드(키워드 “HIERARCHY”, “ONLY HIERARCHY”)에 대한 결과를 요약할 수 있습니다. 결과를 요약할 때 집계 함수를 사용할 필요는 없습니다.

그룹화를 사용하여 위의 예와 유사한 예를 살펴보겠습니다. 이 경우 쿼리 결과는 그룹화된 필드뿐만 아니라 세부 레코드도 반환합니다.

선택하다
가격.명칭.명칭 유형 AS 명명법 유형,
가격.가격 AS 가격
에서
정보 등록, 명칭 가격, 최신 AS 가격 스냅샷
결과
최대(가격)
에 의해
유형명칭

가지고 있는

이 연산자는 WHERE 연산자와 유사하지만 집계 함수에만 사용됩니다. 이 연산자가 사용하는 필드를 제외한 나머지 필드는 그룹화되어야 합니다. "WHERE" 연산자는 집계 함수에 적용할 수 없습니다.

아래 예에서는 품목 유형별로 그룹화되어 1000을 초과하는 경우 품목의 최고 가격이 선택됩니다.

선택하다

MAX(가격.가격) AS 가격
에서
정보 등록, 명칭 가격, 최신 AS 가격 스냅샷
그룹 기준
가격.명칭.명칭 유형
가지고 있는
최대(가격.가격) > 1000

정렬 기준

"ORDER BY" 연산자는 쿼리 결과를 정렬합니다. 레코드가 일관된 순서로 표시되도록 하기 위해 AUTO ORDER가 사용됩니다. 기본 유형은 일반적인 규칙에 따라 정렬됩니다. 참조 유형은 GUID를 기준으로 정렬됩니다.

이름별로 정렬된 직원 목록을 가져오는 예:

선택하다
직원.이름 AS 이름
에서
디렉토리.직원 HOW 직원
정렬 기준
이름
자동 주문

기타 1C 쿼리 언어 구성

  • 결합하다– 두 개의 쿼리 결과를 하나로 묶습니다.
  • 모든 것을 결합하세요– COMBINE과 유사하지만 동일한 행을 그룹화하지 않습니다.
  • 빈 테이블- 빈 중첩 테이블을 지정하기 위해 쿼리를 조인할 때 가끔 사용됩니다.
  • 장소– 복잡한 1C 쿼리를 최적화하기 위해 임시 테이블을 생성합니다. 이러한 요청을 일괄 요청이라고 합니다.

쿼리 언어 기능

  • 하위 문자열문자열을 지정된 위치에서 지정된 문자 수까지 자릅니다.
  • 연도...초숫자 유형의 선택된 값을 얻을 수 있습니다. 입력 매개변수는 날짜입니다.
  • 기간의 시작과 종료날짜 작업을 할 때 사용됩니다. 추가 파라미터로 기간 유형(DAY, MONTH, YEAR 등)을 표시합니다.
  • ADDKDATE특정 유형(SECOND, MINUTE, DAY 등)의 지정된 시간을 날짜에서 더하거나 뺄 수 있습니다.
  • 차이 날짜출력 값 유형(DAY, YEAR, MONTH 등)을 지정하여 두 날짜 간의 차이를 결정합니다.
  • ISNULL누락된 값을 지정된 표현식으로 바꿉니다.
  • 표현 및 표현링크지정된 필드의 문자열 표현을 가져옵니다. 각각 모든 값에 적용하고 참조 값에만 적용합니다.
  • 유형, 유형 값입력 매개변수의 유형을 결정하는 데 사용됩니다.
  • 링크속성 값 유형에 대한 논리적 비교 연산자입니다.
  • 표현하다값을 원하는 유형으로 변환하는 데 사용됩니다.
  • 날짜 시간숫자 값(연도, 월, 일, 시, 분, 초)에서 "날짜" 유형의 값을 가져옵니다.
  • 의미 1C 요청에서는 사전 정의된 값(디렉토리, 열거, 특성 유형 계획)을 지정하는 데 사용됩니다. 사용 예: " 법적 개인 = 가치(열거. 법적 개인. 개인)«.

쿼리 빌더

1C로 쿼리를 생성하려면 쿼리 디자이너라는 매우 편리한 내장 메커니즘이 있습니다. 여기에는 다음과 같은 기본 탭이 포함되어 있습니다.

  • "테이블 및 필드" - 선택해야 하는 필드와 해당 소스가 포함되어 있습니다.
  • "연결" - CONNECTION 구조의 조건을 설명합니다.
  • "그룹화" - 그룹화 구성에 대한 설명과 그룹별로 요약된 필드가 포함되어 있습니다.
  • "조건" - 요청에서 데이터를 선택하는 역할을 담당합니다.
  • "고급" - "SELECT" 명령의 키워드 등과 같은 추가 쿼리 매개변수입니다.
  • "조인/별칭" - 테이블 조인 가능성이 표시되고 별칭이 설정됩니다("HOW" 구성).
  • "Order"는 쿼리 결과를 정렬하는 역할을 담당합니다.
  • "총계" - "그룹화" 탭과 유사하지만 "총계" 구성에 사용됩니다.

요청 내용은 왼쪽 하단에 있는 '요청' 버튼을 클릭하면 확인할 수 있습니다. 이 형식에서는 수동으로 수정하거나 복사할 수 있습니다.


요청 콘솔

엔터프라이즈 모드에서 쿼리 결과를 빠르게 보거나 복잡한 쿼리를 디버그하려면 를 사용하세요. 여기에는 요청 텍스트가 포함되어 있으며 매개변수를 설정하고 결과가 표시됩니다.

ITS 디스크 또는 를 통해 쿼리 콘솔을 다운로드할 수 있습니다.

이 기사에서 우리는 당신과 모든 것을 논의하고 싶습니다 1C 쿼리 언어 기능, 그리고 쿼리 언어 구성. 기능과 디자인의 차이점은 무엇입니까? 함수는 괄호와 가능한 매개변수를 포함하여 호출되며 구문은 괄호 없이 작성됩니다. 의심할 여지 없이 1C 쿼리 언어의 모든 구조와 기능데이터 수집 프로세스를 유연하고 다기능적으로 만듭니다. 이러한 기능과 구성은 요청 필드에 적용되며 일부는 조건에도 적용됩니다.

1C 쿼리 언어 기능

명확한 설명이 있기 때문에 1C 쿼리 언어 기능구조에 대한 설명보다 훨씬 덜 일반적이기 때문에 우리는 함수를 살펴보기로 결정했습니다. 이제 각 항목을 개별적으로 살펴보고 목적, 구문 및 사용 예를 설명합니다.

1. 기능 날짜 시간- 이 함수는 "날짜" 유형의 상수 필드를 생성합니다.

통사론: 날짜 시간(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

사용 예:

2. 날짜 차이 기능- 차원(연도, 월, 일, 시, 분, 초) 중 하나에서 두 날짜 간의 차이를 반환합니다. 측정값이 매개변수로 전달됩니다.

통사론: 차이날짜(<Дата1>, <Дата2>, <Тип>)

사용 예:

Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS 수량.일";

3. 기능 값- 데이터베이스에서 미리 정의된 레코드로 상수 필드를 설정합니다. 또한 모든 유형의 빈 링크를 얻을 수도 있습니다.

구문: VALUE(<Имя>)

사용 예:

Request.Text = "SELECT //미리 정의된 요소 | VALUE(Directory.Currities.Dollar) AS Dollar, //빈 링크 | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //이체 값 | VALUE(이체 . 법적 개인. 개인) AS 개인, //미리 정의된 계정 | VALUE(계정과목표. 자립. 자재) AS 계정_10" ;

4. 선택 기능-코드에 사용되는 IF 구성과 유사한 것이 있는데, 이 하나만 1C 쿼리에 사용됩니다.

통사론: 선택 시기<Выражение>그 다음에<Выражение>그렇지 않으면<Выражение>끝

사용 예:

Request.Text = //금액이 7500보다 크면 300루블의 할인이 있어야 합니다. //조건이 트리거되면 함수는 //Amount - 300을 반환합니다. //그렇지 않으면 요청은 단순히 Amount를 반환합니다. "선택 | 선택 | TCReceipts.Amount > 7500 | THEN TCReceipts.Amount - 300 | ELSE TCReceipts.Amount | END AS AmountWithDiscount |FROM | Document.Receipt of GoodsServices.Goods AS TCReceipts";

5. 익스프레스 기능- 특정 유형의 상수 필드를 표현할 수 있습니다.

통사론: EXPRESS(필드 이름 AS 유형 이름)

사용 예:

Query.Text = "SELECT VARIOUS | Sales.Registrar.Number, | SELECT | WHEN Sales.Registrar LINK Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar LINK Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Implementation) | END | ... | END AS 번호 | FROM | RegisterAccumulations.Purchases AS 구매";

혼합 유형 필드에서 EXPRESS 함수를 사용하는 또 다른 옵션이 있습니까? 이러한 옵션은 어디에서 발생합니까? 가장 간단한 예는 모든 레지스터에 대한 "등록자"입니다. 그렇다면 등록 기관에서 유형을 한정해야 하는 이유는 무엇일까요? 등록자에서 "번호" 필드를 선택할 때 상황을 고려해 보겠습니다. 어떤 테이블에서 번호가 선택됩니까? 모두의 정답! 따라서 쿼리가 빠르게 작동하려면 EXPRESS 함수를 사용하여 명시적인 유형을 지정해야 합니다.

사용 예:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. ISNULL 함수(대체 철자법 ISNULL) - 필드가 NULL 유형인 경우 함수의 두 번째 매개변수로 대체됩니다.

통사론: ISNULL(<Поле>, <ПодставляемоеЗначение>)

사용 예:

또한 항상 NULL 유형을 어떤 값으로 바꾸는 것이 좋습니다. NULL 유형과의 비교는 NULL을 NULL과 비교하더라도 항상 FALSE를 반환합니다. 대부분의 경우 NULL 값은 테이블 조인(내부 조인을 제외한 모든 조인 유형)의 결과로 형성됩니다.

Query.Text = //전체 항목 및 해당 잔액 선택 //일부 항목에 잔액이 없으면 //NULL 값이 0 "SELECT | No. Link, | ISNULL 값으로 대체됩니다. (ProductsInStockRemains.InStockRemaining, 0) AS Remainder | FROM | Directory.Nomenclature AS No. | LEFT CONNECTION 등록 누적. GoodsInWarehouses. Remainings AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. Nomenclature = No. Link)";

7. 표현 기능- 요청 필드의 표현을 얻을 수 있습니다.

통사론: 성능(<НаименованиеПоля>)

사용 예:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS 명명법, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS 창고, | FreeRemainingRemaining.InStockRemaining |FROM |Accumulation Register.FreeRemaining.Remaining AS FreeRemainingRemaining";

1C 쿼리 언어의 구성

위에서 우리는 당신과 논의했습니다 1C 쿼리 언어 기능, 이제 고려해야 할 때입니다 1C 쿼리 언어로 구성, 그다지 중요하지 않고 유용합니다. 시작하겠습니다.

1. 건설링크- 참조 유형을 확인하는 논리 연산자입니다. 특정 유형에 대해 복합 유형의 필드를 확인할 때 가장 자주 발생합니다. 통사론: 링크<Имя таблицы>

사용 예:

Request.Text = //레코더 값 유형이 문서 영수증인 경우 //쿼리는 "상품 영수증"을 반환하고, 그렇지 않으면 "상품 판매" "SELECT | SELECT | WHEN Remainings.Registrar LINK Document.Receipt of Goods and 서비스 | THEN ""영수증"" | ELSE ""소비"" | END AS 이동 유형 | FROM | 누적 등록 창고에 남아 있는 제품 AS 남아 있음" ;

2. 사이의 건설- 이 연산자는 값이 지정된 범위 내에 있는지 확인합니다.

통사론: 사이<Выражение>그리고<Выражение>

사용 예:

Request.Text = //코드가 1~100 범위에 있는 전체 명명법을 가져옵니다. "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. HIERARCHY의 구성 B 및 B- 전송된 목록에 값이 있는지 확인합니다(배열, 값 테이블 등이 목록으로 전송될 수 있음). IN HIERARCHY 연산자를 사용하면 계층 구조를 볼 수 있습니다(계정과목표 사용의 예).

통사론: 안에(<СписокЗначений>), 계층 구조(<СписокЗначений>)

사용 예:

Request.Text = //계정의 모든 하위 계정 선택 "SELECT | 자체 지원. AS 계정 연결 | FROM | 계정과목표. 자체 지원 AS 자체 지원 | WHERE | 자체 지원. Link IN HIERARCHY VALUE(차트 계정. 자립. 물품)";

4. 건설 LIKE- 이 함수를 사용하면 문자열을 문자열 패턴과 비교할 수 있습니다.

통사론: 좋다 "<ТекстШаблона>"

라인 템플릿 옵션:

% - 임의 개수의 임의 문자를 포함하는 시퀀스입니다.

임의의 문자 1개.

[...] - 대괄호 안에 나열된 단일 문자 또는 문자 시퀀스입니다. 열거형은 범위를 지정할 수 있습니다(예: a-z). 이는 범위의 끝을 포함하여 범위에 포함된 임의의 문자를 의미합니다.

[^...] - 부정 기호 뒤에 나열된 문자를 제외하고 대괄호 안에 나열된 단일 문자 또는 문자 시퀀스입니다.

사용 예:

Query.Text = //루트 TABUR을 포함하고 //소문자 또는 대문자로 시작하는 전체 명명법을 찾습니다. t "SELECT | Nomenclature. Link | FROM | Directory. Nomenclature AS Nomenclature | WHERE | Products. Name LIKE "" [Tt ]abur%""" ;

5. 디자인 허용- 이 연산자를 사용하면 호출자에게 읽기 권한이 있는 데이터베이스의 레코드만 선택할 수 있습니다. 이러한 권한은 RLS(레코드 수준)에서 구성됩니다.

통사론: ALLOWED는 SELECT 키워드 뒤에 기록됩니다.

사용 예:

Request.Text = "허용된 항목 선택 | 상대방. 링크 | FROM | 디렉터리. 상대방 AS 상대방";

6. 디자인 다양한- 중복된 기록이 없는 기록을 선택할 수 있습니다.

통사론: VARIOUS는 키워드 SELECT 뒤에 기록됩니다.

사용 예:

Request.Text = //독자에게 권한이 있는 레코드를 선택합니다. "SELECT VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

또한 VARIOUS 구문은 ALLOWED 연산자 및 기타 연산자와 함께 사용할 수 있습니다.

사용 예:

Request.Text = //독자가 "SELECT ALLOWED VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" 권한을 가지고 있는 다양한 레코드를 선택합니다.

7. 디자인 우선- 쿼리 결과에서 파라미터에 지정된 레코드 개수를 선택합니다.

구문: FIRST<число>

사용 예:

Request.Text = //"SELECT FIRST 4 | CCD Numbers. Link | FROM | Directory. CCD Numbers AS CCD Numbers" 디렉토리에서 처음 4개의 CCD 번호를 선택합니다.

8. 변화를 위한 디자인- 테이블을 잠글 수 있으며 트랜잭션에서만 작동합니다(자동 잠금에만 해당).

통사론: 변화를 위해<НаименованиеТаблицы>

사용 예:

Query.Text = "SELECT | 남은 남은 여유 공간. 명명법, | 남은 남은 남은 여유 창고, | 남은 남은 남은 여유 여유 | 재고 있음 | FROM | 누적 등록. 남은 남은 여유. 남은 AS 남은 남은 여유 | 변경을 위한 | 누적 등록 . 무료 잔여. 잔여";

9. 디자인 주문- 특정 필드별로 데이터를 구성합니다. 필드가 링크인 경우 플래그를 설정할 때 자동 주문정렬은 링크 표현에 따라 발생합니다. 플래그가 꺼져 있으면 링크는 메모리에 있는 링크 주소의 우선순위에 따라 정렬됩니다.

통사론: 정렬 기준<НаименованиеПоля>자동 주문

사용 예:

Query.Text = "SELECT | 잔여 남은 여유분. 명명법 AS 명명법, | 남은 남은 여유분. 창고 AS 창고, | 남은 남은 여유분. 남은 재고 있음 | FROM | 누적 등록. 남은 남은 여유분. 남은 AS 남은 남은 여유 있음 | | ORDER BY | 명칭 | 자동 주문 복구";

10. 디자인 그룹바이- 특정 필드별로 쿼리 문자열을 그룹화하는 데 사용됩니다. 숫자 필드는 집계 함수와 함께 사용해야 합니다.

통사론: 그룹 기준<НаименованиеПоля1>, .... , <НаименованиеПоляN>

사용 예:

Query.Text = "SELECT | ProductsInWarehouses.Nomenclature AS 명명법, | ProductsInWarehouses.Warehouse, | SUM(GoodsInWarehouses.InStock) AS INSTOCK | FROM | RegisterAccumulations.ProductsInWarehouses AS ProductsInWarehouses | |GROUP BY | ProductsInWarehouses.Nomenclature, | ProductsIn Warehouses.Warehouse" ;

11. 디자인- WHERE 구성과 유사하게 데이터 선택 조건에 집계 함수를 적용할 수 있습니다.

통사론: 가지고 있는<агрегатная функция с условием>

사용 예:

Query.Text = //InStock 필드가 3보다 큰 그룹화된 레코드를 선택합니다. "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | 그룹별 | ProductsInWarehouses.Nomenclature, | ProductsInWarehouses.Warehouse | |사용 가능 | 금액(ProductsInWarehouses.InStock) > 3" ;

12. 건설 색인 BY- 쿼리 필드를 인덱싱하는 데 사용됩니다. 인덱싱이 포함된 쿼리는 완료하는 데 시간이 더 걸리지만 인덱싱된 필드를 통한 검색 속도는 빨라집니다. 가상 테이블에서만 사용할 수 있습니다.

통사론: 색인 기준<Поле1, ... , ПолеN>

사용 예:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .코드OS";

13. 디자인은 어디서?- 선택 필드에 조건을 부과할 수 있습니다. 결과에는 조건을 만족하는 레코드만 포함됩니다.

통사론: 어디<Условие1 ОператорЛогСоединения УсловиеN>

사용 예:

Query.Text = //CompensationRemaining이 있는 모든 레코드가 선택되었습니다.<>0 및 //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPOREmains.Counterparty, |CompensationRPOREmains.Child, | CompensationRPOREmains.CompensationRemaining, | CompensationRPOREmains.AmountForCalcCompRemains |Place DataTz |FROM | 누적 Register.CompensationRP.Remains AS CompensationRPOstat ki |WHERE |CompensationRPOR 남아 있습니다.보상남음<>0 | 그리고 CompensationRPOREmains.AmountForCalcCompRemaining> 100" ;

14. 디자인 결과... 일반- 합계를 계산하는 데 사용되며, 디자인에서는 합계가 계산되는 필드와 합계 필드에 적용되는 집계 함수를 지정합니다. TOTAL 구성 후 각 필드의 합계를 사용하면 데이터가 그룹화됩니다. 선택적 GENERAL 구문이 있으며 이를 사용하면 추가 그룹화도 제공됩니다. 아래에서 요청 결과의 예를 볼 수 있습니다.

통사론: 결과<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>에 의해<ОБЩИЕ> <Поле1, ... , ПолеN>

사용 예:

Request.Text = "SELECT | 계산. 상대방 계약. 계약 유형 AS 계약 유형, | 계산. 상대방 계약 AS 계약, | 계산. 상대방, | 계산. 상호 정산 잔액 AS 잔액 | FROM | 누적 등록. 상호 상대방과의 정산. 잔액 AS 계산 | 총계 | 금액(잔액) |소프트웨어 | 일반, | 계약 유형";

그림은 요청 실행 중에 형성된 그룹을 간략하게 설명하며, 맨 위의 그룹은 일반 섹션을 나타내고 두 번째 그룹은 상대방 계약 계약 유형 필드를 나타냅니다.

주제에 관한 출판물