1c vytvořte dočasný soubor. Přenos souborů mezi klientem a serverem

Jaký je tedy smysl mého článku?

1. Je tam server (x64), s nainstalovaným Office 2016 (x64), je tam 1C 8.3.8 také x64 (tzn. 1C server). Uživatelé se připojují přes tenkého i webového klienta.

2. Je jich spousta standardní smlouvy a faktury vystavené (připravené) obchodním oddělením. Existuje písmo, odstavec atd., samozřejmě, vše je navrženo ve Wordu, Excelu 2016 (x64), přirozeně není touha kreslit to vše v 1C, ale existuje touha dát to ve formátu ActiveDocument rozložení

Řešení se zdá banální :) , Nebudu popisovat celý mechanismus, jak se to dělá, jak se plní data z 1C do rozložení ActiveDocument – ​​myslím, že to beze mě znáte naprosto dobře. Během práce se ale ukázalo, že v království není všechno tak hladké COM objekt ov, konkrétně:

2. Kterou možnost je lepší zvolit: ActiveDocument nebo Binary Data? I když mi to zní asi jako výběr Vodky s pivem nebo piva s vodkou :) . Žádný velký problém, dokumenty musíte naplnit daty od 1C a přenést je klientovi.

Dobře, přeskočíme texty, volím ActiveDocument, nebudu popisovat celý algoritmus, jen uvedu úskalí a jejich řešení. Vše, co je uvedeno níže, je moje osobní spekulace a v žádném případě netvrdí, že je to konečná pravda. Možná jste tyto problémy vyřešili nebo je vyřešili jinak.

1. Kámen" První". Metoda SaveAs nefunguje (pro MSWord i MSExcel). Při pokusu o zápis binárních dat se 1C jednoduše zhroutí. Podívejte se na fragment výpisu:

MSWord = Layout.Get(); Zkuste dokument = MSWord.Application.Documents(1); Document.Activate(); //Dále nějak získáme data a vyplníme dokument Word //Získejte cestu do dočasného adresáře, kde se má soubor uložit TimeName = GetTemporaryFileName(".docx"); Document.SaveAs(NameTime); //zde začíná kámen MyDocumentInBinaryData = New BinaryData(NameTime); //no, tady je tento kámen vyražen 1C :) MSWord.Application.Quit();

Díky moc.

Vytváření složek
C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\Desktop
problém byl vyřešen. Téma uzavřeno.

Jaký je důvod? Důvodem je ten kód

MSWord = Layout.Get();

Vždy volá instanci objektu COM (x32) bez ohledu na to, jaká bitness Office je nainstalována. Přemýšleli jste někdy nad tím, proč nemůžete do rozložení ActoveDocument vložit soubory s příponou docx, xlsx?

to lze také zkontrolovat pomocí Správce úloh, ale faktem je, že rozložení ActiveDocument implicitně volá instanci COM (x32), a proto musí být všechny další manipulace provedeny s ohledem na tuto funkci.

1. Server a veškerý software musí být x32. Pak nemusíte nic dělat (ve smyslu přepisování kódu)

2. Buď přepište kód tímto způsobem

// získání názvu dočasného souboru TimeFile = GetTemporaryFileName("doc"); // tento kód určitě zavolá instanci COM požadované bitové hloubky, v našem případě x64 Word = New COMObject("Word.Application"); Word.Displayalerts = 0; DocumentN = Word.Application.Documents.Add(); DocumentN.SaveAs(TimeFile,0); Word.Quit(); // pak je vše jako předtím Layout = Print Management Layout ("Document. Equipment Transfer Act." + Layout Name); MSWord = Layout.Get(); Zkuste dokument = MSWord.Application.Documents(1); Document.Activate(); // zde něco uděláme, vyplníme data // zde znovu uložíme náš soubor z COM x62 do COM x64 MSWord.Application.Selection.WholeStory(); MSWord.Application.Selection.Copy(); DocumentN = MSWord.Application.Documents.Open(TimeFile); DocumentH.Activate(); MSWord.Application.Selection.Paste(); DocumentN.SaveAs(TimeFile,0); DocumentN.Close(); MSWord = Nedefinováno; Výjimka // Pokud dojde k chybě, vytisknou se data o chybě a objekt se zavře. Informace = ErrorInfo(); GeneralPurposeClientServer.NotifyUser("Chyba - "+Information.Description+" kód chyby - "+Abb.LP(Information.SourceString)); MSWord.Application.Quit(); EndPokus;

Myslím, že zde je vše jasné, nejprve jsme vytvořili instanci COM požadované bitové hloubky, vytvořili prázdný soubor a uložili jej do dočasné složky, poté pracujeme s COM x32, naplníme jej daty a nakonec zkopírujeme obsah celého dokument a uložte jej do dříve připraveného souboru.

Vše je stejné, ale pouze pro Excel

TimeFile = GetTimeFileName("xls"); Excel = New COMObject("Excel.Application"); Excel.Displayalerts = 0; BookH = Excel.WorkBooks.Add(); ListN = BookN.WorkSheets(1); BookN.SaveAs(TimeFile, -4143); Excel.Quit(); Layout = PrintManagement.PrintFormLayout("Document.Equipment Invoice."+LayoutName); MSExcel = Layout.Get(); BookH = MSExcel.Application.Workbooks.Open(TimeFile); ListN = BookN.WorkSheets(1); Zkuste WBook = MSExcel.Application.Workbooks(1); List = WBook.WorkSheets(1); List.Aktivovat(); // něco uděláme, naplníme to daty z 1C MSExcel.Application.WorkBooks(1).WorkSheets(1).Cells.Copy(SheetN.Cells); BookN.Save(); BookH.Close(); Výjimka // Pokud dojde k chybě, vytisknou se data o chybě a objekt se zavře. Informace = ErrorInfo(); GeneralPurposeClientServer.NotifyUser("Chyba - "+Information.Description+" kód chyby - "+Abb.LP(Information.SourceString)); MSExcel.Application.Quit(); EndPokus;

Tady máš " První„Rozhodl jsem se jako kámen, na x64 serveru s Office x64 vše funguje přesně jako hodinky, bez chyb a není potřeba vytvářet žádné složky a vše ostatní.

kámen" druhý". fragment kódu

TimeFile = GetTimeFileName("xls");

jíst není moc dobré, protože to zapisuje do složky: “c:\Users\ co tam je...”, obecně je tato složka vždy na černé listině všech firewallů, antivirů atd. atd., at alespoň otevřít řídicí centrum zabezpečení ve Wordu nebo Excelu. Podívejme se tam také

Budete si s tím muset pohrát, jinak existuje možnost, že se objeví „podivné“ chyby. Proto navrhuji následující:

1. Otevřete konfigurátor a přidejte nový registr informací

zde uložíme naše hotové slovo, Excel soubory již vyplněno, samozřejmě:

LayoutName – ID rozložení

DocumentOffice - Value Storage, zde máme náš hotový soubor

2. Výše ​​uvedený kód přidáme následovně:

MH = Information Registers.TemporaryStorageOffice.CreateRecordManager(); MH.Object = Selection.Link; MZ.LayoutName = LayoutName; MZ.Read(); MH.Object = Selection.Link; MZ.LayoutName = LayoutName; MZ.DocumentOffice = NewValueStorage(NewBinaryData(TimeFile)); MZ.Write(); DeleteFiles(TimeFile);

To, co děláme, je, že zapíšeme hotový soubor do registru informací a poté odstraníme samotný dočasný soubor, čímž vyřešíme problém „Word, Excel Security Center“. Zbývá pouze ukázat tento hotový soubor Klientovi (tenkým a webovým klientům)

3. Kámen" Třetí" - přenos souboru klientovi, zde pouze zveřejním veškerý kód, část převzatá z BSP, část z demo konfigurace „Managed Application“, část z internetu, ale obecně zde je kód (v jeho celistvost)

///////////////////////////////////////////////// ////////////////////////// // SERVISNÍ POSTUPY A FUNKCE BSP &OnServer Function GetLayout() ObjectLink = DataStructure.Object; LayoutName = DataStructure.LayoutName; Klíč záznamu = Registry informací. CreateRecordKey(Nová struktura("Object,LayoutName",ObjectLink,LayoutName)); // Adresa = GetNavigationLink(RecordKey,"OfficeDocument"); Zpáteční adresa; EndFunction // &Procedura OnClient AfterApplicationStart(ReturnCode, ApplicationName) Export; // Konec procedury &Na klientské proceduře po přijetí souborů (přenesené soubory, další parametry) Exportovat, pokud NEPŘESÍLANÉ soubory = nedefinováno, pak pro každý popis přenášených souborů Cyklus OpAfterAppLaunch = New DescriptionAlerts("AfterLaunchingApplication", ThisObject, Description.Name ); StartLaunchApplication(OpAfterStartApplication, Description.Name); EndCycle; endIf; EndProcedure &Procedura OnClient AfterDirectorySelection(SelectedFiles, CommandName) Export If SelectedFiles = Undefined Then Return; endIf; Adresář = SelectedFiles; GeneralPurposeServerCall.SaveWorkingDirectory(Directory); If CommandName = "Invoice" Then LayoutName = "Invoice" EndIf; DataStructure.Insert("Adresář", Adresář); ConnectWaitingHandler("Connectable_SendFileToClient",5,True); Konec procedury &Na klientské proceduře Otevřít soubory přes rozšíření (název příkazu) OpAfterSelectingDirectory = New DescriptionAlerts("AfterSelectingDirectory", ThisObject, CommandName); Directory = GeneralPurposeCallServer.GetWorkingDirectory(); If Directory = Undefined OR Directory = "" Then Dialog = New FileSelectionDialog(FileSelectionDialogMode.DirectorySelection); Dialog.Header = НStr("ru = "Výběr adresáře pro dočasné uložení souborů"", "ru"); Dialog.Show(OpAfterSelectingDirectory); Jinak SelectedFiles = Nové pole; SelectedFiles.Add(Directory); Provést zpracování výstrah (OpAfterSelectingDirectory, SelectedFiles); endIf; Konec procedury &Na klientské procedurě ProcessConnectingExtensionsWorkingWithFiles(ExtensionConnected,AdditionalParameters) ExportIfExtensionConnectedThenOpenFilesThroughExtension(AdditionalParameters.CommandName); endIf; EndProcedure &Procedura OnClient Connected_PassFileToClient() Address = GetLayout(); Pokud Adresa<>Undefined Then DisableWaitHandler("Connectable_PassFileToClient"); DocumentNumber = DataStructure.DocumentNumber; Adresář = DataStructure.Directory; LayoutName = DataStructure.LayoutName; Cesta k souboru = Directory+"\"+LayoutName+"_No"+DocumentNumber+".xls"; Popis = Nový popis přenášeného souboru (cesta k souboru, adresa); TransferredFiles = Nové pole; TransferredFiles.Add(Description); StartReceivingFiles(NewDescriptionAlerts("AfterReceivingFiles", ThisObject), TransferredFiles, "", False); endIf; Konec procedury &Na serveru Procedura ExecutePrintServer() ObjectLink = DataStructure.Object; LayoutName = DataStructure.LayoutName; DataStructure.Insert("DocumentNumber", ObjectReference.Number); ObjectArray = Nové pole; Array of Objects.Add(ObjectRef); Documents.Equipment Invoice.PrintInvoice(Object Array,LayoutName,True); EndProcedure &Procedura OnClient Connectable_ExecutePrint() ExecutePrintServer(); EndProcedure // StandardSubsystems.Print &OnClient Postup Connectable_ExecutePrintCommand(Command) Link = Elements.List.CurrentData.Link; DataStructure = newStructure; DataStructure.Insert("Objekt", Odkaz); DataStructure.Insert("Název rozvržení", "Faktura"); ConnectWaitingHandler("Connectable_Print", 1, True); CommandDescription = PrintManageClient.PrintCommandDescription(Command.Name,FormName); Spustit instalaci File Work Extension(); StartConnectingFileWorkingExtension(NewAlertDescription("ProcessConnectingFileWorkingExtension",ThisObject,NewStructure("CommandName",CommandDescription.Identifier))); EndProcedure // End StandardSubsystems.Print

Pár upřesnění:

1. Za prvé, náš klient pracuje v režimu Thin i Web, takže předem nastavíme ve vlastnostech Konfigurátoru následující hodnoty:

Aby nedošlo k problémům při práci s prohlížečem

2. Abychom se vyhnuli problémům se synchronizací hovorů, používáme obslužné rutiny čekání (platí pouze pro webový režim)

3. A nakonec připojte Rozšíření pro práci se Soubory (nezapomeňte, že v režimu Tenký klient, toto rozšíření je vždy povoleno). A přes kód:

přeneseme soubor Klientovi pomocí mechanismu NavigationLink, obdržíme v prohlížeči následující zprávy (Thin funguje sám):

No, zdá se, že je to vše. Snad to někomu pomůže...

Pokud jde o Word, soubory Excel vložené jako binární data? Co je za problém?

1. Buďto musíme tato Binární data vytáhnout z layoutu a naplnit je daty z 1C a POZOR zapsat je znovu ve tvaru Binární data (Vodka s pivem nebo pivo s vodkou)

2. Buď musíme získat rozložení BinaryData na straně klienta a tam ho vyplnit, ALE objekt COM podporuje pouze prohlížeč IE a pak s tanečky s nastavením ActiveX, ostatní prohlížeče už dávno od používání ActiveX upustily.

Řeknu vám případ ze své praxe. Jednoho dne jsem musel nastavit nahrávání dat do 1c účetnictví z nereplikované konfigurace. Vykládka probíhala formou samostatného zpracování, pracujícího podle burzovních pravidel. Samotná pravidla byla připojena jako binární datový layout. Operační algoritmus je typický - pravidla jsou nahrána do dočasného souboru a poté vytažena zpracováním " Univerzální výměna data ve formátu XML."

Vývojář převodních pravidel a zpracování se bil do prsou a přísahal, že mu vše funguje perfektně. V praxi se při nahrávání dat neustále vyskytovala chyba. Text chybové zprávy otevřeně uváděl, že problém spočívá v pravidlech burzy. „Dokument již tuto vlastnost nemá, odmítám jej nahrát,“ stálo v textu zprávy. Nechtěl jsem si zahrávat s pravidly burzy, protože... To není moje práce. Místo toho jsem otevřel kód pro zpracování a rozhodl se podívat, jak je organizován proces nahrávání pravidel výměny do dočasného souboru.

Ukázalo se, že to je přesně ten problém. Faktem je, že programátor se neobtěžoval vytvořit jedinečný název souboru pro pravidla výměny (v dočasném adresáři) a dokonce vložil zaškrtnutí: „Pokud soubor existuje, nahrávání není nutné.“ Při zpracování samozřejmě vše fungovalo, respektive nebyl aktualizován layout s pravidly. V důsledku toho se uživatelé neustále snažili nahrávat pomocí zastaralých pravidel výměny. „Dočasný soubor“ v adresáři „temp“ se stal trvalým a dokud jej ručně nesmažete, bude vždy používán pro nahrávání.

Musíte správně vytvořit dočasné soubory

Abyste se vyhnuli takovým vtipným situacím, neměli byste se pokoušet znovu vynalézat kola a berle ve formě „záludných“ funkcí, které používají objekty COM. Stačí použít funkci zabudovanou do platformy - GetTemporaryFileName(), který automaticky řeší mnoho problémů:

Zajišťuje, že název souboru je skutečně jedinečný;

Pokud vývojář zapomene smazat soubor sám, bude určitě smazán při příštím spuštění platformy.

Automatické mazání dočasných souborů při restartu platformy je velmi zajímavá funkce, která teoreticky umožňuje vývojáři ignorovat nutnost mazat soubory samotné. Pravda, stále se to nevyplatí zneužívat. Pokud je kód spuštěn na serveru, musíte pochopit, že server se nemusí restartovat po dlouhou dobu, což znamená dočasná složka ucpe se nepotřebné soubory. V tomto ohledu byste neměli platformě zcela důvěřovat „špinavou“ práci. Je lepší použít tuto funkci jako záložní možnost a přidat do kódu jeden řádek kódu navíc, abyste vynutili odstranění dočasného souboru.

Velmi často se uživatelé setkávají s podivnými chybami: program funguje správně pro jednoho uživatele, ale pro jiného, ​​poblíž, na jiném počítači, funguje úplně jinak. Po zdlouhavém vyšetřování se často ukáže, že příčinou takových „závad“ v 1C 8 je mezipaměť.

Níže vám řeknu, co je mezipaměť 1C a jak ji vymazat.

Ukládání do mezipaměti— proces vytváření vyrovnávací paměti často používaných a zpravidla statických informací. Ukládání do mezipaměti se používá k urychlení programu, zejména v 1C se konfigurační soubory načítají do počítače uživatele, aby je pokaždé nevyžadovaly ze serveru.

Platforma 1C však velmi často nezpracovává ukládání konfigurace do mezipaměti správně a v důsledku toho dostáváme nevhodné chování při konfiguraci.

Důvody nesprávného chování mohou být různé: dynamické aktualizace konfigurace, selhání softwaru nebo hardwaru.

První metodou je ruční vymazání mezipaměti 1C

Chcete-li vyřešit problémy a „závady“ 1C, obvykle pomáhá vymazání mezipaměti platformy 1C 8.3.

To se provádí následovně:

krok 1

Najděte adresář, kde jsou uloženy dočasné soubory 1C, lze je vidět v nabídce nastavení v seznamu IB:

Krok 2

Dostali jsme adresu jako

Získejte 267 videolekcí na 1C zdarma:

C:\Documents and Settings\username\Application Data\1C\1Cv82\tmplts\1c

Složky mezipaměti jsou umístěny na

C:\Documents and Settings\username\Application Data\1C\1Cv82\

*kde uživatelské jméno je systémové uživatelské jméno a složka 1Cv82 se může lišit v závislosti na verzi platformy 1C

Když jsme tam šli, najdeme mnoho (počet složek se rovná počtu konfigurací) zajímavých složek:

Všechny vybrané adresáře jsou mezipamětí databáze 1C a lze je bezpečně smazat. Před vymazáním musíte ukončit systém zabezpečení informací.

Pokud se vám nechce hledat, kde se soubory nacházejí, můžete použít speciální program(bat soubor), který čistí složky s dočasnými soubory - stáhnout . Pamatujte, že je používáte na vlastní nebezpečí. Obsahují následující příkaz:

rmdir "%AppData%\1C\1Cv8" /S /Q
rmdir "%LOCALAPPDATA%\1C\1Cv8" /S /Q

Druhým způsobem, jak vymazat dočasné soubory 1C, je odstranění databáze ze seznamu

Druhý způsob je jednodušší, ale není zcela správný. Chcete-li jej vyčistit, stačí tuto konfiguraci odstranit a vytvořit novou se stejnou cestou k zabezpečení informací.

V důsledku toho bude stará složka s mezipamětí „odpojena“ od tohoto systému zabezpečení informací a bude vytvořen nový adresář.

Můžete to udělat, mezipaměť se vymaže, ale dočasné soubory zůstanou na pevném disku.

Třetí metodou je parametr ClearCache

Povinné v dodatečné parametry spustit (v seznamu databází tlačítko Změnit, poslední záložka) zadejte příkaz /Vyčistit mezipaměť. Příklad použití:

Video o vymazání mezipaměti v programech 1C:

Pokud „závady“ v 1C po vymazání mezipaměti nezmizí a 1C nefunguje tak, jak byste chtěli, můžete se obrátit na.

Pokud se začínáte učit programování 1C, doporučujeme náš bezplatný kurz (nezapomeňte přihlásit se k odběru YouTube - pravidelně vycházejí nová videa):

Oblast použití: spravovaná aplikace, mobilní aplikace, běžná aplikace.

1. Při přístupu k souborům a adresářům souborového systému z konfiguračního kódu byste měli mít na paměti, že přístup k nim je omezen uživatelskými právy operační systém, jejímž jménem aplikace běží.

1.1. Pokud přístup k souborový systém se provádí z kódu běžícího na klientovi, spouští se pod právy uživatele, v jehož zastoupení aplikace běží (tenký, tlustý nebo webový klient). Obvykle se jedná o aktuálního uživatele operačního systému.

1.2. Pokud se k systému souborů přistupuje z kódu spuštěného na serveru, pak:

  • při použití infobáze klient-server je přístup omezen právy uživatele, jehož jménem server 1C:Enterprise běží (*);
  • použitím databáze souborů zveřejněny na webovém serveru, přístup je omezen právy uživatele, jehož jménem web server běží.

Práce s dočasnými soubory a adresáři

Pokud potřebujete používat dočasné soubory a adresáře, musíte splnit následující požadavky:

1. Chcete-li získat název dočasného souboru, použijte metodu GetTemporaryFileName. Jinak je to možné nesprávná práce konfigurace ve víceuživatelském režimu, s povolenými bezpečnostními profily, problémy s přístupovými právy k souborům operačního systému.

Špatně:

IntermediateFileName = "C:/Dočasné soubory 1C/TempFile.xml"Data.Write(IntermediateFileName);

Aktuální uživatel nemusí mít oprávnění k zápisu do zadaného adresáře. Navíc spuštění tohoto kódu ze dvou různých relací současně vyvolá chybu.

Že jo:

IntermediateFileName = GetTemporaryFileName("xml");Data.Write(IntermediateFileName);

Při použití této funkce bude získán jedinečný název a je zaručen přístup k souboru.

2. Pro vytvoření dočasného adresáře se také doporučuje použít název získaný pomocí metody GetTemporaryFileName. Tím je zajištěno, že název vytvořeného adresáře je při práci ve víceuživatelském režimu jedinečný. Poté můžete v rámci vytvořeného adresáře bez omezení vytvářet další adresáře a soubory.

3. Při spouštění kódu na webovém klientovi nebo v ojedinělých případech, pokud není vyžadováno zajištění provozu ve víceuživatelském režimu, například aktualizace databáze informací o souborech, monopolní režim), musíte tuto funkci použít k vytvoření názvu souboru nebo adresáře Adresář dočasných souborů.

viz takéVlastnosti vývoje konfigurací pro OS Linux, o zvláštnostech používání názvů souborů a cest.

4. Po dokončení práce s dočasným souborem nebo adresářem jej musíte sami smazat. Nemůžeš počítat automatické odstranění soubory a adresáře při příštím spuštění platformy to může vést k vyčerpání volný prostor v adresáři dočasných souborů.

IntermediateFileName = GetTemporaryFileName("xml");Data.Write(IntermediateFileName);//Práce se souborem...//Odstranění dočasného souboruAttempting to Delete Files(IntermediateFileName);Exception LogRegistration(НStr("ru = "Můj mechanismus. Action"") , LogLevel.Error, ErrorDetailView(ErrorInfo()));EndAttempt;

Viz také:Použití knihy jízd.

5. Při použití dočasných souborů a adresářů na serveru musíte zcela ukončit práci s nimi v rámci jednoho volání serveru. Při spuštění konfigurace pomocí serverového clusteru, když další hovor tyto soubory se mohou stát nepřístupnými, protože se kód spustí na jiném počítači. Pokud potřebujete ukládat data mezi voláními serveru v rámci stejné relace, měli byste použít dočasné úložiště platformy (metody , ).

5. 1. Ve vzácných případech může být nutné přenést data v dočasných souborech mezi relacemi, například při přípravě dat pro pozadí práce, když organizujete dlouhotrvající proces, který obsluhuje několik po sobě jdoucích volání webové služby. Je nutné samostatně zajistit garantované společné úložiště, práva přístupu k souborům z různých míst jejich zpracování, mazání souborů po uplynutí doby jejich zpracování nebo abnormální ukončení procesu zpracování. Doporučuje se následující přístup:

  • Aby byl zajištěn přístup ze všech možných umístění zpracování, je vytvořena konstanta pro uložení společné cesty k souborům, ke kterým lze přistupovat ze všech serverů v clusteru;
  • Při vytváření dočasných souborů se jejich názvy zapisují do pomocného informačního registru, přičemž se zachová čas vytvoření souboru;
  • Během normálního průběhu procesu poslední operace, která potřebovala soubory, před svým dokončením smaže jak samotný soubor, tak záznamy o nich v pomocném registru;
  • Pomocný rutinní úkol periodicky kontroluje přítomnost záznamů v pomocném registru, jejichž životnost zjevně přesahuje běžnou dobu dokončení procesu. Když jsou takové položky zjištěny, úloha odstraní dočasné soubory a záznamy o nich.

Přenos souborů mezi klientem a serverem

1. Při současné práci se souborem na klientovi a serveru musíte použít přenos souborů přes dočasné úložiště (metody PlaceFile, PlaceFiles, Získejte soubor, GetFiles, StartFilePlace, Umístěte do dočasného úložiště, Příjem z dočasného úložiště). Obecně platí, že klient a cluster servery jsou různé počítače s různými systémy souborů a přístup k souborům může probíhat pod různými uživateli OS s různými právy.

Špatně:

&OnClientProcedureFileProcessing() ...FileName = "C:/Soubory pro zpracování/Download.xml"; Výsledek = Perform ProcessingOnServer(FileName); ...EndProcedure&OnServerFunction PerformProcessingOnServer(FileName) Reading = NewTextReading(FileName) ... Result = Reading.Read(); Return Result;EndFunction

Že jo:

&OnClientProcedureFileProcessing() ...FileNameForProcessing = "C:/Soubory pro zpracování/Download.xml"; Adresa = ""; PlaceFile(Adresa, FileNameForProcessing, FileNameForProcessing, False); Výsledek = Perform ProcessingOnServer(Address); ...EndProcedure&OnServerFunction Provést ProcessingOnServer(Address) Data = GetFromTemporaryStorage(Address) IntermediateFileName = GetTemporaryFileName("txt"); Data.Write(IntermediateFileName); Read = New ReadText(IntermediateFileName) ... Result = Read.Read(); ...DeleteFiles(IntermediateFileName); Return Result;EndFunction

2. Chcete-li uložit data do dočasného úložiště mezi několika voláními serveru, musíte při jejich umístění do úložiště použít parametr UniqueFormIdentifier metoda PlaceFile předáním identifikátoru aktuálního formuláře do něj. Takové hodnoty budou vymazány z jejich dočasného úložiště pouze při zavření zadaného formuláře. V tomto případě při opětovném umístění stejného souboru do dočasného úložiště musí být předchozí hodnota odstraněna ručně. Například:

Špatně:

FileNameForProcessing = "C:/Soubory pro zpracování/Download.xml"; ... // První volání serveru Address = ""; PlaceFile(Adresa, FileNameForProcessing, FileNameForProcessing, False, UniqueIdentifier); Výsledek = Provést InitialProcessingOnServer(Address);
... // Druhé volání serveru se stejnou verzí souboru Result = Perform IntermediateProcessingOnServer(Address); ...
// Třetí volání serveru s nová verze adresa souboru = ""; PlaceFile(Adresa, FileNameForProcessing, FileNameForProcessing, False, UniqueIdentifier); Výsledek = Provést FinalProcessingOnServer(Address); ...

V dočasném úložišti formuláře tak zůstanou dvě kopie souborů. Adresa druhé kopie bude v proměnné Adresa a adresa první kopie bude ztracena. To vede ke spotřebě dalších aplikačních zdrojů a zpomalení.

Že jo:

FileNameForProcessing = "C:/Soubory pro zpracování/Download.xml"; ... // První volání serveru Address = ""; PlaceFile(Adresa, FileNameForProcessing, FileNameForProcessing, False, UniqueIdentifier); Výsledek = Provést InitialProcessingOnServer(Address); ... // Druhé volání serveru se stejnou verzí souboru Result = Perform IntermediateProcessingOnServer(Address); ...
// Třetí volání serveru s novou verzí souboru DeleteFromTemporaryStorage(Address); Adresa = ""; PlaceFile(Adresa, FileNameForProcessing, FileNameForProcessing, False, UniqueIdentifier); Výsledek = Provést FinalProcessingOnServer(Address); ...

viz také

Najdou nás: přístup k systému souborů, GetTemporaryFileName(


Technologická platforma 1C:Enterprise 8 vám umožňuje ušetřit informační základna libovolné soubory, získat je odtud a používat je různé způsoby. Podívejme se na tyto operace na příkladech.

Před nahráním souboru do informační databáze 1C musíte získat úplnou adresu souboru na disku. Práce s dialogy pro výběr souboru je popsána v .

K ukládání souborů použijte atribut (nebo prostředek registru) s typem StorageValues.

Nahrání libovolného souboru do informační základny 1C

Jakýkoli soubor může být reprezentován jako binární data a načten do Ukládání hodnoty.

Při převodu binárních dat na objekt StorageValues použitý design nové hodnoty úložiště (data, komprese) se dvěma parametry:

  1. Data— binární data, která je třeba uložit do úložiště
  2. Komprese— kompresní poměr deflace algoritmu. Celé číslo v rozsahu -1...9. -1 je výchozí úroveň komprese. 0 - žádná komprese, 9 - maximální stupeň komprese. Výchozí hodnota: -1. Pokud není parametr zadán, komprese se nepoužije.

//Převod souboru na binární data
Soubor = New BinaryData(Cesta) ;

//Vytvořit nový objekt StorageValues

DataStorage = NewValueStorage(Soubor, NewDataCompression(9) ) ;

Uložení libovolného souboru z infobáze 1C na disk

Chcete-li uložit soubor z databáze 1C na disk, musíte určit cestu a název souboru. K tomu slouží dialog pro ukládání souborů, práce s nímž je popsána v.

//Získání binárních dat z úložiště
//Data Storage - atribut objektu s typem Value Storage

//Zapíše přijatá data na disk
//Proměnná Path obsahuje úplnou adresu souboru na disku
Data. Write(Cesta) ;

Zobrazení souboru umístěného v informační základně 1C

Chcete-li zobrazit soubor uložený v databázi, musíte mít v počítači nainstalovanou aplikaci, která soubor otevře.

//Získejte název dočasného souboru s požadovanou příponou
//Do proměnné Přípona musíte zadat příponu souboru, například "pdf"
Cesta = GetTemporaryFileName(Extension) ;

//Příjem dat z úložiště
//Data Storage - atribut objektu s typem Value Storage
Data = úložiště dat. Dostat() ;

//Zápis dat do dočasného souboru
Data. Write(Cesta) ;

//Pokouším se otevřít soubor v zamýšlené aplikaci
//Pokud aplikace není nalezena, zobrazí se systémový dialog "Otevřít pomocí...".
LaunchApplication(Path) ;