쿼리를 작성할 때 1c 언어에서는 다음 명령을 사용하여 쿼리 실행 결과를 얻을 수 있습니다.<ИмяВременнойТаблицы>", 어디<ИмяВременнойТаблицы>- "Query" 개체의 속성이자 TemporaryTableManager 유형의 개체인 "임시 테이블"의 이름. 임시 테이블의 네임스페이스를 설명하고 데이터베이스에서 해당 테이블의 생성 및 삭제를 담당합니다. 이 메커니즘은 다른 쿼리에서 추가로 사용할 수 있도록 중간 쿼리 데이터를 얻는 데 사용됩니다. 이를 통해 쿼리 디버깅, 코드 최적화 및 쿼리 읽기가 더욱 편리해집니다.

여러 개의 임시 테이블이 포함된 쿼리가 있고 각 테이블의 내용을 디버깅해야 한다고 가정해 보겠습니다. 일반적으로 이러한 작업은 쿼리 콘솔을 사용하여 해결하지만 이것이 가능하지 않은 경우(예: 값 목록, 테이블 등이 쿼리에 전달되는 경우) 아래 방법을 사용합니다.

모듈에 다음 기능을 추가합니다(관리되는 애플리케이션인 경우 서버 기능).

함수 VT 데이터(쿼리, VT 이름) 테이블 데이터 = 새 쿼리; 데이터테이블. Text = "선택 * | " + NameVT+ " |"에서 ; ReturnTableData. 실행하다 ( ) . 언로드() ; EndFunction

예를 들어 요청 텍스트 다음에 호출해 보겠습니다.

요청 = 새 요청; 요구. 텍스트 = "SELECT |TZItotal.Name |PLACE 최종 |FROM |&TZItotal AS TZItotal |; |///////////////////////////////// ///////////////////// |SELECT |* |PLACE 번호 |FROM |Directory.Nomenclature AS 명명법 | ///////// ///////////////////////////////////// // |SELECT |* |FROM |최종 AS 합계 | LEFT JOIN Nom AS Nom | BY Total.Name = Nom.Name"; 요구. TemporaryTableManager = 새로운 TemporalTableManager; 요구. 실행하다 ( ) ; Table = DataVT(Query, "최종" ) ;

이제 Table 변수에는 디버깅에서 보거나 스프레드시트 문서로 출력할 수 있는 임시 테이블 Total이 포함됩니다.

일생

쿼리가 실행되면 플랫폼은 실행의 일부로 생성된 모든 임시 테이블을 삭제합니다. 즉, 1C:Enterprise 플랫폼의 한 요청 내에서 생성된 임시 테이블의 수명은 요청에서 테이블이 생성된 순간부터 시작되어 실행될 때 종료됩니다.

이 경우 쿼리 패키지 중 하나에서 "DESTROY" 명령을 실행하여 프로그래밍 방식으로 임시 테이블을 삭제할 수 있습니다.<ИмяВременнойТаблицы>". 그런 다음 플랫폼은 SQL 명령 "TRUNCATE"를 실행하여 임시 테이블을 삭제합니다.

임시 테이블 관리자를 사용할 때 개발자가 테이블을 명시적으로 삭제하지 않은 경우(쿼리 문 "DESTROY", 임시 테이블 관리자를 "정의되지 않음"으로 재설정 또는 "Close()" 메서드 사용) 플랫폼에서 해당 테이블을 삭제합니다. 그들이 형성된 맥락이 파괴된 후에는 독립적으로. 즉, 객체가 생성된 프로시저나 함수가 끝나면 객체는 소멸됩니다.

성능에 미치는 영향

임시 테이블을 사용하면 이전에 테이블에서 생성된 샘플을 다른 쿼리에 재사용하여 SQL Server의 로드를 크게 줄일 수 있습니다. 물론 임시 테이블을 생성하고 저장하려면 추가 리소스가 필요하지만 테이블에 대한 반복 쿼리로 리소스를 낭비하는 것과 비교할 때 이 옵션이 더 최적입니다.

값 테이블을 기반으로 임시 테이블을 생성하면 성능에 부정적인 영향을 미칠 수 있습니다. 값 테이블을 전송하고 이를 기반으로 SQL 서버에 임시 테이블을 채우는 데 시간이 오래 걸리고 시스템에 추가 부하가 발생할 수 있기 때문입니다. 향후 쿼리에서 값 테이블의 데이터를 집중적으로 사용하는 경우에만 이 기능을 사용해야 합니다. 그렇지 않은 경우 데이터베이스 쿼리를 실행한 후 프로그래밍 방식으로 이 테이블을 처리하는 것이 더 최적의 단계입니다. 정확한 대답은 특정 문제에 따라 다릅니다.

결론

1C:Enterprise 플랫폼의 임시 테이블 지원을 통해 데이터베이스에 더 최적의 쿼리를 작성할 수 있는 동시에 쿼리 텍스트 자체도 단순화되고 읽기 쉬워졌습니다.

임시 테이블 사용을 지지하는 가장 중요한 주장은 임시 테이블을 사용하면 SQL Server가 보다 최적의 쿼리 계획을 구축할 수 있다는 것입니다.

요청사항데이터베이스에서 정보를 추출하고 처리하여 사용자에게 필요한 형식으로 제공하도록 설계되었습니다. 여기서 처리란 필드 그룹화, 행 정렬, 합계 계산 등을 의미합니다. 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 명명법";

BatchResult = 요청. 실행배치();

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

// 일괄 요청에서 임시 테이블을 사용하는 예
요청 = 새 요청;
요구 . 텍스트 =
"선택하다
| 제품 링크
|WTT 제품 배치
|발신
| 디렉토리.명칭 HOW 제품
|어디
| 제품.제조업체 = 제조업체(&Manufacturer)
|;
|선택
| VTT제품.제품,
| 직업 학교.
| 직업 학교.가격,
| 직업 학교.AS 문서 영수증 링크
|발신
| VT 제품은 VT 제품과 같습니다.
| 왼쪽 연결 문서. 상품 및 서비스 수령.
| 소프트웨어 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.3 플랫폼에 임시 테이블 디버깅을 위한 도구가 내장되어 있다는 사실을 모른다는 사실을 알게 되었습니다. 비교적 최근에 1C 8.3.8 릴리스 중 하나에 나타났습니다. "데이터를 얻으려면"() 적용 임시 테이블 관리자에게.

한편, 이 도구는 예를 들어 일반적인 메커니즘을 분석할 때 문제를 연구하는 능력을 크게 촉진합니다.

모든 것이 아주 간단합니다.

1. 임시 쿼리 테이블 가져오기

디버깅을 사용할 때 먼저 임시 테이블 목록인 Query.TemporaryTableManager.Tables를 계산합니다. 이 방법으로 실행 중인 쿼리에 의해 생성된 테이블 목록을 얻을 수 있습니다.

2. 디버깅을 위한 임시 테이블 가져오기

그런 다음 Get(<Индекс таблицы>)

3. 데이터를 직접 수신합니다.

GetData() 메서드를 사용하면 선택한 임시 테이블에 대한 쿼리 결과 컬렉션을 직접 가져올 수 있습니다.

인덱스 0이 있는 테이블을 직접 디버깅하는 경우(아시다시피 1C의 인덱스와 번호 매기기는 0부터 시작함) 다음 행을 계산하여 데이터를 얻습니다.

Query.TemporaryTableManager.Tables.Get(0).GetData().Unload()

이 방법으로 디버깅하는 것은 다른 "목발"을 사용하는 것보다 시간이 덜 걸립니다 😀

그게 다야, 당신에게 좋은 발전과 즐거운 휴일 보내세요!

추신. 그리고 기업에서 급여 계산을 지원하는 사람들(프로그래머뿐만 아니라)을 위해 이 주제에 대해 별도의 리소스 Pro-Zup.info가 할당되었음을 상기시켜 드립니다.

이 주제에 대해 질문이 있거나 표준 프로그램의 기능 확장에 관심이 있거나 문제 해결을 위한 제안이 있는 경우 https://pro-zup.info/ 리소스에 오신 것을 환영합니다.

1C 프로그램 버전 7에서 등장한 쿼리 메커니즘은 8 플랫폼의 첫 번째 버전이 출시되면서 점점 더 널리 보급되고 지속적으로 인기를 얻었습니다. 관리되는 양식과 데이터 구성 시스템의 출현으로 이 도구의 범위가 크게 확대되었습니다. 그러나 많은 초보 프로그래머는 이를 익히는 것이 매우 어렵다고 생각합니다.

"임시 테이블 관리자"라는 개체를 사용하면 다음을 수행할 수 있습니다.

  • 요청 텍스트를 대폭 단순화합니다.
  • 더 간단한 블록으로 나누세요.
  • 가독성과 구조를 높입니다.

작동 방식에 대한 몇 마디

원칙적으로 임시 테이블 관리자의 업무는 네 가지 사용 단계로 나눌 수 있습니다.

  1. 관리자 창설
  2. 그것을 채우는 것;
  3. 테이블에서 데이터 읽기
  4. 매니저를 파괴하고 테이블을 정리합니다.

각 단계에 대해 좀 더 자세히 이야기해 보겠습니다.

임시 테이블 관리자 만들기

이 객체를 정의하려면 그림 1에 표시된 코드를 실행해야 합니다.

여기서 임시 테이블 관리자의 정의는 Execute() 연산자 앞에 제공됩니다. 그렇지 않으면 코드 실행이 오류로 인해 중단될 수 있으며 정보 창은 그림 2에 표시됩니다.

그림 2

관리자 작성

동일한 그림 1에는 선택 항목을 임시 테이블로 전송하는 줄이 있습니다. 이는 "Place" 연산자로 시작됩니다. 대상은 대상 테이블의 이름입니다.

"Query Builder"를 사용하면 "Advanced(고급)" 탭에서 이 라인을 생성할 수 있습니다. 그림 3.

그림 3

이렇게 하려면 다음이 필요합니다.

  1. "쿼리 유형" 스위치를 "임시 테이블 만들기" 위치로 설정합니다.
  2. 수신자의 이름을 지정합니다.

디버거를 사용하여 관리자의 채우기 순서를 확인하면 Execute() 요청 메서드를 실행한 후에만 데이터가 표시된다는 것을 알 수 있습니다.

Quantity() 연산자를 사용하여 관리자가 꽉 찼는지 확인할 수 있습니다. 예제 라인: MVT.Tables.Quantity().

관리자 테이블 읽기

다음 단계는 다른 쿼리에서 기존 테이블의 데이터를 읽는 것입니다. 여기에는 한 가지 문제가 있습니다. 생성된 새 쿼리는 채워진 테이블의 존재를 알지 못하므로 콘솔의 "데이터베이스" 창에 표시되지 않습니다.

수동으로 등록하고 생성해야 합니다.

이렇게 하려면 "테이블 및 필드" 탭(그림 4)에서 특정 작업 순서를 수행해야 합니다.

그림 4

  1. 이 탭의 "테이블" 창 메뉴에서 "임시 테이블 설명 만들기" 버튼을 클릭합니다.
  2. 열리는 창에서 기존 테이블에 지정된 대로 필드 이름과 설명(필드 유형)을 지정해야 합니다.
  3. 필요한 필드나 기능은 탭의 세 번째 창으로 이동해야 합니다.

전체 실행 시간 동안 임시 테이블은 파일 모드로 작업할 때 사용자 컴퓨터의 RAM에 저장되거나 클라이언트-서버 모드로 작업할 때 관리자를 호출한 기능이나 프로시저가 완전히 완료될 때까지 서버의 메모리를 차지합니다. 대용량 데이터는 가장 약한 하드웨어라도 성능을 크게 저하시킬 수 있습니다.

테이블 제거

일반적으로 숙련된 전문가는 메모리를 너무 많이 차지하지 않도록 임시 테이블을 다른 곳에서 호출하지 않는 경우 사용 후 즉시 삭제하는 것이 좋습니다.

관리자에서 테이블을 제거하는 방법은 두 가지 주요 방법이 있습니다.

  • 요청 텍스트에 Destroy 키워드를 직접 지정합니다.
  • 관리자에 직접 적용된 Close() 메소드를 사용합니다.

두 번째 경우에는 다양한 쿼리로 생성된 모든 테이블이 강제로 삭제됩니다.

데이터 삭제를 위한 첫 번째 옵션의 사용은 쿼리 텍스트에 "Destroy TableName"과 같은 줄을 작성하거나 "쿼리 디자이너" 창의 "고급" 탭(그림 2)을 사용하여 명시적으로 지정할 수 있습니다.

스위치를 "파괴" 위치로 전환하고 삭제해야 하는 개체의 이름을 지정하면 문제 없이 이 작업을 완료할 수 있습니다.

요청하기 위해 전송(TK)

이 관리자의 가장 일반적인 용도 중 하나는 값 테이블을 데이터 소스 중 하나로 쿼리에 전달하는 것입니다. 아시다시피 1C 요청에서 이 컬렉션을 직접 사용하는 것은 제공되지 않습니다.

이렇게 하려면 요청 텍스트에 "Select * Place MVT from &Tz As Tab"과 같은 줄이 포함되어야 합니다. 기존 값 테이블을 "TZ" 매개변수로 요청에 전달하면 다른 요청에서 추가 처리에 적합한 개체를 받게 됩니다.

TK를 매개변수로 전달하는 것을 방지하는 유일한 조건은 해당 열의 암시적으로 선언된 유형입니다. 즉, TK 컬럼을 생성할 때 두 번째 매개변수에 "New TypeDescription(""))과 같은 줄을 채워야 합니다.

하나의 쿼리에 여러 쿼리를 결합해야 하는 상황이 있는데, 테이블 조인은 이에 도움이 되지 않습니다. 이를 보여주는 가장 쉬운 방법은 예제를 사용하는 것입니다.

우리 시스템에서 상품 구매 및 판매 사실이 각각 수입 및 비용 문서에 기록되어 있다고 가정합니다. 상대방은 구매자일 수도 있고 공급자일 수도 있습니다. 부채는 상품 배송을 통해 상쇄될 수 있습니다.

거래상대방의 총 부채를 계산하려면 해당 거래상대방의 모든 비용 합계를 더하고 동일한 거래상대방으로부터 받은 모든 영수증의 합계를 빼야 합니다. 이를 수행하는 가장 쉬운 방법은 COMBINE ALL 연산자를 사용하는 것입니다.

요청.텍스트 =
"
//계약자에게 배송한 금액을 계산합니다.
|선택
| 비용.
|발신
| 문서.비용 AS 비용
|그룹별
| 비용.상대방
모두 결합 |
//상대방의 금액을 계산합니다.
//우리에게 물건을 배달했습니다
|선택
| 교구.
//음수 기호로 금액을 가져옵니다.
// 합산하면 비용금액에서 차감됨
| SUM(-영수증.금액)
|발신
| 문서. 도착 AS 도착
|그룹별
| 도착.상대방";

첫 번째 요청에서는 각 상대방의 비용 금액을 계산하고, 두 번째 요청에서는 각 상대방이 우리에게 상품을 제공한 금액을 계산합니다. 두 번째 요청의 금액은 빼기 기호와 함께 가져오므로 결과 테이블이 축소되면 이 거래상대방으로의 배송 금액에서 해당 금액이 차감됩니다. 결과적으로 다음과 같은 테이블을 얻습니다.

정확히 우리가 원했던 것은 아니지만 거의 가깝습니다. 필요한 결과를 얻기 위해 남은 것은 상대방별로 그룹화하는 것뿐입니다. 이렇게 하려면 쿼리를 임시 테이블에 배치해야 합니다(임시 테이블 작업은 1장에서 설명). 코스의 폐쇄된 부분 ) 여기에서 필드를 선택하고 그룹화합니다.

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 비용.
| AMOUNT(지출.금액) AS 부채
|장소VT_수입비용
|발신
| 문서.비용 AS 비용
|그룹별
| 비용.상대방
모두 결합 |
|선택
| 교구.
| SUM(-영수증.금액)
|발신
| 문서. 도착 AS 도착
|그룹별
| 교구.카운터파티
|;
|////////////////////////////////////////////////////////////////////////////////
|선택
| VT_상대방 수입.
| SUM(VT_IncomeExpenditure.Debt) AS 부채
|발신
| VT_IncomingConsumption AS VT_IncomingConsumption
|그룹별
| VT_상대방 수입";

쿼리 병합 요구 사항

두 개의 쿼리를 병합할 때 필드 수가 동일해야 합니다. 쿼리에 필드가 없으면 상수로 추가해야 합니다. 위의 예를 살펴보면 비용 문서에 상대방의 부채 금액을 줄이는 할인 필드도 있지만 영수증 문서에는 할인이 없다고 가정해 보겠습니다. 이 경우 어떻게됩니까? 그래서:

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 비용.

|발신
| 문서.비용 AS 비용
|그룹별
| 비용.상대방
모두 결합 |
|선택
| 교구.
| SUM(-영수증.금액),
//널 필드 할인 추가
| 0
|발신
| 문서. 도착 AS 도착
|그룹별
| 도착.상대방";

남은 것은 할인과 그룹을 빼는 것뿐입니다.

순서도 중요합니다. 필드는 두 쿼리의 SELECT 섹션에 지정된 순서대로 정확하게 병합됩니다. 이전 예와 관련하여 영수증 샘플의 할인 및 금액 필드를 바꿔 보겠습니다.

요청 = 새 요청;
요청.텍스트 =
"선택하다
| 비용.
| AMOUNT(지출.금액) AS 부채,
| AMOUNT(비용.할인) AS 할인
|발신
| 문서.비용 AS 비용
|그룹별
| 비용.상대방
모두 결합 |
|선택
| 교구.
//자리 바꾸기
| 0,
| SUM(-영수증.금액)
|발신
| 문서. 도착 AS 도착
|그룹별
| 도착.상대방";


닫다