Değerlerin veri tipi saklanması 1c 8.2. Değer deposu türündeki alanlarda veri depolama. Bir dosyayı geçici depolamadan kaldırma

  • 25.01.2021

1C: Enterprise 8'de, StoreValues ​​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, öncelikle çeşitli türlerdeki değerleri serileştirilmiş bir biçimde, yani verilerin yazılmasına ve ardından geri yüklenmesine izin veren bir biçimde depolamaya yöneliktir. Gömülü dil belgelerinde, nesnelerin açıklamasında serileştirme "Serializable" işaretiyle belirtilir. Bu değerler, primitif türlerin değerlerinin yanı sıra değer deposuna yerleştirilebilir ve böylece ValueStorage türü ile veritabanı alanlarına yazılabilir. Değer deposunun önemli bir özelliği, verileri sıkıştırılmış bir 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, ValueStorage türünün alanlarını kullanarak, alanlar için açıkça belirtilebilecek olandan çok daha geniş bir veri türü listesini veritabanında depolamak mümkündür. Ancak, bu tür verilerin bu şekilde depolanması ve işlenmesinin, veri tabanı alanlarındaki olağan veri depolamasından önemli ölçüde farklı olduğu akılda tutulmalıdır. Bu tür alanlar için sistem, gerçek yazma ve okuma dışında neredeyse hiçbir işlevi desteklemez. Bu tür alanlar için indeksleme kullanılamaz, sorgu ve seçimlerde veriler onlar tarafından sıralanamaz, bu alanlar toplanamaz vb. Bu durumda, veritabanı motorunun doğası hakkında hiçbir şey bilmeden bazı bilgileri depoladığı varsayılabilir.

Buna göre StorageValues ​​türündeki alanlar sadece amaçlarına ve teknolojik özelliklerine uygun olduğu durumlarda kullanılmalıdır.

ValueStore alanlarının ana kullanımlarından biri, görüntüleri ve dosya görüntülerini depolamaktır. Bunun için Picture ve BinaryData türleri kullanılır. Bu, çalışanların fotoğraflarını, çeşitli formatlarda oluşturulmuş belgeleri vb. veritabanına kaydetmenizi sağlar. Bu tür bilgilerin depolanmasını uygularken, bu alanların ana bilgilerden ayrı depolanmasını sağlayacak veri yapılarının oluşturulmasını önermek mümkündür. Örneğin, çalışanların fotoğraflarını depolamak için ayrı bir referans kitabı veya bilgi kaydı uygulayabilir ve StorageValues ​​türündeki alanları bireylerin listesini depolayan nesnelere koyamazsınız. Nesnelerin (örneğin dizin öğeleri) her zaman sistem tarafından bütünüyle okunduğu akılda tutulmalıdır. Bu nedenle, büyük miktarda bilgiyi doğrudan nesnelerin alanlarına depolamak, sistemi önemli ölçüde yavaşlatabilir.

ValueStorage türündeki alanlarda, örneğin değer ve yapı tablolarının saklanmasına izin verilir. Aynı zamanda, referans türleri de dahil olmak üzere herhangi bir veri türü, değer tablolarında ve yapılarında saklanabilir. Yalnızca serileştirilebilir değerler içeriyorsa, bir koleksiyonun ValueStore'a yerleştirilebileceğini unutmayın. Bununla birlikte, veri depolamak için bu seçeneğin, değerleri ayrı alanlarda açıkça depolamaktan ve tablo bölümlerinde veya bilgi kayıtlarında bilgi depolamaktan önemli ölçüde farklı olduğu unutulmamalıdır. Sistem, bu tür alanlar için referans bütünlüğünü desteklemeyecek, sorgularda veri alımı sağlamayacaktır, vb. Bu nedenle, bu tür alanlarda koleksiyonların depolanması, iş mantığından sorumlu uygulama çözümünün temel bölümlerini uygulamak için kullanılamaz. Bu tür depolamaya yalnızca, örneğin kullanıcı çalışması için herhangi bir ayarın depolanması gibi uygulama çözümünün iş mantığı için gerekli olmayan yardımcı veriler için izin verilebilir.

Sistem, StoreValues ​​türündeki alanlarda depolanan verilerin boyutunu açıkça sınırlamasa da, saklanan bilgi miktarı konusunda yine de dikkatli olmalısınız. Bu tür alanlara büyük hacimler yerleştirmenin bilgi tabanının toplam hacmini artıracağı ve bunun veritabanının yedek kopyasını oluşturmak gibi çeşitli idari işlemler yapılırken sistemin çalışmasını olumsuz etkileyeceği unutulmamalıdır. Örneğin, dosya görüntülerini depolarken, verilerin iş için gerçekten gerekli olan bu tür alanlarda saklanmasını, ancak çözülmekte olan uygulanan problemde kullanılmayan büyük hacimli dosyaları depolamak için kullanılmamasını önermek mümkündür.

Platform 1C: Kurumsal her türlü veriyi depolamak için birçok olanak sağlar.

Ancak çoğu zaman bu fırsatlar yeterli değildir. Ve sonra yardımımıza özel bir nesne gelir - Depolama Değerleri... Bu nesne, hem standart 1C: Enterprise nesnelerini, örneğin bir değerler tablosunu hem de türün platformda sağlanmadığı standart olmayanları özel bir biçimde saklamanıza izin verir. Dosyalar standart olmayan türler olarak sınıflandırılabilir. Örneğin, 1C veritabanındaki değer deposunu kullanarak çalışan fotoğraflarını, belge taramalarını, harici işlemleri vb. Buradaki avantaj, tüm bu nesnelerin veritabanının kendisinde saklanmasıdır. Buna göre, bir yedek kopyadan yeni bir veritabanı konuşlandırıldığında, tüm bu nesneler yeni veritabanında da mevcut olacaktır. Öte yandan, büyük dosyaları veritabanında saklarsanız, bu, boyutunu önemli ölçüde artırabilir ve performansını olumsuz etkileyebilir. Bu nedenle, burada makul bir denge sağlanmalıdır.

Bir örnek kullanarak değer deposuyla çalışmaya bakalım. Konfigüratörde özel bir dizin oluşturalım - buna diyelim HariciNesneler ve referans kitabı için sırayla bir sahne oluşturun Bir obje tipi ile Depolama Değerleri

Ve şimdi bu dizinde ve aksesuarlarda öğeler oluşturabiliriz. Bir obje her öğe bir dosya yazmak için.

Değer deposuyla çalışmak çok basittir. Sözdizimi yardımcısına bakarsak, bu nesnenin yalnızca bir yöntemi ve bir yapıcısı olduğunu görebiliriz.

Ve şimdi, gösteri için, dosyayı props'a yazacak en basit kodu yazacağız. Bir objeönceden oluşturulmuş katalog öğesi ve daha sonra bu dosyayı props'tan okuyun ve diske yazın, ancak farklı bir adla.

& OnServer Prosedürü LoadUploadFile (ReferenceElement) ReferenceObject = ReferenceElement. GetObject(); // Resmi değer deposuna yerleştirin LabelLoading = Yeni Resim ("g: \ musor \ favicon.ico") NewValueStore; // Öğeyi dizine yaz Dizin Nesnesi. Nesne ReferansNesnesi. Yazı yazmak (); // Görüntüyü değer deposundan bir dosyaya boşaltın DosyaAdı = "g: \ musor \ favicon_1.ico"; LabelDownload = DirectoryObject. Bir obje. Almak() ; Kısayol Yükle. Yaz (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.

Depodaki resimler dışındaki diğer dosya türlerini saklamak için nesneyi kullanabilirsiniz. Ikili veri... Teorik olarak, değer deposunda sözlük öğelerini, belgeleri vb. bile saklayabilirsiniz. Ama pratikte hiçbir anlamı yok. Ancak bazen bir değerler tablosunu, bir değerler ağacını ve diğer genel koleksiyonları depolamak için bir değer deposu kullanabilirsiniz.

Bilgileri ikili veri biçiminde depolanan "Veri" özelliğinde bir "Mallar" referans kitabımız var. Özniteliğin kendisi "ValueStore" değer türüne sahiptir. Aşağıdaki ekran görüntüsü, dizin meta veri yapısını gösterir.

Diskten bir öğe biçiminde rastgele bir dosya eklemek için "AttachFile" komutu uygulanır. Program kodu aşağıdaki listede gösterilmektedir:

& OnClient Prosedürü AttachFile (Komut) // İstemcideki komut işleyicisi. Dosya seçimi // Diskten dosya seçmek için diyalog Mod = FileSelectDialogueMode. Açılış; FileOpen Dialogue = Yeni FileSelectDialog (Mod); Dosya Aç İletişim Kutusu. FullFileName = ""; Dosya Aç İletişim Kutusu. MultipleChoice = Yanlış; Dosya Aç İletişim Kutusu. Başlık = "Dosyaları Seçin"; FileOpen Diyalog ise. () öğesini seçin, ardından Dosya Yolu = Dosya Açma İletişim Kutusu. TamDosyaAdı; // Dosyanın ikili verilerini alın BinaryData = Yeni BinaryData (FilePath); // İkili verileri sunucuya aktarın AttachFileServer (BinaryData); Aksi takdirde Metin = "ru = "" Dosya (ler) seçilmedi!" " ; tr ="" Dosya (ler) seçilmedi!"" "; Uyarı (HStr (Metin)); EndIf; EndProcedure & AtServer Prosedürü AttachFileServer (BinaryData) // IB'de bir dosya kaydetmek için sunucudaki işleyici // Form nesnesini bir referans nesnesine dönüştürün ObjectCurrent = Form AttributeValue ("Nesne"); // "Data" değişkenine yeni bir değer atayın Nesne Akımı. Veri = NewValueStore (BinaryData); // Değişiklikleri Kaydet Nesne Akımı. Yazı yazmak (); Prosedürün Sonu

Algoritmayı genel terimlerle açıklamak için, istemci önce diskten bir dosya seçer. Dosyanın alınan ikili verileri, bilgi tabanına, yani geçerli dizin öğesinin "Veri" niteliğine yazıldığı sunucuya gönderilir.

Prensip olarak, her şey çalışır. Bir elementi açarken bu verileri gerektiği gibi okuyabiliyoruz. Örneğin, gerekli bir görüntü kaydedilmişse, onu alabilir ve form alanında görüntüleyebiliriz. Böyle bir çözüm gerçekleşir, ancak çoğu görevde referans kitaplarında ve belgelerde "ValueStorage" değer tipine sahip bir özniteliğin kullanılması optimal değildir. Ve bu yüzden...

performans üzerindeki etkisi

Bazı performans testleri yapalım. Testler, ekli dosyalı ve dosyasız "Ürünler" kataloğunun iki öğesini kullanacaktır. Ekli dosyanın boyutu 5 megabayttır.

Tüm testler, test yapılandırmasında GetItem işleme kullanılarak gerçekleştirilir. Bu yapılandırmayı makalenin sonundaki bağlantıyı kullanarak indirebilirsiniz.

"Mallar" kataloğunun öğelerinin açılma zamanını ölçelim. Bir öğeyi açmak için, öğeye bir başvurunun iletildiği bir parametre olarak global bağlamın "OpenValue ()" yöntemi kullanılır. Standart performans ölçüm amacını kullanarak açılış süresini ölçelim. Sonuçlar aşağıdaki ekran görüntüsünde gösterilmektedir:

Görüldüğü gibi dosya ekli bir elemanın açılma süresi 10 kat daha uzundur! Başka bir test yapalım. Katalogdaki öğeye bağlanmak için "GetObject()" yöntemini uygulayalım. Test sonucunu aşağıdaki ekran görüntüsünde görebilirsiniz.

Fark önemlidir. Ekli dosya olmadan bir öğeyi almak 194 kat daha hızlı çalışır!

Bunun nedeni, "GetObject()" yönteminin sözlük öğesinin özniteliklerinden tüm verileri başvuru yoluyla almasıdır. Buna göre yöntem, yalnızca "Kod" ve "Ad" özniteliklerinin değerlerini değil, aynı zamanda "Veri" değişkeninin değerini de alır. Eğer 5 megabaytlık ikili veriyi (bizim örneğimizde olduğu gibi) depoluyorsa, o zaman nesne alındığında bu veri RAM'e (diğer detaylar gibi) yerleştirilir ve daha sonra istemci tarafına aktarılır. item nesnesini almak için gereken süreyi artıran, bu aksesuarlardan veri alınmasıdır. İnce bir iletişim kanalı kullanılırsa, büyük miktarda bilginin ağ üzerinden aktarılması nedeniyle açılış süresi daha da artacaktır.

Not: "OpenValue ()" yöntemini çalıştırırken, önce katalog öğesinin nesnesi de alınır ve ardından bir form nesnesine dönüştürülür ve istemciye iletilir (yönetilen formlar için). Yani, bir öğeyi referans olarak açtığınızda, nesne de alınır.

Ekli bir dosya olan ve olmayan bir dizin öğesini açma ve yazma zamanı için son testi çalıştıralım. Sonuç aşağıdaki ekran görüntüsünde gösterilmiştir.

Mantıklı bir sonuç. Ekli dosyaya sahip dizin öğesinin alınma süresi ve ardından kaydın ~ 19 kat daha uzun olduğu ortaya çıktı. Yukarıda bahsedildiği gibi, bir nesne alındığında, 5 megabaytlık bilginin depolandığı "Veri" özniteliği de dahil olmak üzere tüm özniteliklerinin değerleri elde edilir. Bir eleman yazıldığında, bu miktarda veri tekrar infobase'e kaydedilir. Sonuç olarak, verileri "ValueStorage" türünde bir referans (veya belge) özniteliğinde depolamak, hem bir nesne alındığında hem de bir bilgi tabanına yerleştirildiğinde performansı olumsuz etkiler.

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

Doğru çözüm

Bu mekanizmanın tipik konfigürasyonlarda uygulanmasına bakarsak, nesneler için ek bilgilerin bilgi kaydının ayrı bir tablosunda saklandığını göreceğiz. Örneğin, standart konfigürasyonda ve "Ticaret Yönetimi" sürüm 11'de ekli dosyaların mekanizması böyle görünür.

Nomenclature dizini, NomenclatureAttachedFiles dizininin sahibidir. Bu da, boyutu "AttachedFile"ın üyesine atıfta bulunduğu "AttachedFiles" bilgi kayıtları ile ilişkilidir. Böylece, bilgi tabanı nesnelerine eklenen veriler, çalışması kaynakta depolanan veri nesnelerinden pratik olarak etkilenmeyen bilgi kayıt tablosunda depolanır. "NomenclatureAttachedFiles" ara referansı, ekli dosya için ek bilgi depolamak ve ayrıca ekli dosyaya referans yoluyla erişimi desteklemek için gereklidir.

Yukarıdakilerin tümü, uygun şekilde tasarlanmış bir yapılandırma meta veri yapısının performans üzerindeki büyük etkisini bir kez daha doğrulamaktadır.

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

Değer deposunda hemen hemen her bilgi saklanabilir, örneğin,

... resimler (fotoğraflar):

TekImage.Object = SprFabric.Link; TekImage.DataType = Enumerations.AdditionalInformationTypesObjects.Image; Depolama = Yeni Depolama Değeri (Yeni Resim, Yeni Veri Sıkıştırma ()); TekImage.Storage = Storage.Get();

// bu yerde her şeyi görüntüler ... Form Elements.PictureField1.Picture = Storage.Get (); TekImage.Write();

... elektronik tablo belgesi:

TabDoc = Yeni Tablo Belgesi; TabDoc.Output (Form Elements.TableDocumentField1); Depolama = Değerlerin Yeni Depolanması (TabDoc); Yazı yazmak ();

Prosedürün Sonu

Prosedür Depolama Presinden Geri Yükleme (Öğe)

TabDoc = Storage.Get(); TabDoc ise<>Tanımsız Sonra FormElements.TableDocumentField1.Output (TabDoc); EndIf;

Prosedürün Sonu

... isteğe bağlı dosyalar (ikili veriler):

HZ = NewValueStore (Yeni BinaryData (dosya));

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

HZ = NewValueStore (Yeni BinaryData (dosya), NewData Sıkıştırma (9));

... harici işleme ve raporlama:

Yordam LoadProcessingDepolamada (Props StorageType)

Sıkıştırma Derecesi = Yeni Veri Sıkıştırma (9); // 9 maksimum PropsStorageType = NewValueStore (Yeni BinaryData ("c: \ raporlar \ rapor.epf", Sıkıştırma Derecesi));

Prosedürün Sonu

Prosedür StartProcessingFrom Storage (Props StorageType)

TempFileName = TempFileDir () + "report.epf"; BinaryData = PropsTypeStorage.Get (); BinaryData.Write (GeçiciDosyaAdı); ExternalProcessing = ExternalProcessing.Create (TemporaryFileName); ExternalProcessing.GetForm().Aç();

Prosedürün Sonu

Depolama ile çalışma

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

TypeZnch (Depolama) ise<>("BinaryData") yazın ve ardından

BinaryData = Storage.Get();

BinaryData = Depolama;

EndIf; BinaryData.Write (DosyaAdı);

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

Uygulamayı Çalıştırın (DosyaAdı);

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

Eşya Deposu = Tanımsız;

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

Randevu

Yönetilen uygulama, dosyalarla çalışmak için yeni bir mekanizmaya sahiptir. Bilgi tabanı ve istemci uygulaması arasında dosya alışverişini sağlar. Bu mekanizmanın özelliği, ince bir istemcide ve bir Web istemcisinde kullanıma odaklanması ve web tarayıcıları tarafından getirilen dosyalarla çalışma kısıtlamaları dikkate alınarak tasarlanmasıdır.

Mekanizma, kullanıcıda yerel olarak depolanan verileri bilgi tabanının geçici deposuna koymak, 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 görevleri, örneğin malların resimleri, sözleşmelerle ilgili belgeler vb. gibi eşlik eden bilgilerin saklanmasıdır.

Yöntem kapsamı

Geçici depolama

Geçici depolama, ikili verilerin depolanabileceği özel bir bilgi tabanı alanıdır. Temel amaç, istemci-sunucu etkileşimi sırasında veri tabanına aktarılana kadar bilgilerin geçici olarak depolanmasıdır.

Geçici depolama ihtiyacı, web tarayıcısının modelinde, kullanıcı tarafından seçilen dosyanın istemcide saklanma olasılığı olmadan doğrudan sunucuya aktarılması gerektiği gerçeğinden kaynaklanmaktadır. Bir dosya aktarılırken geçici depoya alınır ve ancak o zaman veritabanına bir nesne yazılırken kullanılabilir.

Geçici depolama ile çözülen en tipik uygulama sorunu, örneğin bir öğe biçiminde nesne bilgi tabanına yazılmadan önce dosyalara veya resimlere erişim sağlamaktır.

Depoya yerleştirilen bir dosya veya ikili veri, daha sonra yazma, okuma veya silme işlemlerinde kullanılabilecek benzersiz bir adresle tanımlanır. Bu adres, dosyayı geçici depolamaya yazma yöntemleri ile verilir. Yerleşik dilde 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, ValueStore türünün özniteliklerinde depolanan ikili verilere erişime izin verir.

Geçici saklama durumunda olduğu gibi özel bir adres üzerinden bilgiye ulaşılabilir. Bir nesneye veya bir bilgi kaydı kayıt anahtarına ve bir props adına bir referans ileterek özel bir yöntemle elde edebilirsiniz. Bir tablo bölümü olması durumunda, ek olarak tablo bölümünün satır indeksinin aktarılması gerekir.

Bilgi bankası ayrıntılarıyla çalışırken dosyalarla çalışma yöntemlerinin bir sınırlaması vardır. Onlar için, geçici depolamadan farklı olarak, yalnızca okuma bilgisi mevcuttur, ancak yazma veya silme işlemi yapılamaz.

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

Verileri geçici depolamaya kaydetme

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

İlk yöntem, PlaceFile(), yerel dosya sisteminden bir dosyayı geçici depolamaya yerleştirir. Yöntem, mağazadaki hedef adresi alabilir. 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 True ise, yöntem, depoya yerleştirilecek bir dosya seçebileceğiniz standart bir dosya seçimi iletişim kutusu görüntüler. Bu durumda, yöntem seçilen dosyanın adresini de döndürür.

Sonuç olarak, kullanıcı dosya seçimi iletişim kutusunda 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, PlaceFileTemporaryStorage (), sunucuda mevcut olması ve geçici depolamaya yazılacak verilerin dosya sisteminde bir yol olarak değil, BinaryData değişkeni olarak gösterilmesi dışında bir öncekine benzer. . Aynı şekilde, hedef adres belirtilmemişse, depoda yeni bir dosya oluşturulur. Adresi, işlevin bir sonucu olarak döndürülür.

Geçici depolamadan bir dosya alma

Bir bilgi tabanına bir nesne yazarken, geçici bir depodan veri çıkarmanız ve örneğin bir sahne içine yerleştirmeniz gerekebilir. Buna karşılık gelen bir sunucu yöntemi var - GetFileFrom TemporaryStorage (). Bu yöntem, verileri geçici depolamadan alır ve sonuç olarak döndürür. Bunu yapmak için, adresi geçici depolamada belirtmelisiniz. Bu adres, başarılı olmaları durumunda yukarıdaki PlaceFile() ve PlaceFileTemporaryStorage() yöntemleri tarafından döndürülür.

Bir dosyayı geçici depolamadan kaldırma

Veriler aksesuarlara kaydedildikten sonra geçici depolamadaki dosya silinebilir. Bunu yapmak için dosyayı geçici depodan kaldıran DeleteFileFromTemporaryStorage () yöntemi vardır. Yöntem, parametrede geçici depolamadaki dosyanın adresini alır. Sunucuda mevcuttur.

Geçici depolamaya ait adresin kontrol edilmesi

Dosya adresi hem geçici bir depoya hem de bir bilgi tabanı değişkenine işaret edebilir. Türünü kontrol etmek için ThisTemporaryStorageAddress() yöntemi vardır.

Geçirilen adresin mağazaya işaret eden bir adres olduğunu doğrular. Adres geçici depolamaya işaret ediyorsa True döndürür. Yöntem sunucuda mevcuttur.

Bir sahne adresi alma

Veriler bilgi tabanındaki aksesuarlara yerleştirildikten sonra, dosya yöntemlerini kullanarak ona erişmeniz gerekebilir.

Ancak, örneğin bir props'tan veri almadan önce, bu props'un adresini almanız gerekir. Bunu yapmak için GetFileAddressVinformationBase () 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, bir nesneye referans olabilir veya bir bilgi kayıt kaydı için bir anahtar olabilir) ve özniteliğin adını iletmeniz gerekir. Tablo bölümünün özniteliğinde saklanan dosyanın adresini almanız gerekiyorsa, özniteliğin adını belirten parametrede öznitelik adından önce, tablo bölümünün adını ve "." noktasını eklemelisiniz. Yöntem hem istemcide hem de sunucuda kullanılabilir.

Bir 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, aksesuarlardaki veya geçici dosya deposundaki dosyanın adresini tanımlar. İ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 olarak yürütülür, yani son parametre True'dur. Bu, sonuçta ortaya çıkan dosyayla bir eylem belirtebileceğiniz bir iletişim kutusunun görüntülendiği anlamına gelir: çalıştırın veya kullanıcı tarafından belirtilen bir konuma kaydedin. Etkileşimli mod etkinse ve hedef dosya yolu on disk parametresi belirtilmemişse, dosya açma işlemi kullanılamaz. Bir boole değeri döndürür. Yanlış, kullanıcının çevrimiçi kaydetme iletişim kutusunda işlemi iptal etmeyi seçtiği anlamına gelir.

Dosya yöntemlerini kullanma örneği

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

Değişken SelectedName; Geçici Depolamanın Değişken Adresi; PutFile (GeçiciStorage Adresi, SelectedName, True) ise Object.FileName = SelectedName; PlaceObjectFile (GeçiciStorageAdresi); EndIf;

Prosedürün Sonu

// Geçici depodan dizinin // props'larına bir dosya kopyalama, bir nesne kaydetme, geçici // depolama ve OnServer'dan bir dosya silme Prosedür PlaceObjectObjectFile (GeçiciStorage Adresi)

DirectoryElement = FormInValue ("Nesne"); BinaryData = GetFileFrom TemporaryStorage (GeçiciStorage Adresi); DirectoryElement.FileData = NewValueStore (BinaryData); FileDiskPath = Yeni Dosya (DirectoryElement.FileName); DirectoryElement.FileName = FilePathNaDisk.Name; DirectoryElement.Write(); Değişiklik = Yanlış; DeleteFileFrom Geçici Depolama (Geçici Depolama Adresi); ValueVFormAttribute (DirectoryElement, "Object");

Prosedürün Sonu

// Sahne donanımlarından bir dosya okuma ve kaydetme // etkileşimli modda yerel diske & İstemci Prosedüründe ReadFile AND Save OnDisk ()

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

Prosedürün Sonu

Resim alanındaki adresler için destek

Görüntü Alanı denetimi, geçici depolamada veya bir veritabanında dosya adresiyle belirtilen bir görüntünün görüntülenmesini destekler.

Bunu yapmak için, form öğesinin Veri özelliğinde bir dize türü özniteliği belirtmelisiniz. Bu değişkenin değeri resmin adresi olarak yorumlanacaktır.

Örnek // Görüntü alanını geçici // depolamadaki görüntü adresine bağlama. Dize türünün AddressPictures form özniteliği

PlaceFile (ResimAdresi, Doğru)

Image.Data = ResimAdresi

Web istemcisiyle çalışırken kısıtlamalar

Web istemcisini kullanırken açıklanan mekanizmanın çalışması bazı sınırlamalara sahiptir. Bu kısıtlamalar, tarayıcı güvenlik modelinin özellikleriyle ilgilidir. Bu nedenle, örneğin, istemci bir dosyayı yerel dosya sistemine kendi başına 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 modda görüntülenen iletişim kutuları, belirli bir tarayıcı türüne özgüdür.

İstemcideki Değerler Mağazası ile çalışırken özellikler

Sorun:

Bir Belge, tablo bölümünde ValueStorage türünde bir özniteliğe sahip olduğunda, bu öznitelik büyük veri içeriyorsa, belge formunun açılmasını yavaşlatır.

Tahmini sebep:

Belki de form açıldığında, müşteri Values ​​Store'da depolanan verilere değil, verilerin kendisine bir bağlantı alır.

Çözüm

  • Formun tablo özniteliğinin özelliklerinde "Her zaman kullan" bayrağı vardır. Ayarlanırsa, alanın içeriği her zaman sunucu ve istemci arasında iletilir - örneğin, bir form açılırken. Bu bayrak devre dışı bırakılmalıdır, ancak kodda bunu dikkate almalısınız, çünkü varsayılan olarak bu alanın değeri istemcide görüntülenmeyecektir. 1C: Arşiv'de bir örnek bulunabilir.

Daha da iyisi, kullanın geçici depolama istemci ve sunucu arasında dosya aktarmak için.