1c 바이너리 데이터의 값 저장. 임시 저장소에 데이터 저장

플랫폼 1C:기업다양한 유형의 데이터를 저장할 수 있는 많은 가능성을 제공합니다.

그러나 이러한 기회만으로는 충분하지 않은 경우가 많습니다. 그리고 특별한 물건이 우리를 도와줍니다. 스토리지 값. 이 개체를 사용하면 표준 1C:Enterprise 개체(예: 값 테이블)와 플랫폼에서 유형이 제공되지 않는 비표준 개체를 모두 특수 형식으로 저장할 수 있습니다. 비표준 유형에는 파일이 포함될 수 있습니다. 예를 들어 1C 데이터베이스의 가치 저장소를 사용하면 직원 사진, 문서 스캔, 외부 처리 등을 저장할 수 있습니다. 여기서 장점은 이러한 모든 개체가 데이터베이스 자체에 저장된다는 것입니다. 따라서 백업 복사본에서 새 데이터베이스를 배포할 때 이러한 모든 개체는 새 데이터베이스에도 존재하게 됩니다. 반면, 데이터베이스에 대용량 파일을 저장하면 볼륨이 크게 증가하고 성능에 부정적인 영향을 미칠 수 있습니다. 그러므로 여기서는 합리적인 균형이 유지되어야 합니다.

예제를 사용하여 가치 저장소 작업을 살펴보겠습니다. 구성자에서 특수 디렉토리를 생성해 보겠습니다. 이를 호출해 보겠습니다. 외부객체, 그리고 차례로 디렉토리에 대한 필수 구성 요소를 생성합니다. 객체유형으로 스토리지 값

이제 이 디렉토리와 props에 요소를 생성할 수 있습니다. 객체각 요소는 파일에 기록됩니다.

가치 저장소로 작업하는 것은 매우 간단합니다. 구문 도우미를 보면 이 객체에 메서드와 생성자가 하나만 있다는 것을 알 수 있습니다.

이제 시연을 위해 props에 파일을 쓰는 가장 간단한 코드를 작성해 보겠습니다. 객체이전에 생성된 디렉터리 요소를 생성한 다음 props에서 이 파일을 읽고 디스크에 쓰지만 이름은 다릅니다.

&서버 프로시저에서 LoadUnloadFile(디렉터리 요소)디렉터리 개체 =디렉터리 요소. GetObject() ; //이미지를 값 저장소에 넣습니다. LabelDownload = 새 이미지("g:\musor\favicon.ico" ) NewValueStorage; //디렉토리 요소 쓰기디렉토리 객체. DirectoryObject 개체입니다. 쓰다() ; //값 저장소의 이미지를 파일로 업로드파일명 = "g:\musor\favicon_1.ico" ; LabelUpload = 디렉터리 개체. 객체. 얻다() ; 라벨업로드. 쓰기(파일이름) ; 절차 종료

그리고 코드에 대한 몇 가지 설명이 있습니다.

  • 생성자를 사용하여 저장소를 만들 때 개체는 저장소에 직접 배치됩니다.

이미지 이외의 다른 유형의 파일을 저장소에 저장하려면 객체를 사용하면 됩니다. 바이너리데이터. 순전히 이론적으로는 디렉터리 요소, 문서 등을 값 저장소에 저장할 수도 있습니다. 그러나 실제로 이것은 의미가 없습니다. 그러나 때로는 값 테이블, 값 트리 및 기타 범용 컬렉션을 저장하기 위해 값 저장소를 사용하는 것이 가능합니다.

거의 모든 정보는 가치 저장소에 저장될 수 있습니다.

... 사진(사진):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Objects.Image의 추가 정보 Enumerations.Types; 저장소 = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = 저장소.Get();

// 이 위치에는 모든 것이 표시됩니다... Form Elements.PictureField1.Picture = Storage.Get(); 현재이미지.쓰기();

...스프레드시트 문서:

TabDoc=새 테이블 형식 문서; TabDoc.Output(FormElements.TabularDocumentField1); 저장소=NewValueStorage(TabDoc); 쓰다();

절차 종료

프로시저 RestoreFromStoragePress(요소)

TabDoc=스토리지.Get(); TabDoc인 경우<>정의되지 않은 ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

절차 종료

...임의 파일(바이너리 데이터):

XZ = NewValueStorage(NewBinaryData(파일));

Eight는 스토리지에 있는 데이터의 압축을 지원합니다.

XZ = NewValueStorage(NewBinaryData(file),NewDataCompression(9));

... 외부 처리 및 보고:

프로시저 LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //최대 9개 PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", Compression Rate));

절차 종료

프로시저 StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = 임시파일디렉토리()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(임시파일이름); 외부처리 = 외부처리.만들기(임시파일이름); 외부처리.GetForm().Open();

절차 종료

스토리지 작업

이진 데이터인 경우 Get 메서드를 사용하여 값 저장소에서 복원하고 Write() 메서드를 사용하여 파일에 쓸 수 있습니다.

TypeValue(스토리지)인 경우<>Type("BinaryData") 그런 다음

BinaryData = Storage.Get();

BinaryData = 저장소;

endIf; BinaryData.Write(파일이름);

예를 들어 Word 문서(doc 파일 또는 기타 등록된 파일 형식)인 경우 다음과 같이 열 수 있습니다.

LaunchApplication(파일명);

값 저장 유형의 필드를 지우려면 해당 필드를 정의되지 않음으로 할당해야 합니다.

PropsStorage = 정의되지 않음;

내장 언어 1C:Enterprise 8로 파일 및 그림 작업

목적

관리되는 애플리케이션은 파일 작업을 위한 새로운 메커니즘을 구현합니다. 정보베이스와 클라이언트 응용 프로그램 간의 파일 교환을 제공합니다. 이 메커니즘의 특징은 씬 클라이언트와 웹 클라이언트에서 사용하도록 설계되었으며 웹 브라우저에서 적용되는 파일 작업에 대한 제한 사항을 고려하여 설계되었다는 것입니다.

메커니즘은 사용자 컴퓨터에 로컬로 저장된 데이터를 정보 기반의 임시 저장소에 배치하고 이 정보를 임시 저장소에서 데이터베이스로 전송한 다음 다시 사용자 컴퓨터로 수신하는 데 사용할 수 있는 일련의 방법입니다. 이 메커니즘으로 해결되는 가장 일반적인 응용 프로그램 문제는 상품 이미지, 계약 관련 문서 등과 같은 동반 정보의 저장입니다.

방법 범위

임시저장

임시 저장소는 바이너리 데이터를 배치할 수 있는 정보 베이스의 특수 영역입니다. 주요 목적은 클라이언트-서버 상호 작용 중에 정보가 데이터베이스로 전송되기 전에 임시로 저장하는 것입니다.

웹 브라우저 운영 모델에서는 사용자가 선택한 파일을 클라이언트에 저장할 가능성 없이 서버에 직접 전송해야 하기 때문에 임시 저장 장치의 필요성이 발생합니다. 파일이 전송되면 임시 저장소에 저장되어 데이터베이스에 개체를 쓸 때 사용할 수 있습니다.

임시 저장소로 해결되는 가장 일반적인 응용 작업은 개체가 요소 형태로 정보 베이스에 기록되기 전에 파일이나 그림에 대한 액세스를 제공하는 것입니다.

저장소에 있는 파일이나 이진 데이터는 고유 주소로 식별되며 나중에 쓰기, 읽기 또는 삭제 작업에 사용될 수 있습니다. 이 주소는 임시 저장소에 파일을 쓰는 방법으로 제공됩니다. 내장된 언어의 별도 메소드를 사용하면 전달된 주소가 임시 저장소의 데이터를 가리키는 주소인지 여부를 확인할 수 있습니다.

정보 기반

이 메커니즘을 사용하면 값 저장소 유형의 속성에 저장된 이진 데이터에 액세스할 수 있습니다.

임시저장의 경우와 마찬가지로 특수주소를 통해 정보에 대한 접근이 가능하다. 객체에 대한 링크나 정보 등록 항목 키, 속성 이름을 전달하여 특별한 방법을 통해 얻을 수 있습니다. 테이블 형식의 경우, 테이블 형식 부분의 행 인덱스를 추가로 전송해야 합니다.

정보베이스 세부정보 작업 시 파일 작업 방법에는 제한이 있습니다. 임시저장과 달리 정보를 읽을 수만 있고, 쓰거나 삭제할 수는 없습니다.

파일 작업 방법에 대한 설명

임시 저장소에 데이터 저장

이 메커니즘을 사용하는 가장 일반적인 시나리오는 처음에 사용자 데이터를 임시 저장소에 배치하는 것입니다. 이를 위한 두 가지 방법이 있습니다: PlaceFile() 및 PlaceFileInTemporaryStorage().

첫 번째 메서드인 PlaceFile()은 로컬 파일 시스템의 파일을 임시 저장소에 배치합니다. 이 메서드는 저장소의 대상 주소를 허용할 수 있습니다. 정의되지 않았거나 빈 문자열인 경우 새 파일이 생성되고 메서드는 해당 매개변수를 통해 해당 주소를 반환합니다.

대화형 작업 모드를 결정하는 매개 변수가 True인 경우 해당 메서드는 저장소에 저장할 파일을 선택할 수 있는 표준 파일 선택 대화 상자를 표시합니다. 이 경우 메소드는 선택한 파일의 주소도 반환합니다.

결과적으로 사용자가 파일 선택 대화 상자에서 작업 수행을 대화형으로 거부하면 메서드는 False를 반환합니다. 이 메서드는 클라이언트에서만 사용할 수 있습니다.

두 번째 메소드인 PlaceFileInTemporaryStorage()는 서버에서 사용 가능하다는 점과 임시 저장소에 쓸 데이터가 파일 시스템에서 경로가 아닌 타입의 변수로 표현된다는 점만 제외하면 앞선 메소드와 유사하다. 바이너리데이터. 마찬가지로 대상 주소를 지정하지 않으면 저장소에 새 파일이 생성됩니다. 해당 주소는 함수의 결과로 반환됩니다.

임시 저장소에서 파일 검색

정보베이스에 개체를 쓸 때 임시 저장소에서 데이터를 추출하여 예를 들어 속성에 배치해야 할 수 있습니다. 이에 해당하는 서버 메서드인 GetFileFromTemporaryStorage()가 있습니다. 이 메서드는 임시 저장소에서 데이터를 검색하고 결과로 반환합니다. 이렇게 하려면 임시 저장소에 주소를 지정해야 합니다. 이 주소는 위에서 설명한 PlaceFile() 및 PlaceFileInTemporaryStorage() 메서드가 성공적으로 실행되면 반환됩니다.

임시 저장소에서 파일 삭제

상세정보에 데이터가 저장된 후, 임시저장된 파일은 삭제될 수 있습니다. 이를 위해 임시 저장소에서 파일을 삭제하는 DeleteFileFromTemporaryStorage() 메서드가 있습니다. 이 메서드는 임시 저장소에 있는 파일의 주소를 매개변수로 사용합니다. 서버에서 사용 가능합니다.

임시저장 주소 확인하기

파일 주소는 정보베이스의 임시 저장 공간과 세부 정보를 모두 나타낼 수 있습니다. 유형을 확인하려면 This isTemporaryStorageAddress() 메소드가 있습니다.

전달된 주소가 매장을 가리키는 주소인지 확인합니다. 주소가 임시 저장소를 가리키는 경우 True를 반환합니다. 이 방법은 서버에서 사용할 수 있습니다.

소품 주소 받기

데이터가 정보베이스의 세부사항에 배치된 후 파일 메소드를 사용하여 해당 데이터에 액세스해야 할 수도 있습니다.

하지만 예를 들어 부동산으로부터 데이터를 받기 전에 이 부동산의 주소를 얻어야 합니다. 이를 위해 GetFileAddressInInformationBase() 메서드가 있습니다.

그 목적은 원래 매개변수에 따라 정보베이스의 파일 주소를 반환하는 것입니다. 이를 수행하려면 객체 키(객체에 대한 링크 또는 정보 레지스터 항목 키일 수 있음)와 속성 이름을 전달해야 합니다. 표 부분 속성에 저장된 파일의 주소를 얻어야 하는 경우, 속성 이름을 지정하는 매개변수의 속성 이름 앞에 표 부분의 이름과 점 “.”을 추가해야 합니다. 이 방법은 클라이언트와 서버 모두에서 사용할 수 있습니다.

정보베이스에서 파일 검색

GetFile() 메서드는 정보베이스로부터 파일을 받아 사용자의 로컬 파일 시스템에 저장합니다. 첫 번째 매개변수는 props나 임시 파일 저장소에 있는 파일의 주소를 지정합니다. 두 번째 매개변수는 결과 파일의 대상 위치를 지정합니다. 비대화형 모드에서는 경로를 지정해야 합니다. 대화형 모드에서 매개변수는 선택사항입니다.

기본적으로 메서드는 대화형 모드에서 실행됩니다. 즉, 마지막 매개 변수는 True입니다. 즉, 수신된 파일에 대한 작업을 지정할 수 있는 대화 상자가 표시됩니다. 파일을 실행하거나 사용자가 지정한 위치에 저장합니다. 대화형 모드가 활성화되어 있고 대상 디스크 파일 경로 매개변수가 지정되지 않은 경우 파일 열기 작업을 사용할 수 없습니다. 부울 값을 반환합니다. False는 사용자가 대화형 저장 파일 대화 상자에서 작업을 취소하기로 선택했음을 의미합니다.

파일 메소드 사용 예

// 대화형 모드에서 디스크로부터 파일을 수신하고 // 임시 저장소에 배치 &클라이언트 프로시저 SelectDiskFileAndWrite()

변수 선택이름; VariableTemporaryStorageAddress; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(임시저장주소); endIf;

절차 종료

// 임시 저장소에서 디렉터리로 파일 복사 // 속성, 개체 기록, 임시 저장소에서 파일 삭제 // 서버 프로시저에 개체 파일 배치(임시 저장소 주소)

디렉토리 요소 = 양식 AttributesValue("개체"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); 디렉터리 요소.파일 데이터 = NewValueStorage(BinaryData); FilePathOnDisk = 새 파일(DirectoryItem.FileName); 디렉토리 Item.FileName = FilePathOnDisk.Name; 디렉토리 요소.Write(); 수정됨 = 거짓; DeleteFileFromTemporaryStorage(임시저장소주소); ValueВFormAttributes(디렉터리 요소, "개체");

절차 종료

// props에서 파일을 읽고 // 대화형 모드에서 로컬 디스크에 저장 &클라이언트 프로시저 ReadFileAndSaveToDisk()

주소 = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(주소, 개체.파일 이름, True);

절차 종료

사진 필드의 주소 지원

그림 필드 컨트롤은 임시 저장소나 데이터베이스의 파일 주소로 지정된 그림 표시를 지원합니다.

이렇게 하려면 양식 요소의 Data 속성에 문자열 유형 속성을 설정해야 합니다. 이 속성의 값은 사진의 주소로 해석됩니다.

// 이미지 필드를 임시 저장소의 이미지 주소에 // 바인딩합니다. AddressPictures는 문자열 유형의 세부정보를 형성합니다.

PlaceFile(사진주소,참)

Picture.Data = AddressPictures

웹 클라이언트 작업 시 제한 사항

웹 클라이언트를 사용할 때 설명된 메커니즘의 작동에는 몇 가지 제한 사항이 있습니다. 이러한 제한 사항은 브라우저의 보안 모델과 관련이 있습니다. 따라서 예를 들어 클라이언트는 파일을 로컬 파일 시스템에 독립적으로 저장할 수 없습니다. 즉, 클라이언트 메서드 PlaceFile() 및 GetFile()의 대화형 버전만 사용할 수 있습니다. 비대화형 모드를 사용하려고 하면 예외가 발생합니다. 대화형으로 나타나는 대화 상자는 브라우저 유형에 따라 다릅니다.

클라이언트에서 Value Storage 작업 시 기능

문제:

문서의 표 형식 섹션에 값 저장 유형의 속성이 있는 경우 이 속성에 대용량 데이터가 포함되어 있으면 문서 양식을 여는 속도가 느려집니다.

추정되는 이유:

아마도 양식을 열 때 클라이언트에 전송되는 것은 값 저장소에 있는 데이터에 대한 링크가 아니라 데이터 자체일 것입니다.

해결책

  • 양식의 테이블 속성 속성에는 "항상 사용" 플래그가 있습니다. 설정된 경우 필드의 내용은 항상 서버와 클라이언트 간에 전송됩니다(예: 양식을 열 때). 이 플래그는 비활성화되어야 하지만 기본적으로 클라이언트에는 이 필드에 대한 값이 없으므로 코드에서 이를 고려해야 합니다. 1C:Archive에서 예제를 찾을 수 있습니다.

사용하면 더욱 좋습니다 임시 저장클라이언트와 서버 간에 파일을 전송합니다.

"Data" 속성에는 정보가 이진 데이터 형식으로 저장되는 "Products" 디렉터리가 있습니다. 속성 자체에는 "값 저장소" 값 유형이 있습니다. 다음 스크린샷은 디렉터리 메타데이터 구조를 보여줍니다.

요소 형태로 디스크에서 임의의 파일을 첨부하기 위해 "AttachFile" 명령이 구현되었습니다. 해당 프로그램 코드는 다음 목록에 나와 있습니다.

& 클라이언트 프로시저 AttachFile(명령) // 클라이언트의 명령 핸들러. 파일 선택 // 디스크에서 파일을 선택하는 대화 상자모드 = FileSelectionDialogMode. 열리는; OpenFileDialog = NewFileSelectDialog(모드); 파일 열기 대화 상자. FullFileName = " " ; 파일 열기 대화 상자. 다중선택 = 거짓 ; 파일 열기 대화 상자. 제목 = "파일 선택" ; FileOpenDialog. Select() 그러면 FilePath = FileOpenDialog가 됩니다. 전체파일이름; // 바이너리 파일 데이터 수신 BinaryData = 새로운 BinaryData(PathToFile) ; //바이너리 데이터를 서버로 전송 AttachFileServer(BinaryData) ; 그렇지 않으면 텍스트 = "ru = " " 파일 (들) 선택되지 않았습니다!" " ; 엔 =" " 파일 (들) 선택되지 않았습니다!" " " ; Warning(NStr(Text) ) ; EndIf ; EndProcedure & OnServer 프로시저 AttachFileServer(BinaryData) // 정보보안 파일을 기록하기 위한 서버 핸들러 // 양식 객체를 참조 객체로 변환합니다. ObjectCurrent = FormAttributesValue("Object" ) ; // "Data" 속성에 새 값을 할당합니다.객체현재. 데이터 = NewValueStorage(BinaryData) ; // 변경 사항을 저장하다객체현재. 쓰다() ; 절차 종료

알고리즘을 일반적인 용어로 설명하면 먼저 클라이언트의 디스크에서 파일이 선택됩니다. 결과 바이너리 파일 데이터는 서버로 전송되어 정보 베이스, 즉 현재 디렉터리 요소의 "데이터" 속성에 기록됩니다.

원칙적으로 모든 것이 작동합니다. 요소를 열 때 필요에 따라 이 데이터를 읽을 수 있습니다. 예를 들어 이미지가 props에 저장되어 있으면 이를 가져와서 양식 필드에 표시할 수 있습니다. 이 솔루션은 자리가 있지만 대부분의 작업에서 디렉터리 및 문서에 "값 저장소" 값 유형의 속성을 사용하는 것은 최적이 아닙니다. 그래서...

성능에 미치는 영향

몇 가지 성능 테스트를 실행해 보겠습니다. 테스트에서는 첨부 파일이 있거나 없는 "제품" 디렉토리의 두 가지 요소를 사용합니다. 첨부파일 용량은 5MB 입니다.

모든 테스트는 테스트 구성의 "GetElement" 처리를 사용하여 수행됩니다. 기사 끝에 있는 링크에서 이 구성을 다운로드할 수 있습니다.

"제품" 디렉터리의 항목을 여는 데 걸리는 시간을 측정해 보겠습니다. 요소를 열려면 요소에 대한 참조가 매개변수로 전달되는 전역 컨텍스트 메서드 "OpenValue()"가 사용됩니다. 표준 성능 측정 도구를 사용하여 개점 시간을 측정해 보겠습니다. 결과는 다음 스크린샷에 나와 있습니다.

보시다시피, 첨부된 파일이 있는 요소를 여는 데 걸리는 시간이 10배 더 길어졌습니다! 또 다른 테스트를 해보자. 제품 카탈로그 요소를 참조하기 위해 "GetObject()" 메서드를 실행해 보겠습니다. 다음 스크린샷에서 테스트 결과를 볼 수 있습니다.

그 차이는 상당히 큽니다. 첨부파일 없이 요소를 받는 것이 194배 빠릅니다!

이는 "GetObject()" 메서드가 참조로 디렉터리 요소의 세부 정보에서 모든 데이터를 받기 때문에 발생합니다. 따라서, 메소드는 "Code" 및 "Name" 속성 값뿐만 아니라 "Data" 속성 값도 수신합니다. 이 예에서와 같이 크기가 5MB인 이진 데이터를 저장하는 경우 개체가 수신되면 이 데이터는 다른 세부 정보와 마찬가지로 RAM에 배치된 다음 클라이언트 측으로 전송됩니다. 요소 객체를 얻는 데 걸리는 시간을 늘리는 것은 이 속성으로부터 데이터를 수신하는 것입니다. 얇은 통신 채널을 사용하는 경우 네트워크를 통해 많은 양의 정보가 전송되므로 개방 시간이 훨씬 더 크게 늘어납니다.

참고: "OpenValue()" 메서드를 실행할 때 디렉터리 요소 개체도 먼저 얻은 다음 양식 개체로 변환되어 클라이언트에 전달됩니다(관리되는 양식의 경우). 즉, 요소가 참조로 열릴 때 개체도 검색됩니다.

첨부 파일이 있는 경우와 없는 경우 디렉터리 항목을 열고 쓰는 데 걸리는 시간에 대해 최종 테스트를 수행해 보겠습니다. 결과는 다음 스크린샷에 표시됩니다.

자연스러운 결과. 첨부된 파일이 있는 디렉터리 항목을 수신하고 쓰는 데 걸리는 시간이 약 19배 더 길어졌습니다. 위에서 언급한 바와 같이 객체를 수신하면 5MB의 정보가 저장되는 "데이터" 속성을 포함하여 모든 세부 정보의 값이 획득됩니다. 요소가 기록되면 이 양의 데이터가 정보베이스에 다시 기록됩니다. 결과적으로 "값 저장" 유형을 사용하여 디렉터리 속성(또는 문서)에 데이터를 저장하면 개체를 검색할 때와 정보베이스에 배치할 때 모두 성능에 부정적인 영향을 미칩니다.

정보 기본 개체에 대한 데이터 저장 문제를 해결하는 가장 올바른 방법은 무엇입니까?

올바른 해결책

일반적인 구성에서 이 메커니즘의 구현을 살펴보면 객체에 대한 추가 정보가 별도의 정보 레지스터 테이블에 저장되어 있음을 알 수 있습니다. 예를 들어, 이는 "Trade Management" 버전 11의 표준 구성에서 첨부 파일 메커니즘의 모습입니다.

"Nomenclature" 디렉토리는 "NomenclatureAttachedFiles" 디렉토리의 소유자입니다. 이는 차례로 해당 요소를 참조하는 AttachedFile 차원인 AttachedFiles 정보 레지스터와 연결됩니다. 따라서, 정보기본객체에 첨부된 데이터는 실제로 정보등록테이블에 저장되며, 그 동작은 리소스에 저장된 데이터량에 의해 실질적으로 영향을 받지 않는다. 첨부 파일에 대한 추가 정보를 저장하고 참조를 통해 첨부 파일에 대한 액세스를 지원하려면 중간 디렉터리 "첨부 파일 명명법"이 필요합니다.

위의 모든 내용은 적절하게 설계된 구성 메타데이터 구조가 성능에 미치는 엄청난 영향을 다시 한 번 확인시켜 줍니다.

기사의 예를 사용하여 구성을 테스트하십시오. 링크 .

공유하다