1c değer deposu 8.3 örnekleri. Verileri değer deposu tipindeki alanlarda depolamak. Web istemcisiyle çalışırken sınırlamalar

Platform 1C:Kurumsalçeşitli türlerdeki verileri depolamak için birçok olanak sağlar.

Ancak çoğu zaman bu fırsatlar yeterli olmuyor. Ve sonra özel bir nesne yardımımıza geliyor - DepolamaDeğerleri. Bu nesne, hem standart 1C:Enterprise nesnelerini, örneğin bir değerler tablosunu hem de platformda türü sağlanmayan standart olmayan nesneleri özel bir formatta saklamanıza olanak tanır. Standart olmayan türler dosyalar içerebilir. Örneğin, 1C veritabanındaki değer deposunu kullanarak çalışanların fotoğraflarını, belge taramalarını, harici işlemleri vb. saklayabilirsiniz. Buradaki avantaj, tüm bu nesnelerin veritabanının kendisinde saklanmasıdır. Buna göre, yedek kopyadan yeni bir veritabanı dağıtılırken, tüm bu nesneler yeni veritabanında da mevcut olacaktır. Öte yandan, veritabanında büyük dosyalar depolarsanız bu, dosyanın hacmini önemli ölçüde artırabilir ve performansını olumsuz etkileyebilir. Dolayısıyla burada makul bir dengenin korunması gerekiyor.

Bir örnek kullanarak değer deposuyla çalışmaya bakalım. Yapılandırıcıda özel bir dizin oluşturalım - onu arayalım Dış Nesneler ve sırayla dizin için gereklilikleri oluşturacağız Bir obje tip ile DepolamaDeğerleri

Artık bu dizinde ve props'ta öğeler oluşturabiliriz. Bir obje Her öğe bir dosyaya yazılır.

Bir değer deposuyla çalışmak çok basittir. Söz dizimi yardımcısına bakarsak bu nesnenin tek bir metodu ve tek yapıcısının olduğunu görürüz.

Şimdi gösteri amaçlı olarak sahne donanımına dosya yazacak en basit kodu yazalım. Bir objeönceden oluşturulmuş bir dizin öğesini seçin ve ardından bu dosyayı proplardan okuyun ve diske yazın, ancak farklı bir adla.

&Sunucuda Prosedür LoadUnloadFile(Dizin Öğesi)Directory Object =Dizin Öğesi. GetObject(); //Resmi değer deposuna yerleştiriyoruz LabelDownload = Yeni Resim("g:\musor\favicon.ico" ) NewValueStorage; //Bir dizin elemanı yaz Dizin nesnesi. DirectoryObject nesnesi. Yazmak() ; //Görüntüyü değer deposundan bir dosyaya yükle DosyaAdı = "g:\musor\favicon_1.ico" ; LabelUpload = Dizin Nesnesi. Bir obje. Elde etmek() ; EtiketYükle. Write(DosyaAdı) ; Prosedürün Sonu

Ve kod için birkaç açıklama.

  • Yapıcı kullanılarak mağaza oluşturulduğunda nesne doğrudan mağazaya yerleştirilir.

Görüntüler dışındaki diğer dosya türlerini depolama alanında depolamak için nesneyi kullanabilirsiniz. Ikili veri. Tamamen teorik olarak, değer deposunda dizin öğelerini, belgeleri vb. bile saklayabilirsiniz. Fakat pratikte bunun hiçbir anlamı yok. Ancak bazen bir değerler tablosunu, bir değerler ağacını ve diğer evrensel koleksiyonları depolamak için bir değer deposu kullanmak mümkündür.

1C:Enterprise 8'de, Değer Depolama türündeki alanlarda çeşitli verileri depolamak mümkündür. Bu alanlar ValueStorage türündeki değerleri saklayabilir. ValueStorage türünün kendisi, her şeyden önce, çeşitli türlerdeki değerleri serileştirilmiş bir biçimde, yani veri yazmanıza ve ardından geri yüklemenize olanak tanıyan bir biçimde depolamayı amaçlamaktadır. Yerleşik dilin belgelerinde, nesnelerin açıklamasında serileştirme olasılığı "Serileştirilebilir" işaretiyle belirtilir. Bu değerler ve ilkel türlerin değerleri bir değer deposuna yerleştirilebilir ve böylece ValueStorage türündeki veritabanı alanlarına yazılabilir. Değer deposunun önemli bir özelliği, verileri sıkıştırılmış biçimde saklama yeteneğidir. Bu, büyük nesneler için depolanan bilgi miktarını önemli ölçüde azaltmanıza olanak tanır.

Böylece, Değer Depolama tipinin alanlarını kullanarak, alanlar için açıkça belirtilebilecek olanlarla karşılaştırıldığında, veri tipinin önemli ölçüde daha geniş bir listesini veritabanında depolamak mümkündür. Bununla birlikte, bu depolama yönteminin ve bu tür verileri işleme yeteneğinin, veri tabanı alanlarındaki olağan veri depolamasından önemli ölçüde farklı olduğu dikkate alınmalıdır. Bu tür alanlar için sistem, fiili yazma ve okuma dışında pratik olarak herhangi bir işlevi desteklemez. Bu tür alanlar için indeksleme kullanılamaz, sorgu ve seçimlerde veriler onlar tarafından sıralanamaz, bu tür alanlar özetlenemez vb. Bu durumda veritabanı motorunun, doğası hakkında hiçbir şey bilmeden bazı bilgileri sakladığı düşünülebilir.

Buna göre Değer Depolama türündeki alanlar yalnızca amacına ve teknolojik özelliklerine uygun olduğu durumlarda kullanılmalıdır.

Değer Depolama türü alanlarının ana kullanımlarından biri görüntüleri ve dosya görüntülerini depolamaktır. Bu amaçla Görüntü ve İkili Veri türleri kullanılmaktadır. Bu, çalışan fotoğraflarını, çeşitli formatlarda oluşturulan belgeleri vb. veritabanına kaydetmenize olanak tanır. Bu tür bilgilerin depolanmasını gerçekleştirirken bu alanların ana bilgilerden ayrı depolanmasını sağlayacak veri yapılarının oluşturulması önerilebilir. Örneğin, çalışanların fotoğraflarını saklamak için, kişilerin listesini saklayan nesnelerin içine Değer Depolama türündeki alanları yerleştirmek yerine, ayrı bir dizin veya bilgi kaydı uygulayabilirsiniz. Nesnelerin (örneğin dizin öğelerinin) her zaman bir bütün olarak sistem tarafından okunduğu dikkate alınmalıdır. Bu nedenle, büyük miktarda bilginin doğrudan nesne alanlarında depolanması, sistemi önemli ölçüde yavaşlatabilir.

ValueStorage türündeki alanlarda, örneğin değer ve yapı tablolarını depolamak mümkündür. Aynı zamanda referans türleri de dahil olmak üzere her türlü veri türü değer tablolarında ve yapılarında saklanabilir. Bir koleksiyonun yalnızca serileştirilebilir değerler içermesi durumunda Değer Deposu'na yerleştirilebileceğini unutmayın. Bununla birlikte, verileri depolamak için bu seçeneğin, değerlerin ayrı alanlarda açık bir şekilde saklanmasından ve bilgilerin tablo bölümlerinde veya bilgi kayıtlarında saklanmasından önemli ölçüde farklı olduğu dikkate alınmalıdır. Sistem bu tür alanlar için referans bütünlüğünü korumayacaktır, sorgularda veri araması yapmayacaktır, vb. Bu nedenle, koleksiyonların bu tür alanlarda depolanması, iş mantığından sorumlu bir uygulama çözümünün temel parçalarını uygulamak için kullanılamaz. Bu tür bir depolamaya yalnızca uygulama çözümünün iş mantığı açısından gerekli olmayan, örneğin herhangi bir kullanıcı ayarının saklanması gibi yardımcı veriler için izin verilebilir.

Her ne kadar sistemin ValueStorage alanlarında saklanan verinin boyutu konusunda açık bir sınırı olmasa da, saklanan bilgi miktarı konusunda yine de dikkatli olmalısınız. Bu tür alanlara büyük hacimlerin yerleştirilmesinin bilgi tabanının genel hacmini artıracağı, bunun da veri tabanı yedeği oluşturma gibi çeşitli yönetimsel işlemler yapılırken sistemin işleyişini olumsuz etkileyeceği dikkate alınmalıdır. Örneğin, dosya görüntülerini saklarken, işte gerçekten gerekli olan verilerin bu tür alanlarda saklanması, ancak çözülmekte olan uygulamada kullanılmayan büyük hacimli dosyaları depolamak için kullanılmaması önerilebilir.

Hemen hemen her bilgi bir değer deposunda saklanabilir;

... resimler (fotoğraflar):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Objects.Image'ın Ek Bilgilerinin Enumerations.Types'ı; Depolama = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// burada her şey görüntülenir... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...e-tablo belgesi:

TabDoc=Yeni TabularDocument; TabDoc.Output(FormElements.TabularDocumentField1); Depolama=NewValueStorage(TabDoc); Yazmak();

Prosedürün Sonu

Prosedür RestoreFromStoragePress(Element)

TabDoc=Storage.Get(); TabDoc ise<>Tanımsız ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Prosedürün Sonu

...rasgele dosyalar (ikili veriler):

XZ = NewValueStorage(NewBinaryData(file));

Sekiz, depolamaya yerleştirilen verilerin sıkıştırılmasını destekler:

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

... harici işleme ve raporlama:

Prosedür LoadProcessingIntoStorage(PropsStorageType)

Sıkıştırma Oranı = NewDataCompression(9); //9 maksimum PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", Sıkıştırma Oranı));

Prosedürün Sonu

Prosedür StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(GeçiciDosyaAdı); HariciProcessing = HariciProcessing.Create(TemporaryFileName); HariciProcessing.GetForm().Open();

Prosedürün Sonu

Depolamayla çalışma

İkili Veri ise Get yöntemi kullanılarak değer deposundan geri yüklenebilir ve Write() yöntemi kullanılarak bir dosyaya yazılabilir.

If TypeValue(Depolama)<>("İkili Veri") yazın ve ardından

BinaryData = Storage.Get();

İkili Veri = Depolama;

endIf; BinaryData.Write(DosyaAdı);

Örneğin bir Word belgesiyse (doc dosyası veya başka bir kayıtlı dosya türü), şu şekilde açılabilir:

LaunchApplication(DosyaAdı);

Değer Depolama türündeki bir alanı temizlemek için bu alanı Tanımsız olarak atamanız gerekir:

PropsStorage = Tanımsız;

Yerleşik 1C:Enterprise 8 dilinde dosya ve resimlerle çalışma

Amaç

Yönetilen uygulama, dosyalarla çalışmaya yönelik yeni bir mekanizma uygular. Bilgi tabanı ile istemci uygulaması arasında dosya alışverişini sağlar. Bu mekanizmanın özelliği, ince istemcide ve Web istemcisinde kullanılmak üzere tasarlanmış olması ve Web tarayıcıları tarafından uygulanan dosyalarla çalışma kısıtlamaları dikkate alınarak tasarlanmış olmasıdır.

Mekanizma, kullanıcının bilgisayarında yerel olarak depolanan verileri bilgi tabanının geçici deposuna yerleştirmek, bu bilgileri geçici depodan veri tabanına aktarmak ve kullanıcının bilgisayarına geri almak için kullanılabilecek bir dizi yöntemdir. Bu mekanizma tarafından çözülen en yaygın uygulama sorunları, örneğin malların görüntüleri, sözleşmelerle ilgili belgeler vb. gibi eşlik eden bilgilerin depolanmasıdır.

Yöntem Kapsamı

Geçici depolama

Geçici depolama, bilgi tabanının ikili verilerin yerleştirilebileceği özel bir alanıdır. Temel amaç, istemci-sunucu etkileşimi sırasında bilgilerin veritabanına aktarılmadan önce geçici olarak depolanmasıdır.

Web tarayıcısı işletim modelinin, kullanıcı tarafından seçilen dosyanın istemcide saklanma olanağı olmaksızın doğrudan sunucuya aktarılmasını gerektirmesi nedeniyle geçici depolama ihtiyacı ortaya çıkmaktadır. Bir dosya aktarıldığında, geçici depolama alanına yerleştirilir ve daha sonra veritabanına bir nesne yazarken kullanılabilir.

Geçici depolamayla çözülen en tipik uygulama görevi, nesnenin bilgi tabanına örneğin bir öğe biçiminde kaydedilmesinden önce dosyalara veya resimlere erişim sağlamaktır.

Depolamaya yerleştirilen bir dosya veya ikili veri, daha sonra yazma, okuma veya silme işlemlerinde kullanılabilen benzersiz bir adresle tanımlanır. Bu adres, bir dosyayı geçici belleğe yazma yöntemleriyle verilir. Yerleşik dildeki ayrı bir yöntem, iletilen adresin geçici depolamadaki verilere işaret eden bir adres olup olmadığını belirlemenize olanak tanır.

Bilgi tabanı

Mekanizma, Değer Depolama türünün özniteliklerinde saklanan ikili verilere erişmenizi sağlar.

Geçici saklamada olduğu gibi bilgiye erişim özel bir adres aracılığıyla mümkündür. Bunu, bir nesneye veya bilgi kaydı giriş anahtarına bir bağlantı ve niteliğin adını ileterek özel bir yöntemle elde edebilirsiniz. Tablolu bir parça olması durumunda, tablolu parçanın satır indeksinin de aktarılması gerekir.

Dosyalarla çalışma yöntemlerinin, bilgi tabanı ayrıntılarıyla çalışırken sınırlamaları vardır. Onlar için, geçici depolamanın aksine, yalnızca bilgi okunabilir, ancak yazılamaz veya silinemez.

Dosyalarla çalışma yöntemlerinin açıklaması

Verileri geçici depolama alanına kaydetme

Bu mekanizmayı kullanmanın en tipik senaryosu, başlangıçta kullanıcı verilerinin geçici depolamaya yerleştirilmesini içerir. Bunun için iki yöntem vardır: PlaceFile() ve PlaceFileInTemporaryStorage().

İlk yöntem olan PlaceFile(), yerel dosya sistemindeki bir dosyayı geçici depolamaya yerleştirir. Yöntem, depolamadaki bir hedef adresi kabul edebilir. Tanımlanmamışsa veya boş bir dize ise, yeni bir dosya oluşturulacak ve yöntem, ilgili parametre aracılığıyla adresini döndürecektir.

Etkileşimli çalışma modunu belirleyen parametre Doğru ise yöntem, depolamaya yerleştirilecek dosyayı seçebileceğiniz standart bir dosya seçimi iletişim kutusu görüntüler. Bu durumda yöntem aynı zamanda seçilen dosyanın adresini de döndürecektir.

Sonuç olarak, kullanıcı dosya seçimi iletişim kutusunda bir işlemi gerçekleştirmeyi etkileşimli olarak reddederse yöntem False değerini döndürür. Yöntem yalnızca istemcide kullanılabilir.

İkinci yöntem olan PlaceFileInTemporaryStorage(), sunucuda mevcut olması ve geçici depolamaya yazılacak verilerin dosya sistemindeki bir yol olarak değil, bir tür değişkeni olarak temsil edilmesi dışında öncekine benzer. Ikili veri. Aynı şekilde hedef adres belirtilmezse depoda yeni bir dosya oluşturulur. Fonksiyonun sonucu olarak adresi döndürülür.

Bir dosyayı geçici depolama alanından alma

Bilgi tabanına bir nesne yazarken, verileri geçici depolama alanından çıkarmanız ve bunu örneğin bir niteliğe yerleştirmeniz gerekebilir. Buna karşılık gelen bir sunucu yöntemi var - GetFileFromTemporaryStorage(). Bu yöntem, verileri geçici depolama alanından alır ve sonuç olarak geri döndürür. Bunu yapmak için geçici depolamadaki adresi belirtmeniz gerekir. Bu adres, yukarıda açıklanan PlaceFile() ve PlaceFileInTemporaryStorage() yöntemlerinin başarıyla çalıştırılması durumunda döndürülür.

Bir dosyayı geçici depolama alanından silme

Veriler ayrıntılara kaydedildikten sonra geçici depolama alanındaki dosya silinebilir. Bu amaçla, bir dosyayı geçici depolama alanından silen bir deleteFileFromTemporaryStorage() yöntemi vardır. Yöntem, geçici depolamadaki bir dosyanın adresini parametre olarak alır. Sunucuda mevcut.

Geçici depolama için adresin kontrol edilmesi

Dosya adresi hem geçici depolamaya hem de bilgi tabanındaki ayrıntılara işaret edebilir. Türünü kontrol etmek için This isTemporaryStorageAddress() yöntemi vardır.

İletilen adresin mağazaya işaret eden bir adres olup olmadığını kontrol eder. Adres geçici depolamaya işaret ediyorsa True değerini döndürür. Yöntem sunucuda mevcuttur.

Sahne adresini alma

Veriler bilgi tabanındaki ayrıntılara yerleştirildikten sonra dosya yöntemlerini kullanarak erişmeniz gerekebilir.

Ancak örneğin bir mülkten veri almadan önce bu mülkün adresini almanız gerekir. Bu amaçla GetFileAddressInInformationBase() yöntemi vardır.

Amacı, bilgi tabanındaki dosya adresini orijinal parametrelere göre döndürmektir. Bunu yapmak için, nesne anahtarını (bu, nesneye bir bağlantı veya bilgi kaydı giriş anahtarı olabilir) ve niteliğin adını iletmeniz gerekir. Tablolu parça özniteliğinde saklanan bir dosyanın adresini almanız gerekiyorsa, öznitelik adını belirten parametrede öznitelik adından önce tablolu parçanın adını ve bir nokta “.” eklemeniz gerekir. Yöntem hem istemcide hem de sunucuda kullanılabilir.

Bilgi tabanından dosya alma

GetFile() yöntemi bilgi tabanından bir dosya alır ve onu kullanıcının yerel dosya sistemine kaydeder. İlk parametre, props veya geçici dosya deposundaki dosyanın adresini belirtir. İkinci parametre, ortaya çıkan dosyanın hedef konumunu belirtir. Etkileşimli olmayan modda yolu belirtmeniz gerekir. Etkileşimli modda parametre isteğe bağlıdır.

Varsayılan olarak yöntem etkileşimli modda yürütülür, yani son parametre True'dur. Bu, alınan dosyayla ilgili bir eylemi belirleyebileceğiniz bir iletişim kutusunun görüntüleneceği anlamına gelir: dosyayı çalıştırın veya kullanıcı tarafından belirlenen bir konuma kaydedin. Etkileşimli mod etkinse ve Hedef disk dosya yolu parametresi belirtilmemişse dosya açma işlemi kullanılamaz. Bir boole değeri döndürür. Yanlış, kullanıcının etkileşimli dosya kaydetme iletişim kutusunda işlemi iptal etmeyi seçtiği anlamına gelir.

Dosya yöntemlerini kullanma örneği

// Etkileşimli modda diskten bir dosya alma // ve onu geçici depolamaya yerleştirme &İstemci Prosedüründe SelectDiskFileAndWrite()

Değişken SeçilenAd; DeğişkenGeçiciDepolamaAdresi; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); endIf;

Prosedürün Sonu

// Bir dosyayı geçici depodan bir dizin // niteliğine kopyalamak, bir nesneyi kaydetmek, geçici // depodan bir dosyayı silmek &Sunucu Prosedürüne Nesne Dosyasını (Geçici Depolama Adresi) Yerleştirin

Dizin Öğesi = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Dizin Element.File Verileri = NewValueStorage(BinaryData); FilePathOnDisk = Yeni Dosya(DirectoryItem.FileName); Directory Item.FileName = FilePathOnDisk.Name; Dizin öğesi.Write(); Değiştirildi = Yanlış; deleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(Dizin Öğesi, "Nesne");

Prosedürün Sonu

// Desteklerden bir dosya okuma ve onu etkileşimli modda yerel diske kaydetme // İstemci Prosedüründe ReadFileAndSaveToDisk()

Adres = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Adres, Object.FileName, True);

Prosedürün Sonu

Resim alanındaki adresler için destek

Resim Alanı kontrolü, geçici depolamadaki veya veritabanındaki bir dosyanın adresiyle belirtilen bir resmin görüntülenmesini destekler.

Bunu yapmak için form öğesinin Veri özelliğinde bir dize türü niteliği ayarlamanız gerekir. Bu özelliğin değeri resmin adresi olarak yorumlanacaktır.

Örnek // Görüntü alanını geçici // depolamadaki görüntü adresine bağlama. AdresResimleri dize türünün ayrıntılarını oluşturur

PlaceFile(ResimAdresi,True)

Picture.Data = AdresResimleri

Web istemcisiyle çalışırken sınırlamalar

Açıklanan mekanizmanın Web istemcisini kullanırken çalışmasının bazı sınırlamaları vardır. Bu kısıtlamalar tarayıcının güvenlik modeliyle ilgilidir. Dolayısıyla, örneğin, istemci bir dosyayı bağımsız olarak yerel dosya sistemine kaydedemez; yani yalnızca PlaceFile() ve GetFile() istemci yöntemlerinin etkileşimli sürümü kullanılabilir. Etkileşimli olmayan modu kullanmaya çalışırken bir istisna atılır. Etkileşimli olarak görünen iletişim kutuları tarayıcı türünüze özeldir.

İstemcide Değer Depolama ile çalışırken özellikler

Sorun:

Bir Belgenin tablo bölümünde Değer Depolama türünde bir özniteliğe sahip olması, bu özniteliğin büyük veriler içermesi durumunda belge formunun açılmasını yavaşlatır.

Varsayılan sebep:

Belki bir formu açarken müşteriye gönderilen, Değer Deposu'nda bulunan verilere giden bağlantı değil, verinin kendisidir.

Çözüm

  • Formun tablo özelliğinin özelliklerinde "Her zaman kullan" işareti bulunur. Ayarlanırsa, alanın içeriği her zaman sunucu ile istemci arasında (örneğin bir form açılırken) aktarılır. Bu bayrak devre dışı bırakılmalıdır, ancak istemcide varsayılan olarak bu alan için bir değer olmayacağından bu durum kodda dikkate alınmalıdır. Bir örnek 1C:Archive'da bulunabilir.

Kullanmak daha da iyi geçici depolama istemci ve sunucu arasında dosya aktarmak için.

Bilgilerin ikili veri biçiminde saklandığı “Veri” özelliğinde bir “Ürünler” dizinimiz var. Özniteliğin kendisi "Değer Depolama" değer türüne sahiptir. Aşağıdaki ekran görüntüsü dizin meta veri yapısını göstermektedir.

Diskten öğe biçiminde rastgele bir dosya eklemek için "Dosya Ekle" komutu uygulanmıştır. Program kodu aşağıdaki listede sunulmaktadır:

& İstemci Prosedüründe InsertFile(Command) // İstemcideki komut işleyicisi. Dosya seçimi // Diskten dosya seçmek için diyalog Mod = FileSelectionDialogMode. Açılış; OpenFileDialog = NewFileSelectDialog(Mode); Dosya Aç İletişim Kutusu. TamDosyaAdı = " "; Dosya Aç İletişim Kutusu. MultipleSelect = Yanlış; Dosya Aç İletişim Kutusu. Başlık = "Dosyaları seçin"; Eğer FileOpenDialog. Select() Sonra FilePath = FileOpenDialog. TamDosyaAdı; // İkili dosya verilerini al BinaryData = new BinaryData(PathToFile) ; // İkili veriyi sunucuya aktarıyoruz InsertFileServer(BinaryData) ; Aksi halde Metin = "ru = " " Dosya (ler) seçilmedi!" " ; tr =" " Dosya (ler) seçilmedi!" " " ; Warning(NStr(Text) ) ; EndIf ; EndProcedure & OnServer Prosedürü InsertFileServer(BinaryData) // Bilgi güvenliğinde bir dosyayı kaydetmek için sunucudaki işleyici // Form nesnesini referans nesnesine dönüştürün ObjectCurrent = FormAttributesValue("Object" ) ; // "Veri" özelliğine yeni bir değer atayın ObjectCurrent. Veri = NewValueStorage(BinaryData) ; // Değişiklikleri Kaydet ObjectCurrent. Yazmak() ; Prosedürün Sonu

Algoritmayı genel hatlarıyla anlatacak olursak öncelikle client üzerindeki diskten bir dosya seçilir. Ortaya çıkan ikili dosya verileri, bilgi tabanına, yani mevcut dizin öğesinin "Veri" niteliğine kaydedildiği sunucuya gönderilir.

Prensip olarak her şey işe yarıyor. Bir elemanı açarken bu verileri gerektiği gibi okuyabiliriz. Örneğin, bir görüntü sahne donanımına kaydedilmişse, onu alıp form alanında görüntüleyebiliriz. Bu çözümün bir yeri vardır, ancak çoğu görevde dizinlerde ve belgelerde "Değer Depolama" değer türüne sahip niteliklerin kullanılması ideal değildir. Ve bu yüzden...

Performans Etkisi

Bazı performans testleri yapalım. Testler, dosya eklenmiş ve eklenmemiş olmak üzere "Ürünler" dizininin iki öğesini kullanacaktır. Ekteki dosyanın boyutu 5 megabayttır.

Tüm testler, test yapılandırmasındaki "GetElement" işlemi kullanılarak gerçekleştirilir. Bu konfigürasyonu yazının sonundaki linkten indirebilirsiniz.

"Ürünler" dizinindeki öğelerin açılması için geçen süreyi ölçelim. Bir öğeyi açmak için, parametre olarak öğeye bir referans aktarılan "OpenValue()" genel bağlam yöntemi kullanılır. Standart bir performans ölçüm aracı kullanarak açılış süresini ölçelim. Sonuçlar aşağıdaki ekran görüntüsünde sunulmaktadır:

Gördüğümüz gibi, dosya eklenmiş bir öğeyi açmak için gereken süre 10 kat daha uzun! Bir test daha yapalım. Ürün kataloğu öğesine referans vermek için "GetObject()" yöntemini çalıştıralım. Test sonucunu aşağıdaki ekran görüntüsünde görebilirsiniz.

Fark oldukça önemlidir. Bir öğeyi dosya eklenmeden almak 194 kat daha hızlıdır!

Bunun nedeni, "GetObject()" yönteminin, dizin öğesinin ayrıntılarındaki tüm verileri referans olarak almasıdır. Buna göre yöntem sadece “Kod” ve “Ad” niteliklerinin değerlerini değil aynı zamanda “Veri” niteliğinin değerini de almaktadır. Eğer 5 megabayt boyutunda ikili veri saklıyorsa (örneğimizde olduğu gibi), nesne alındığında bu veri (diğer detaylar gibi) RAM'e yerleştirilir ve daha sonra istemci tarafına iletilir. Eleman nesnesinin elde edilme süresini artıran şey, bu öznitelikten veri alınmasıdır. İnce bir iletişim kanalı kullanılıyorsa, büyük miktarda bilginin ağ üzerinden aktarılması nedeniyle açılma süresi daha da artacaktır.

Not: "OpenValue()" yöntemi yürütülürken, ilk olarak dizin öğesi nesnesi de elde edilir ve daha sonra bir form nesnesine dönüştürülerek istemciye iletilir (yönetilen formlar için). Yani bir öğe referans yoluyla açıldığında nesne de alınır.

Bir dizin öğesini dosya eklenmiş ve eklenmemiş olarak açmak ve yazmak için gereken süreye ilişkin son bir test yapalım. Sonuç aşağıdaki ekran görüntüsünde gösterilmektedir.

Doğal sonuç. Ekli dosya içeren bir dizin öğesini alma ve yazma süresinin ~19 kat daha uzun olduğu ortaya çıktı. Yukarıda belirtildiği gibi, bir nesne alınırken, 5 megabayt bilginin depolandığı "Veri" özelliği de dahil olmak üzere tüm ayrıntılarının değerleri elde edilir. Bir element yazıldığında yine bu miktardaki veri bilgi tabanına yazılır. Sonuç olarak, “Değer Deposu” türündeki bir dizin özelliğinde (veya belgede) veri depolamak, hem nesneyi alırken hem de onu bilgi tabanına yerleştirirken performansı olumsuz etkiler.

Bilgi tabanı nesneleri için veri depolama sorununu çözmenin en doğru yolu nedir?

Doğru çözüm

Bu mekanizmanın tipik konfigürasyonlardaki uygulamasına bakarsak, nesneler için ek bilgilerin ayrı bir bilgi kayıt tablosunda saklandığını göreceğiz. Bu, örneğin, "Ticaret Yönetimi" sürüm 11'in standart konfigürasyonunda ek dosya mekanizmasının nasıl göründüğüdür.

"Nomenclature" dizini "NomenclatureAttachedFiles" dizininin sahibidir. Bu da, EkliDosya boyutu onun öğesine atıfta bulunan Ekli Dosyalar bilgi kaydıyla ilişkilendirilir. Böylece, bilgi tabanı nesnelerine eklenen veriler aslında bilgi kayıt tablosunda depolanır ve bunun çalışması, kaynakta depolanan veri miktarından pratik olarak etkilenmez. "Ekli Dosyaların Adlandırılması" ara dizini, ekli dosya için ek bilgilerin saklanması ve ayrıca ekli dosyaya referans yoluyla erişimin desteklenmesi için gereklidir.

Yukarıdakilerin tümü, uygun şekilde tasarlanmış bir konfigürasyon meta veri yapısının muazzam performans etkisini bir kez daha doğrulamaktadır.

Makaleden bir örnekle yapılandırmayı test edin: BAĞLANTI .