Odbierz dane z magazynu wartości 1s 8.3. Ograniczenia podczas pracy z klientem internetowym

Prawie każda informacja może być przechowywana w magazynie wartości, np.

... zdjęcia (zdjęcia):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Wyliczenia.Typy dodatkowych informacji o obiektach.Image; Magazyn = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// w tym miejscu wyświetla wszystko... Form Elements.PictureField1.Picture = Storage.Get(); Bieżący Obraz. Zapis();

...dokument arkusza kalkulacyjnego:

TabDoc=Nowy dokument tabelaryczny; TabDoc.Output(FormElements.TabularDocumentField1); Magazyn=NowaWartośćStorage(TabDoc); Pisać();

Koniec procedury

Procedura RestoreFromStoragePress(Element)

TabDoc=Storage.Get(); Jeśli TabDoc<>Niezdefiniowany NastępnieFormElements.TabularDocumentField1.Output(TabDoc); koniecJeśli;

Koniec procedury

...dowolne pliki (dane binarne):

XZ = NewValueStorage(NewBinaryData(plik));

Osiem obsługuje kompresję danych umieszczonych w pamięci:

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

... przetwarzanie zewnętrzne i raportowanie:

Procedura LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 maksymalnie PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", współczynnik kompresji));

Koniec procedury

Procedura StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(NazwaPliku Tymczasowego); Przetwarzanie zewnętrzne = Przetwarzanie zewnętrzne.Create(TemporaryFileName); Przetwarzanie zewnętrzne.GetForm().Open();

Koniec procedury

Praca z magazynem

Jeżeli były to dane binarne, to można je odtworzyć z magazynu wartości metodą Get i zapisać do pliku metodą Write().

Jeśli TypWartość (Pamięć)<>Type("BinaryData") Następnie

BinaryData = Storage.Get();

BinaryData = Pamięć;

koniecJeśli; BinaryData.Write(NazwaPliku);

Jeśli był to na przykład dokument Word (plik doc lub inny zarejestrowany typ pliku), to można go otworzyć w następujący sposób:

UruchomAplikację(NazwaPliku);

Aby wyczyścić pole typu Przechowywanie wartości, należy przypisać mu Niezdefiniowane:

PropsStorage = Niezdefiniowane;

Praca z plikami i obrazami w wbudowanym języku 1C:Enterprise 8

Zamiar

Zarządzana aplikacja implementuje nowy mechanizm pracy z plikami. Zapewnia wymianę plików pomiędzy bazą danych a aplikacją kliencką. Osobliwością tego mechanizmu jest to, że jest on przeznaczony do użytku w cienkim kliencie i kliencie internetowym i został zaprojektowany z uwzględnieniem ograniczeń w pracy z plikami nałożonych przez przeglądarki internetowe.

Mechanizm to zbiór metod, za pomocą których można umieścić dane przechowywane lokalnie na komputerze użytkownika w tymczasowym magazynie bazy informacji, przenieść te informacje z tymczasowego magazynu do bazy danych i otrzymać je z powrotem do komputera użytkownika. Najczęstsze problemy aplikacyjne rozwiązywane przez ten mechanizm to przechowywanie informacji towarzyszących, np. zdjęć towarów, dokumentów związanych z umowami itp.

Zakres metody

Magazynowanie tymczasowe

Magazyn tymczasowy to wyspecjalizowany obszar bazy informacji, w którym mogą być umieszczone dane binarne. Głównym celem jest tymczasowe przechowywanie informacji podczas interakcji klient-serwer, zanim zostaną one przesłane do bazy danych.

Konieczność przechowywania tymczasowego wynika z tego, że model działania przeglądarki internetowej wymaga, aby wybrany przez użytkownika plik został przesłany bezpośrednio na serwer bez możliwości przechowywania go na kliencie. Po przesłaniu pliku jest on umieszczany w magazynie tymczasowym i można go następnie wykorzystać podczas zapisywania obiektu w bazie danych.

Najbardziej typowym zadaniem aplikacji rozwiązywanym przez tymczasowe przechowywanie jest udostępnienie plików lub zdjęć zanim obiekt zostanie zapisany w bazie informacji, np. w postaci elementu.

Plik lub dane binarne umieszczone w pamięci są identyfikowane poprzez unikalny adres, który może być później użyty do operacji zapisu, odczytu lub usuwania. Adres ten nadawany jest metodami zapisu pliku do pamięci tymczasowej. Odrębna metoda w języku wbudowanym pozwala określić, czy przekazany adres jest adresem wskazującym na dane znajdujące się w magazynie tymczasowym.

Baza informacyjna

Mechanizm umożliwia dostęp do danych binarnych przechowywanych w atrybutach typu Value Storage.

Podobnie jak w przypadku tymczasowego przechowywania, dostęp do informacji możliwy jest poprzez specjalny adres. Można to uzyskać specjalną metodą, przekazując odnośnik do obiektu lub klucz wpisu do rejestru informacyjnego oraz nazwę atrybutu. W przypadku części tabelarycznej wymagane jest dodatkowo przeniesienie indeksu wiersza części tabelarycznej.

Metody pracy z plikami mają ograniczenia podczas pracy ze szczegółami bazy danych. Dla nich, w przeciwieństwie do magazynu tymczasowego, dostępne jest jedynie odczytywanie informacji, ale nie ich zapisywanie ani usuwanie.

Opis metod pracy z plikami

Zapisywanie danych w pamięci tymczasowej

Najbardziej typowy scenariusz wykorzystania tego mechanizmu polega na początkowym umieszczeniu danych użytkownika w magazynie tymczasowym. Można to zrobić na dwie metody: PlaceFile() i PlaceFileInTemporaryStorage().

Pierwsza metoda, PlaceFile(), umieszcza plik z lokalnego systemu plików w magazynie tymczasowym. Metoda może akceptować adres docelowy w pamięci. Jeśli nie jest zdefiniowany lub jest pustym ciągiem znaków, wówczas zostanie utworzony nowy plik, a metoda zwróci jego adres poprzez odpowiedni parametr.

Jeżeli parametr określający interaktywny tryb działania ma wartość True, to metoda wyświetli standardowe okno dialogowe wyboru pliku, w którym można wybrać plik do umieszczenia w pamięci. W tym przypadku metoda zwróci także adres wybranego pliku.

W rezultacie metoda zwraca False, jeśli użytkownik interaktywnie odmówił wykonania operacji w oknie dialogowym wyboru pliku. Metoda jest dostępna tylko na kliencie.

Druga metoda, PlaceFileInTemporaryStorage(), jest podobna do poprzedniej, z tą różnicą, że jest dostępna na serwerze, a dane, które mają zostać zapisane w pamięci tymczasowej, są reprezentowane nie jako ścieżka w systemie plików, ale jako zmienna typu Dane binarne. Podobnie, jeśli nie określono adresu docelowego, w pamięci zostanie utworzony nowy plik. W wyniku działania funkcji zwracany jest jego adres.

Pobieranie pliku z magazynu tymczasowego

Podczas zapisywania obiektu do bazy danych może zaistnieć potrzeba wyodrębnienia danych z magazynu tymczasowego i umieszczenia ich na przykład w atrybucie. Istnieje do tego odpowiednia metoda serwera - GetFileFromTemporaryStorage(). Ta metoda pobiera dane z magazynu tymczasowego i w rezultacie je zwraca. Aby to zrobić, musisz podać adres w pamięci tymczasowej. Adres ten jest zwracany przez opisane powyżej metody PlaceFile() i PlaceFileInTemporaryStorage(), jeśli zostaną pomyślnie wykonane.

Usuwanie pliku z magazynu tymczasowego

Po zapisaniu danych w szczegółach, plik w pamięci tymczasowej można usunąć. W tym celu istnieje metoda DeleteFileFromTemporaryStorage(), która usuwa plik z magazynu tymczasowego. Metoda przyjmuje jako parametr adres pliku w pamięci tymczasowej. Dostępne na serwerze.

Sprawdzanie adresu tymczasowego przechowywania

Adres pliku może wskazywać zarówno tymczasowe przechowywanie, jak i szczegóły w bazie danych. Aby sprawdzić jego typ, istnieje metoda This isTemporaryStorageAddress().

Sprawdza, czy przekazany adres jest adresem wskazującym na sklep. Zwraca True, jeśli adres wskazuje na pamięć tymczasową. Metoda jest dostępna na serwerze.

Otrzymanie adresu rekwizytów

Po umieszczeniu danych w szczegółach w bazie danych może zaistnieć potrzeba uzyskania dostępu do nich za pomocą metod plikowych.

Zanim jednak otrzymasz dane np. z nieruchomości, musisz poznać adres tej nieruchomości. W tym celu istnieje metoda GetFileAddressInInformationBase().

Jego celem jest zwrócenie adresu pliku w bazie danych zgodnie z oryginalnymi parametrami. W tym celu należy przekazać klucz obiektu (może to być link do obiektu lub klucz wpisu do rejestru informacyjnego) oraz nazwę atrybutu. Jeżeli chcemy uzyskać adres pliku zapisanego w atrybucie części tabelarycznej, to przed nazwą atrybutu w parametrze określającym nazwę atrybutu należy dodać nazwę części tabelarycznej oraz kropkę „.”. Metoda jest dostępna zarówno na kliencie, jak i na serwerze.

Pobieranie pliku z bazy danych

Metoda GetFile() pobiera plik z bazy danych i zapisuje go w lokalnym systemie plików użytkownika. Pierwszy parametr określa adres pliku w rekwizytach lub tymczasowym magazynie plików. Drugi parametr określa lokalizację docelową pliku wynikowego. W trybie nieinteraktywnym należy określić ścieżkę. W trybie interaktywnym parametr jest opcjonalny.

Domyślnie metoda wykonywana jest w trybie interaktywnym, czyli ostatni parametr ma wartość True. Oznacza to, że wyświetli się okno dialogowe, w którym możesz określić akcję na odebranym pliku: uruchomić go lub zapisać w lokalizacji określonej przez użytkownika. Jeśli tryb interaktywny jest aktywny i nie określono parametru Ścieżka pliku na dysku docelowym, operacja otwarcia pliku nie jest dostępna. Zwraca wartość logiczną. Fałsz oznacza, że ​​użytkownik zdecydował się anulować operację w interaktywnym oknie dialogowym zapisywania pliku.

Przykład użycia metod plikowych

// Odbiór pliku z dysku w trybie interaktywnym // i umieszczenie go w magazynie tymczasowym &Na kliencie Procedura SelectDiskFileAndWrite()

Zmienna wybrana nazwa; ZmiennyTemporaryStorageAdres; Jeśli PutFile(TemporaryStorageAddress, SelectedName, True) then Object.FileName = SelectedName; PlaceObjectFile (TemporaryStorageAddress); koniecJeśli;

Koniec procedury

// Kopiowanie pliku z magazynu tymczasowego do // atrybutu katalogu, zapisanie obiektu, usunięcie pliku z // magazynu tymczasowego &Na serwerze Procedura Umieść plik obiektu (adres magazynu tymczasowego)

Element katalogu = Form AttributesValue("Obiekt"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Element katalogu. Dane pliku = NewValueStorage(BinaryData); FilePathOnDisk = Nowy plik (DirectoryItem.FileName); Element katalogu.FileName = FilePathOnDisk.Name; Element katalogu.Write(); Zmodyfikowano = Fałsz; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); Value – FormAttributes (Element katalogu, „Obiekt”);

Koniec procedury

// Odczytanie pliku z właściwości i zapisanie go // na dysku lokalnym w trybie interaktywnym &Na kliencie Procedura ReadFileAndSaveToDisk()

Adres = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Adres, Obiekt.NazwaPliku, Prawda);

Koniec procedury

Obsługa adresów w polu obrazu

Kontrolka Pole obrazu obsługuje wyświetlanie obrazu określonego przez adres pliku w pamięci tymczasowej lub w bazie danych.

W tym celu należy ustawić atrybut typu string we właściwości Data elementu formularza. Wartość tego atrybutu będzie interpretowana jako adres obrazka.

Przykład // Wiązanie pola obrazu z adresem obrazu w // tymczasowym magazynie. AdresPictures formularza szczegóły typu string

PlaceFile (adres obrazu, prawda)

Picture.Data = AdresZdjęcia

Ograniczenia podczas pracy z klientem internetowym

Działanie opisywanego mechanizmu podczas korzystania z klienta WWW ma pewne ograniczenia. Ograniczenia te są związane z modelem bezpieczeństwa przeglądarki. Na przykład klient nie może samodzielnie zapisać pliku w lokalnym systemie plików, to znaczy dostępna jest tylko interaktywna wersja metod klienta PlaceFile() i GetFile(). Podczas próby użycia trybu nieinteraktywnego zgłaszany jest wyjątek. Okna dialogowe wyświetlane interaktywnie zależą od typu przeglądarki.

Funkcje podczas pracy z Value Storage na kliencie

Problem:

Gdy Dokument ma w sekcji tabelarycznej atrybut typu Przechowywanie wartości, powoduje to spowolnienie otwierania formularza dokumentu, jeśli ten atrybut zawiera duże dane.

Domniemany powód:

Być może podczas otwierania formularza do klienta nie wysyłany jest link do danych znajdujących się w Value Store, ale same dane.

Rozwiązanie

  • We właściwościach atrybutu tabeli formularza znajduje się flaga "Zawsze używaj". Jeśli jest ustawiona, zawartość pola jest zawsze przesyłana pomiędzy serwerem a klientem - np. podczas otwierania formularza. Ta flaga musi być wyłączona, ale należy to wziąć pod uwagę w kodzie, ponieważ domyślnie na kliencie nie będzie wartości tego pola. Przykład można znaleźć w 1C:Archive.

Jeszcze lepiej jest używać tymczasowe przechowywanie do przesyłania plików pomiędzy klientem a serwerem.

Mamy katalog „Produkty”, w atrybucie „Dane”, w którym przechowywane są informacje w postaci danych binarnych. Sam atrybut ma typ wartości „Przechowywanie wartości”. Poniższy zrzut ekranu przedstawia strukturę metadanych katalogu.

Aby załączyć dowolny plik z dysku w postaci elementu, zaimplementowano polecenie „AttachFile”. Kod jego programu przedstawiono na poniższym zestawieniu:

& Na procedurze klienta DołączPlik(polecenie) // Procedura obsługi poleceń na kliencie. Wybór pliku // Okno wyboru pliku z dysku Tryb = FileSelectionDialogMode. Otwarcie; OpenFileDialog = NewFileSelectDialog(Tryb); Okno dialogowe Otwórz plik. PełnaNazwaPliku = " " ; Okno dialogowe Otwórz plik. MultipleSelect = Fałsz; Okno dialogowe Otwórz plik. Title = "Wybierz pliki"; Jeśli FileOpenDialog. Wybierz(), a następnie FilePath = FileOpenDialog. Pełna nazwa pliku; // Odbierz dane pliku binarnego BinaryData = nowe BinaryData(PathToFile) ; // Prześlij dane binarne na serwer DołączSerwerPlików(DaneBinarylne) ; W przeciwnym razie Text = "ru = " " Plik (y) nie wybrane!" " ; pl =" " Plik (y) nie wybrane!" " " ; Warning(NStr(Text) ); EndIf ; EndProcedure i procedura OnServer DołączFileServer(BinaryData) // Procedura obsługi na serwerze zapisu pliku w bezpieczeństwie informacji // Przekształć obiekt formularza w obiekt referencyjny ObjectCurrent = FormAttributesValue("Obiekt" ) ; // Przypisz nową wartość do atrybutu „Dane”. ObiektCurrent. Dane = NewValueStorage(BinaryData) ; // Zapisz zmiany ObiektCurrent. Pisać() ; Koniec procedury

Jeśli opiszemy algorytm w sposób ogólny, to najpierw wybierany jest plik z dysku klienta. Powstałe dane w pliku binarnym przesyłane są na serwer, gdzie zostają zapisane w bazie informacji, czyli w atrybucie „Dane” bieżącego elementu katalogu.

W zasadzie wszystko działa. Otwierając element, możemy w razie potrzeby odczytać te dane. Jeżeli w atrybucie zapisany jest np. obrazek to możemy go pobrać i wyświetlić w polu formularza. To rozwiązanie ma swoje miejsce, ale w większości zadań nie jest optymalne używanie atrybutów o typie wartości „Przechowywanie wartości” w katalogach i dokumentach. I własnie dlatego...

Wpływ na wydajność

Przeprowadźmy kilka testów wydajności. W testach zostaną wykorzystane dwa elementy katalogu „Produkty”, z załączonym plikiem i bez niego. Rozmiar załączonego pliku wynosi 5 megabajtów.

Wszystkie testy wykonywane są z wykorzystaniem przetwarzania „GetElement” w konfiguracji testowej. Konfigurację tę możesz pobrać z linku na końcu artykułu.

Zmierzmy czas potrzebny na otwarcie pozycji w katalogu „Produkty”. Aby otworzyć element, używana jest metoda kontekstu globalnego „OpenValue()”, która jako parametr przekazuje referencję do elementu. Zmierzmy czas otwarcia za pomocą standardowego narzędzia do pomiaru wydajności. Wyniki przedstawiono na poniższym zrzucie ekranu:

Jak widać czas otwarcia elementu z załączonym plikiem jest 10 razy dłuższy! Zróbmy kolejny test. Wykonajmy metodę „GetObject()”, aby odwołać się do elementu katalogu produktów. Wynik testu możesz zobaczyć na poniższym zrzucie ekranu.

Różnica jest dość znacząca. Otrzymanie elementu bez załączonego pliku jest 194 razy szybsze!

Dzieje się tak, ponieważ metoda „GetObject()” otrzymuje wszystkie dane ze szczegółów elementu katalogu poprzez referencję. W związku z tym metoda otrzymuje wartości nie tylko atrybutów „Kod” i „Nazwa”, ale także wartość atrybutu „Dane”. Jeśli przechowuje dane binarne o wielkości 5 megabajtów (jak w naszym przykładzie), to po odebraniu obiektu dane te są umieszczane w pamięci RAM (podobnie jak inne szczegóły) i następnie przesyłane po stronie klienta. To właśnie otrzymanie danych z tego atrybutu wydłuża czas uzyskania obiektu elementu. Jeśli zostanie zastosowany cienki kanał komunikacyjny, czas otwarcia wzrośnie jeszcze bardziej ze względu na przesyłanie dużej ilości informacji przez sieć.

Uwaga: podczas wykonywania metody „OpenValue()” najpierw pobierany jest również obiekt elementu katalogu, który następnie przekształcany jest w obiekt formularza i przekazywany klientowi (w przypadku formularzy zarządzanych). Oznacza to, że gdy element jest otwierany przez odwołanie, obiekt również jest pobierany.

Przeprowadźmy ostateczny test czasu potrzebnego na otwarcie i zapisanie elementu katalogu z załączonym plikiem i bez niego. Wynik pokazano na poniższym zrzucie ekranu.

Naturalny wynik. Czas otrzymania, a następnie zapisania elementu katalogu z załączonym plikiem okazał się ~19 razy dłuższy. Jak wspomniano powyżej, podczas odbierania obiektu pobierane są wartości wszystkich jego szczegółów, w tym atrybutu „Dane”, w którym przechowywanych jest 5 megabajtów informacji. Kiedy element jest zapisywany, ta ilość danych jest ponownie zapisywana w bazie danych. W rezultacie przechowywanie danych w atrybucie katalogu (lub dokumencie) typu „Przechowywanie wartości” negatywnie wpływa na wydajność zarówno podczas pobierania obiektu, jak i podczas umieszczania go w bazie danych.

Jaki jest najwłaściwszy sposób rozwiązania problemu przechowywania danych dla obiektów bazy informacyjnej?

Prawidłowe rozwiązanie

Jeśli przyjrzymy się realizacji tego mechanizmu w typowych konfiguracjach, zobaczymy, że dla obiektów dodatkowe informacje przechowywane są w osobnej tabeli rejestru informacyjnego. Tak wygląda np. mechanizm pliku załączników w standardowej konfiguracji „Trade Management” w wersji 11.

Katalog „Nomenclature” jest właścicielem katalogu „NomenclatureAttachedFiles”. Ten z kolei jest powiązany z rejestrem informacyjnym ApplyedFiles, którego wymiar ApplyedFile odnosi się do jego elementu. Zatem dane dołączone do obiektów bazy informacyjnej są faktycznie przechowywane w tabeli rejestru informacyjnego, na którego działanie praktycznie nie ma wpływu ilość danych przechowywanych w zasobie. Katalog pośredni „Nomenklatura załączonych plików” jest niezbędny do przechowywania dodatkowych informacji o załączonym pliku, a także do umożliwienia dostępu do załączonego pliku przez odniesienie.

Wszystko powyższe po raz kolejny potwierdza ogromny wpływ na wydajność odpowiednio zaprojektowanej struktury metadanych konfiguracji.

Konfiguracja testowa na przykładzie z artykułu: POŁĄCZYĆ .

Platforma 1C: Przedsiębiorstwo zapewnia wiele możliwości przechowywania danych różnego typu.

Ale często te możliwości nie są wystarczające. I wtedy z pomocą przychodzi nam specjalny przedmiot - Wartości przechowywania. Obiekt ten umożliwia przechowywanie w specjalnym formacie zarówno standardowych obiektów 1C:Enterprise, np. tabeli wartości, jak i niestandardowych, dla których na platformie nie przewidziano typu. Typy niestandardowe mogą zawierać pliki. Na przykład, korzystając z magazynu wartości w bazie danych 1C, możesz przechowywać zdjęcia pracowników, skany dokumentów, przetwarzanie zewnętrzne itp. Zaletą jest to, że wszystkie te obiekty są przechowywane w samej bazie danych. W związku z tym podczas wdrażania nowej bazy danych z kopii zapasowej wszystkie te obiekty będą również obecne w nowej bazie danych. Z drugiej strony, jeśli przechowujesz w bazie danych duże pliki, może to znacznie zwiększyć jej objętość i negatywnie wpłynąć na jej wydajność. Dlatego należy tu zachować rozsądną równowagę.

Przyjrzyjmy się pracy ze sklepem wartości na przykładzie. Stwórzmy w konfiguratorze specjalny katalog - nazwijmy to Obiekty Zewnętrzne, a my z kolei utworzymy wymagania dla katalogu Obiekt z typem Wartości przechowywania

A teraz możemy tworzyć elementy w tym katalogu i we właściwościach Obiekt Każdy element jest zapisywany do pliku.

Praca ze sklepem wartościowym jest bardzo prosta. Jeśli spojrzymy na pomocnika składni, zobaczymy, że ten obiekt ma tylko jedną metodę i jednego konstruktora.

Teraz dla demonstracji napiszmy najprostszy kod, który zapisze plik do rekwizytów Obiekt utworzony wcześniej element katalogu, a następnie odczytaj ten plik z rekwizytów i zapisz go na dysku, ale pod inną nazwą.

&Na serwerze Procedura LoadUnloadFile(Element katalogu)Obiekt katalogu =Element katalogu. PobierzObiekt() ; //Umieść obraz w magazynie wartości LabelDownload = Nowy obraz("g:\musor\favicon.ico" ) NewValueStorage; //Zapisz element katalogu Obiekt katalogu. Obiekt DirectoryObject. Pisać() ; //Prześlij obraz z magazynu wartości do pliku NazwaPliku = "g:\musor\favicon_1.ico" ; LabelUpload = Obiekt katalogu. Obiekt. Dostawać() ; Prześlij etykietę. Write(NazwaPliku) ; Koniec procedury

I kilka wyjaśnień do kodu.

  • Obiekt jest umieszczany w sklepie bezpośrednio podczas tworzenia sklepu za pomocą konstruktora.

Aby przechowywać w pamięci inne typy plików niż obrazy, możesz użyć obiektu Dane binarne. Czysto teoretycznie możesz nawet przechowywać elementy katalogów, dokumenty itp. w magazynie wartości. Ale w praktyce nie ma to żadnego sensu. Czasami jednak możliwe jest użycie magazynu wartości do przechowywania tabeli wartości, drzewa wartości i innych uniwersalnych kolekcji.