телевизори. Конзоли. Проектори и аксесоари. Технологии. Цифрова телевизия

1c вземете файл от хранилището на стойността. Извличане на файл от информационната база

Имаме директория „Продукти“, в атрибута „Данни“, на която информацията се съхранява под формата на двоични данни. Самият атрибут има тип стойност "Съхранение на стойност". Следващата екранна снимка показва структурата на метаданните на директорията.

За прикачване на произволен файл от диск под формата на елемент е реализирана командата "AttachFile". Неговият програмен код е представен в следния списък:

& В клиентската процедура AttachFile(Command) // Обработчик на команди на клиента. Избор на файл // Диалог за избор на файл от дискаРежим = FileSelectionDialogMode. отваряне; OpenFileDialog = NewFileSelectDialog(Mode); Диалогов прозорец OpenFile. FullFileName = " " ; Диалогов прозорец OpenFile. MultipleSelect = False; Диалогов прозорец OpenFile. Title = "Избор на файлове" ; Ако FileOpenDialog. Select() Тогава FilePath = FileOpenDialog. пълно име на файл; // Получаване на данни от двоичен файл BinaryData = new BinaryData(PathToFile) ; // Прехвърляне на двоични данни към сървъра AttachFileServer(BinaryData) ; В противен случай Text = "ru = " " Файл (s) не е избран!" " ; en =" " Файл (s) не е избран!" " ; Предупреждение(NStr(Text) ); EndIf ; EndProcedure & OnServer Процедура AttachFileServer(BinaryData) // Манипулатор на сървъра за запис на файл в информационната сигурност // Трансформирайте обекта формуляр в референтен обект ObjectCurrent = FormAttributesValue("Object" ) ; // Присвояване на нова стойност на атрибута "Данни". ObjectCurrent. Данни = NewValueStorage(BinaryData) ; // Запазите промените ObjectCurrent. Write() ; Край на процедурата

Ако опишем алгоритъма в общи линии, тогава първо се избира файл от диска на клиента. Получените данни от двоичен файл се изпращат на сървъра, където се записват в информационната база, а именно в атрибута „Данни“ на текущия елемент на директорията.

По принцип всичко работи. Когато отваряме елемент, можем да прочетем тези данни, ако е необходимо. Ако например в атрибута е записано изображение, тогава можем да го получим и да го покажем в полето на формуляра. Това решение има място, но в повечето задачи не е оптимално да се използват атрибути с тип стойност „Съхранение на стойност“ в директории и документи. И затова...

Въздействие върху производителността

Нека проведем някои тестове за производителност. Тестовете ще използват два елемента от директорията "Продукти", със и без прикачен файл. Размерът на прикачения файл е 5 мегабайта.

Всички тестове се извършват с помощта на обработката "GetElement" в тестова конфигурация. Изтегли тази конфигурацияМожете да следвате връзката в края на статията.

Нека измерим времето, необходимо за отваряне на артикули в директорията "Продукти". За отваряне на елемент се използва методът на глобалния контекст "OpenValue()", на който се предава препратка към елемента като параметър. Нека измерим времето за отваряне с помощта на стандартен инструмент за измерване на производителността. Резултатите са представени на следната екранна снимка:

Както виждаме, времето за отваряне на елемент с прикачен файл е 10 пъти повече! Нека направим още един тест. Нека изпълним метода "GetObject()", за да посочим елемента на продуктовия каталог. Можете да видите резултата от теста на следната екранна снимка.

Разликата е доста съществена. Получаването на елемент без прикачен файл е 194 пъти по-бързо!

Това се случва, защото методът "GetObject()" получава всички данни от детайлите на елемента на директорията чрез препратка. Съответно, методът получава стойностите не само на атрибутите „Код“ и „Име“, но и стойността на атрибута „Данни“. Ако съхранява двоични данни с размер 5 мегабайта (както в нашия пример), тогава, когато обектът бъде получен, тези данни се поставят в RAM(като други подробности) и след това прехвърлени към страната на клиента. Именно получаването на данни от този атрибут увеличава времето за получаване на обекта на елемента. Ако се използва тънък каналвръзка, времето за отваряне ще се увеличи още повече поради прехвърлянето на голямо количество информация по мрежата.

Забележка: при изпълнение на метода "OpenValue()", обектът на елемента на директорията също първо се получава, след което се трансформира в обект на формуляр и се предава на клиента (за управлявани формуляри). Тоест, когато даден елемент се отваря чрез препратка, обектът също се извлича.

Нека проведем последен тест за времето, необходимо за отваряне и запис на елемент от директория със и без прикачен файл. Резултатът е показан на следната екранна снимка.

Естествен резултат. Времето за получаване и след това записване на елемент от директория с прикачен файл се оказа ~19 пъти по-дълго. Както бе споменато по-горе, при получаване на обект се получават стойностите на всичките му подробности, включително атрибута „Данни“, в който се съхраняват 5 мегабайта информация. Когато даден елемент е написан, това количество данни отново се записва в информационната база. Следователно съхраняването на данни в атрибут на директория (или документ) с тип „Съхранение на стойност“ влияе отрицателно на производителността както при извличане на обект, така и при поставянето му в информационната база.

Кой е най-правилният начин за решаване на проблема със съхраняването на данни за обекти на информационна база?

Правилно решение

Ако разгледаме реализацията на този механизъм в типични конфигурации, ще видим, че за обектите допълнителна информация се съхранява в отделна таблица с информационен регистър. Ето как изглежда например механизмът на прикачения файл в стандартна конфигурация на „Trade Management“ версия 11.

Директорията "Номенклатура" е собственик на директорията "НоменклатураПрикачениФайлове". Това от своя страна е свързано с информационния регистър AttachedFiles, чието измерение AttachedFile се отнася до неговия елемент. По този начин данните, прикачени към обектите на информационната база, всъщност се съхраняват в таблицата на информационния регистър, чиято работа практически не се влияе от количеството данни, съхранявани в ресурса. Междинната директория "NomenclatureAttachedFiles" е необходима за съхранение Допълнителна информацияза прикачен файл, както и за поддръжка на достъп до прикачен файл чрез връзка.

Всичко по-горе още веднъж потвърждава огромното въздействие върху производителността на правилно проектирана конфигурационна структура на метаданни.

Тествайте конфигурацията с пример от статията: ВРЪЗКА .

Почти всяка информация може да се съхранява в хранилище на стойност, напр.

... снимки (снимки):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types на допълнителна информация на Objects.Image; Съхранение = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// на това място показва всичко... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...документ с електронна таблица:

TabDoc=Нов табличен документ; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Напиши();

Край на процедурата

Процедура RestoreFromStoragePress(Element)

TabDoc=Storage.Get(); Ако TabDoc<>Недефиниран ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Край на процедурата

... произволни файлове (двоични данни):

XZ = NewValueStorage(NewBinaryData(file));

Осем поддържа компресиране на данни, поставени в хранилището:

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

... външна обработка и докладване:

Процедура LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 максимум PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", степен на компресиране));

Край на процедурата

Процедура StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(TemporaryFileName); ExternalProcessing = ExternalProcessing.Create(TemporaryFileName); ExternalProcessing.GetForm().Open();

Край на процедурата

Работа със съхранение

Ако са били двоични данни, тогава те могат да бъдат възстановени от хранилището на стойността с помощта на метода Get и записани във файл с помощта на метода Write().

Ако TypeValue(Съхранение)<>Въведете ("BinaryData") След това

BinaryData = Storage.Get();

BinaryData = Съхранение;

endIf; BinaryData.Write(Име на файл);

Ако беше например документ на Word (doc файл или друг регистриран тип файл), тогава той може да бъде отворен по следния начин:

Стартиране на приложение (Име на файл);

За да изчистите поле от тип Value Storage, трябва да му присвоите Undefined:

PropsStorage = Недефинирано;

Работа с файлове и изображения на вградения език 1C:Enterprise 8

Предназначение

IN управлявано приложениеВъведен е нов механизъм за работа с файлове. Той осигурява обмен на файлове между информационната база и клиентско приложение. Особеността на този механизъм е, че той е предназначен за използване в тънък клиент и уеб клиент и е проектиран, като се вземат предвид ограниченията за работа с файлове, наложени от уеб браузърите.

Механизмът е набор от методи, които могат да се използват за поставяне на данни, съхранявани локално на компютъра на потребителя, във временно хранилище на информационната база, прехвърляне на тази информация от временното хранилище към базата данни и получаването й обратно на компютъра на потребителя. Най-често срещаните проблеми на приложението, решавани с този механизъм, са съхранението на придружаваща информация, например изображения на стоки, документи, свързани с договори и др.

Обхват на метода

Временно съхранение

Временното съхранение е специализирана област от информационната база, в която могат да се поставят двоични данни. Основната цел е временно съхраняване на информация по време на взаимодействие клиент-сървър, преди да бъде прехвърлена към базата данни.

Необходимостта от временно съхранение възниква, тъй като моделът на работа на уеб браузъра изисква избраният от потребителя файл да бъде прехвърлен директно на сървъра, без възможност да бъде съхранен на клиента. Когато файл се прехвърля, той се поставя във временно хранилище и след това може да се използва при запис на обект в базата данни.

Най-типичната задача на приложението, решена чрез временно съхранение, е предоставянето на достъп до файлове или изображения, преди обектът да бъде записан в информационната база, например под формата на елемент.

Файл или двоични данни, поставени в хранилището, се идентифицират с уникален адрес, който по-късно може да се използва при операции за запис, четене или изтриване. Този адрес се дава от методите за запис на файл във временно хранилище. Отделен метод във вградения език ви позволява да определите дали предаденият адрес е адрес, сочещ към данни във временно хранилище.

Информационна база

Механизмът ви позволява да получите достъп до двоични данни, съхранявани в атрибути от типа Value Storage.

Както при временното съхранение, достъпът до информация е възможен чрез специален адрес. Можете да го получите чрез специален метод, като подадете връзка към обект или ключ за въвеждане на информационен регистър и името на атрибута. В случай на таблична част е необходимо допълнително да се прехвърли индексът на реда на табличната част.

Методите за работа с файлове имат ограничения при работа с подробности за информационната база. За тях, за разлика от временното съхранение, е достъпно само четене на информация, но не и писане или изтриване.

Описание на методите за работа с файлове

Запазване на данни във временно хранилище

Най-типичният сценарий за използване на този механизъм включва първоначално поставяне на потребителски данни във временно хранилище. Има два метода за това: PlaceFile() и PlaceFileInTemporaryStorage().

Първият метод, PlaceFile(), поставя файл от локалната файлова система във временно хранилище. Методът може да приеме целеви адрес в хранилището. Ако не е дефиниран или е празен низ, тогава ще бъде създаден нов файли методът ще върне адреса си чрез съответния параметър.

Ако параметърът, който определя интерактивния режим на работа, е True, тогава методът ще покаже стандартен диалогов прозорец за избор на файл, в който можете да изберете файл, който да поставите в хранилището. В този случай методът ще върне и адреса на избрания файл.

В резултат на това методът връща False, ако потребителят интерактивно откаже да извърши операция в диалоговия прозорец за избор на файл. Методът е достъпен само на клиента.

Вторият метод, PlaceFileInTemporaryStorage(), е подобен на предишния, с изключение на това, че е достъпен на сървъра и данните, които трябва да бъдат записани във временното хранилище, не са представени като път във файловата система, а като променлив типдвоични данни. По същия начин, ако не е указан целеви адрес, в хранилището се създава нов файл. Неговият адрес се връща като резултат от функцията.

Извличане на файл от временно хранилище

Когато пишете обект в информационната база, може да се наложи да извлечете данни от временно хранилище и да ги поставите, например, в атрибут. За това има съответен сървърен метод - GetFileFromTemporaryStorage(). Този метод извлича данни от временно хранилище и ги връща като резултат. За да направите това, трябва да посочите адреса във временното хранилище. Този адрес се връща от гореописаните методи PlaceFile() и PlaceFileInTemporaryStorage(), ако са изпълнени успешно.

Изтриване на файл от временно хранилище

След като данните бъдат запазени в детайлите, файлът във временното хранилище може да бъде изтрит. За целта има метод DeleteFileFromTemporaryStorage(), който изтрива файл от временно хранилище. Методът приема като параметър адреса на файл във временно хранилище. Наличен на сървъра.

Проверка на адреса за временно съхранение

Адресът на файла може да показва както временно съхранение, така и подробности в информационната база. За да проверите неговия тип, има метод This isTemporaryStorageAddress().

Той проверява дали предаденият адрес е адрес, сочещ към магазина. Връща True, ако адресът сочи към временно хранилище. Методът е достъпен на сървъра.

Получаване на реквизитния адрес

След като данните бъдат поставени в детайлите в информационната база, може да се наложи да ги осъществите чрез файлови методи.

Но преди да получите данни, например от имот, трябва да получите адреса на този имот. За тази цел има метод GetFileAddressInInformationBase().

Целта му е да върне адреса на файла в информационната база според оригиналните параметри. За да направите това, трябва да подадете ключа на обекта (това може да бъде или връзка към обекта, или ключ за въвеждане на информационен регистър) и името на атрибута. Ако трябва да получите адреса на файл, съхраняван в атрибут на таблична част, преди името на атрибута в параметъра, указващ името на атрибута, трябва да добавите името на табличната част и точка „.“. Методът е наличен както на клиента, така и на сървъра.

Извличане на файл от информационната база

Методът GetFile() получава файл от информационната база и го записва в локалната файлова системапотребител. Първият параметър указва адреса на файла в props или временното файлово хранилище. Вторият параметър указва местоназначението на получения файл. В неинтерактивен режим трябва да посочите пътя. В интерактивен режим параметърът не е задължителен.

По подразбиране методът се изпълнява в интерактивен режим, тоест последният параметър е True. Това означава, че се показва диалогов прозорец, в който можете да посочите действие с получения файл: да го стартирате или да го запишете на посочено от потребителя място. Ако интерактивният режим е активен и параметърът Target disk file path не е посочен, операцията за отваряне на файл не е достъпна. Връща булева стойност. False означава, че потребителят е избрал да отмени операцията в интерактивния диалогов прозорец за запис на файл.

Пример за използване на файлови методи

// Получаване на файл от диск в интерактивен режим // и поставянето му във временно хранилище &В клиентската процедура SelectDiskFileAndWrite()

Променлива SelectedName; VariableTemporaryStorageAddress; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); endIf;

Край на процедурата

// Копиране на файл от временно хранилище в директория // атрибут, записване на обект, изтриване на файл от временно // хранилище &В процедурата на сървъра Поставете обектен файл (адрес за временно съхранение)

Елемент на директория = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Директория Element.File Data = NewValueStorage(BinaryData); FilePathOnDisk = Нов файл(DirectoryItem.FileName); Директория Item.FileName = FilePathOnDisk.Name; Елемент на директория.Write(); Променено = невярно; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(Directory Element, "Object");

Край на процедурата

// Четене на файл от подпорите и записването му // на локалния диск в интерактивен режим &На клиентската процедура ReadFileAndSaveToDisk()

Адрес = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Address, Object.FileName, True);

Край на процедурата

Поддръжка на адреси в полето за изображение

Контролата Picture Field поддържа показване на картина, определена от адреса на файл във временно хранилище или в база данни.

За да направите това, трябва да зададете атрибут тип низ в свойството Data на елемента на формуляра. Стойността на този атрибут ще се интерпретира като адрес на картината.

Пример // Свързване на полето за изображение към адреса на изображението във временно // хранилище. AddressPictures формира детайли от тип низ

PlaceFile(PictureAddress,True)

Picture.Data = AddressPictures

Ограничения при работа с уеб клиента

Работата на описания механизъм при използване на уеб клиента има някои ограничения. Тези ограничения са свързани с модела за сигурност на браузъра. Така, например, клиентът не може самостоятелно да запише файл в локалната файлова система, т.е. налична е само интерактивната версия на клиентските методи PlaceFile() и GetFile(). При опит за използване на неинтерактивен режим се генерира изключение. Диалогови прозорци, показани интерактивно, са специфични за определен тип браузър.

Функции при работа с Value Storage на клиента

проблем:

Когато документът има атрибут от типа Съхранение на стойност в табличния раздел, той забавя отварянето на формуляра на документа, ако данните са записани в този атрибут голям размер.

Предполагаема причина:

Може би при отваряне на формуляр на клиента не се изпраща връзката към данните, намиращи се в Value Store, а самите данни.

Решение

  • В имоти подробности за масатаФормулярът има флаг "Винаги използвай". Ако е зададено, съдържанието на полето винаги се прехвърля между сървъра и клиента - например при отваряне на формуляр. Този флаг трябва да бъде деактивиран, но това трябва да се вземе предвид в кода, тъй като по подразбиране няма да има стойност за това поле на клиента. Пример може да се намери в 1C:Архив.

Дори е по-добре да се използва временно съхранениеза прехвърляне на файлове между клиент и сървър.

Платформа 1C:Enterpriseпредоставя много възможности за съхранение на данни от различен тип.

Но често тези възможности не са достатъчни. И тогава на помощ ни идва специален обект - StorageValues. Този обект ви позволява да съхранявате специален форматкакто стандартни обекти на 1C:Enterprise, например таблица със стойности, така и нестандартни, за които в платформата не е предоставен тип. Нестандартните типове могат да включват файлове. Например, използвайки хранилище на стойност в 1C база данни, можете да съхранявате снимки на служители, сканирани документи, външни леченияи т.н. Предимството тук е, че всички тези обекти се съхраняват в самата база данни. Съответно при разгръщане нова базаот резервно копиевсички тези обекти също ще присъстват в новата база данни. От друга страна, ако съхранявате големи файлове в базата данни, това може значително да увеличи нейния обем и да повлияе негативно на нейната производителност. Следователно тук трябва да се поддържа разумен баланс.

Нека да разгледаме работата с хранилище на стойност, използвайки пример. Нека създадем специална директория в конфигуратора - нека я извикаме Външни обекти, а ние на свой ред ще създадем реквизитите за директорията Предметс тип StorageValues

И сега можем да създаваме елементи в тази директория и в props ПредметВсеки елемент се записва във файл.

Работата със стойностен магазин е много проста. Ако погледнем помощния синтаксис, ще видим, че този обект има само един метод и един конструктор.

Сега, за демонстрация, нека напишем най-прост код, който ще запише файла в props Предметпредварително създаден елемент от директория и след това прочетете този файл от реквизитите и го запишете на диска, но под друго име.

&На сървърната процедура LoadUnloadFile(Directory Element)Directory Object =Directory Element. GetObject(); //Поставяне на изображението в хранилището за стойност LabelDownload = Ново изображение("g:\musor\favicon.ico" ) NewValueStorage; //Напишете елемент от директорияОбект директория. Обект DirectoryObject. Write() ; //Качете изображението от хранилището за стойност във файлИме на файл = "g:\musor\favicon_1.ico" ; LabelUpload = Обект на директория. Предмет. Get() ; LabelUpload. Write(FileName) ; Край на процедурата

И няколко пояснения за кода.

  • Обектът се поставя в магазина директно, когато магазинът е създаден с помощта на конструктора.

За да съхранявате други типове файлове, различни от изображения в хранилището, можете да използвате обекта двоични данни. Чисто теоретично можете дори да съхранявате елементи от директория, документи и т.н. в хранилището на стойността. Но на практика това няма никакъв смисъл. Но понякога е възможно да се използва хранилище на стойност за съхраняване на таблица със стойности, дърво със стойности и други универсални колекции.



Свързани публикации