1s 8.3 utwórz plik tymczasowy. Praca z plikami i katalogami tymczasowymi
Platforma technologiczna 1C:Enterprise 8 pozwala zapisywać dowolne pliki w bazie informacji, pobierać je stamtąd i używać różne sposoby. Spójrzmy na te operacje na przykładach.
Przed przesłaniem pliku do bazy danych 1C musisz uzyskać pełny adres plik na dysku. Praca z oknami dialogowymi wyboru plików jest opisana w .
Aby przechowywać pliki, atrybut (lub zasób rejestru) z typem Storage Values.
Przesyłanie dowolnego pliku do bazy informacyjnej 1C
Każdy plik może być reprezentowany jako dane binarne i ładowany do Przechowywanie wartości.
Podczas konwertowania danych binarnych na obiekt Storage Values konstrukcja jest używana newStorageValue (dane, kompresja) z dwiema opcjami:
- Dane- dane binarne do umieszczenia w magazynie
- Kompresja— stopień kompresji algorytmu Deflacji. Liczba całkowita z zakresu -1…9. -1 to domyślny poziom kompresji. 0 - brak kompresji, 9 - maksymalny stopień kompresji. Wartość domyślna: -1. Parametr jest opcjonalny, jeśli nie zostanie określony, kompresja nie jest używana.
//Konwertuj plik na dane binarne
Plik = Nowy BinaryData(Ścieżka) ;
//Utwórz nowy obiekt ValueStorage
DataStorage = NewValueStorage(Plik, NewDataCompression(9) ) ;
Zapisywanie dowolnego pliku z infobazy 1C na dysk
Aby zapisać plik z bazy danych 1C na dysk, musisz określić ścieżkę i nazwę pliku. W tym celu dostępne jest okno dialogowe do zapisywania plików, którego praca jest opisana w .
//Pobierz dane binarne z pamięci
//DataStorage - atrybut obiektu o typie ValueStorage
//Zapisz otrzymane dane na dysk
//Zmienna Path zawiera pełny adres pliku na dysku
Dane. Napisz (ścieżka) ;
Przeglądanie pliku znajdującego się w bazie informacyjnej 1C
Aby wyświetlić plik zapisany w bazie danych, musisz mieć zainstalowaną na komputerze aplikację, która otworzy ten plik.
//Pobierz nazwę pliku tymczasowego z wymaganym rozszerzeniem
//W zmiennej Extension należy podać rozszerzenie pliku, na przykład "pdf"
Ścieżka= GetTemporaryFileName (rozszerzenie) ;
// Pobierz dane z pamięci
//DataStorage - atrybut obiektu o typie ValueStorage
Dane = Magazyn danych. Dostać() ;
//Zapisz dane do pliku tymczasowego
Dane. Napisz (ścieżka) ;
//Spróbuj otworzyć plik w zamierzonej aplikacji
//Jeśli aplikacja nie zostanie znaleziona, pojawi się systemowe okno dialogowe "Otwórz za pomocą..."
RozpocznijAplikację(Ścieżka) ;
Zakres: aplikacja zarządzana, Aplikacja mobilna, wspólna aplikacja.
1. Uzyskując dostęp do plików i katalogów systemu plików z kodu konfiguracyjnego należy pamiętać, że dostęp do nich jest ograniczony prawami użytkownika system operacyjny, w imieniu którego działa aplikacja.
1.1. Jeśli dostęp do system plików jest wykonywany z kodu działającego na kliencie, następnie jest wykonywany na prawach użytkownika, w imieniu którego działa aplikacja (klient cienki, gruby lub webowy). Zazwyczaj jest to bieżący użytkownik systemu operacyjnego.
1.2. Jeśli system plików jest dostępny z kodu uruchomionego na serwerze, to:
- przy użyciu klient-serwer baza informacji, dostęp jest ograniczony prawami użytkownika, w imieniu którego działa serwer 1C:Enterprise (*);
- za pomocą baza plików opublikowane na serwerze WWW, dostęp ograniczony jest prawami użytkownika prowadzącego serwer WWW.
Praca z plikami i katalogami tymczasowymi
Jeśli musisz korzystać z plików i katalogów tymczasowych, musisz spełnić następujące wymagania:
1. Aby uzyskać nazwę pliku tymczasowego, użyj metody GetTemporaryFileName. W przeciwnym razie konfiguracja może nie działać poprawnie w trybie wielu użytkowników, z włączonymi profilami zabezpieczeń i mogą wystąpić problemy z prawami dostępu do plików systemu operacyjnego.
Niewłaściwie:
IntermediateFileName = "Pliki tymczasowe C:/1C/TempFile.xml"Data.Write(IntermediateFileName);
Na aktualny użytkownik może nie mieć dostępu do zapisu w określonym katalogu. Ponadto uruchomienie tego kodu z dwóch różnych sesji w tym samym czasie spowoduje zgłoszenie błędu.
Prawidłowo:
IntermediateFileName = GetTemporaryFileName("xml");Data.Write(IntermediateFileName);
Podczas korzystania z tej funkcji uzyskana zostanie unikalna nazwa, dostęp do pliku jest gwarantowany.
2. Aby utworzyć katalog tymczasowy, zaleca się również użycie nazwy uzyskanej za pomocą metody GetTemporaryFileName. Gwarantuje to, że nazwa utworzonego katalogu jest unikalna podczas pracy w trybie wielu użytkowników. Następnie w utworzonym katalogu możesz bez ograniczeń tworzyć inne katalogi i pliki.
3. Podczas wykonywania kodu na kliencie WWW lub w rzadkich przypadkach, gdy nie jest wymagane zapewnienie pracy w trybie wielu użytkowników, np. aktualizacja infobazy plików, ekskluzywny reżim), musisz użyć funkcji do utworzenia nazwy pliku lub katalogu KatalogPliki Tymczasowe.
Zobacz teżFunkcje tworzenia konfiguracji dla systemu operacyjnego Linux, o specyfice używania nazw plików i ścieżek.
4. Po zakończeniu pracy z plikiem lub katalogiem tymczasowym musisz go samodzielnie usunąć. Nie możesz polegać na automatycznym usuwaniu plików i katalogów przy następnym uruchomieniu platformy, może to prowadzić do wyczerpania wolna przestrzeń w katalogu plików tymczasowych.
IntermediateFileName = GetTemporaryFileName("xml");Data.Write(IntermediateFileName);// Praca z plikiem...// Usuń plik tymczasowyTrying to DeleteFiles(IntermediateFileName);LogLogWriteException(НStr("ru = "Mój mechanizm.Action"") , LogLevel.Error, DetailErrorRepresentation(ErrorInfo()));Próba zakończenia;
Zobacz też:Korzystanie z dziennika rejestracji.
5. W przypadku korzystania z plików i katalogów tymczasowych na serwerze konieczne jest zakończenie pracy z nimi w ramach jednego wywołania serwera. Podczas uruchamiania konfiguracji przy użyciu klastra serwerów przy następnym wywołaniu tych plików pliki te mogą stać się niedostępne, ponieważ kod rozpocznie wykonywanie na innym komputerze. Jeśli potrzebujesz zapisać dane pomiędzy wywołaniami serwera w ramach tej samej sesji, powinieneś skorzystać z tymczasowego przechowywania platformy (metody , ).
5. 1. W rzadkich przypadkach może zajść konieczność przesyłania danych w plikach tymczasowych pomiędzy sesjami, na przykład podczas przygotowywania danych do pracy w tle, przy organizacji długiego procesu obsługującego kilka kolejnych wywołań usług internetowych. Niezbędne jest samodzielne zapewnienie gwarantowanej wspólnej przestrzeni dyskowej, praw dostępu do plików z różne miejsca ich przetwarzania, usunięcia plików po wygaśnięciu ich przetwarzania lub nieprawidłowego zakończenia procesu przetwarzania. Zaleca się stosowanie następującego podejścia:
- Aby zapewnić dostęp ze wszystkich możliwych lokalizacji przetwarzania, tworzona jest stała do przechowywania wspólnej ścieżki do plików dostępnych dla wszystkich serwerów klastra;
- Przy tworzeniu plików tymczasowych ich nazwy są wpisywane do pomocniczego rejestru informacji, oszczędzając czas utworzenia pliku;
- Podczas zwykłego przejścia procesu ostatnia operacja, która wymagała plików, przed jej zakończeniem, usuwa zarówno sam plik, jak i zapisy o nim w rejestrze pomocniczym;
- Pomocniczy rutynowe zadanie okresowo sprawdza, czy w rejestrze pomocniczym występują zapisy, których czas życia w oczywisty sposób przekracza czas zwykłego zakończenia procesu. Jeśli takie rekordy zostaną znalezione, zadanie usuwa pliki tymczasowe i rekordy o nich.
Transfer plików między klientem a serwerem
1. Pracując z plikiem na kliencie i na serwerze jednocześnie, musisz skorzystać z transferu plików przez magazyn tymczasowy (metody PlaceFile, PlaceFiles, Pobierz plik, Pobierz pliki, StartMiejscePlik, Umieść w magazynie tymczasowym, GetFromTempStorage). Ogólnie rzecz biorąc, klient i serwery klastra są różne komputery z innym systemem plików, a dostęp do plików może mieć różnych użytkowników systemu operacyjnego z różnymi uprawnieniami.
Niewłaściwie:
&OnClientProcedure ProcessFile() ... FileName = "C:/Pliki do przetworzenia/Load.xml"; Wynik = WykonajPrzetwarzanieNaSerwerze(NazwaPliku); ...EndProcedure&AtServerFunctionProcessAtServer(FileName) Read = NewReadText(FileName) ... Result = Read.Read(); Zwróć wynik; EndFunction
Prawidłowo:
&OnClientProcedure ProcessingFile() ...FileNameToProcess = "C:/Pliki do przetworzenia/Load.xml"; Adres = ""; PutFile(Adres, NazwaPlikuDoProcesu, NazwaPlikuDoProcesu, False); Wynik = PerformProcessingOnServer(Adres); ...EndProcedure&AtServerFunction PerformProcessAtServer(Adres) Data = GetFromTempStorage(Adres) IntermediateFileName = GetTemporaryFileName("txt"); Data.Write(NazwaPliku Pośredniego); Read = New ReadText(IntermediateFileName) ... Result = Read.Read(); ... UsuńPliki (NazwaPliku Pośredniego); Zwróć wynik; EndFunction
2. Aby zapisać dane w pamięci tymczasowej między kilkoma wywołaniami serwera, podczas umieszczania ich w pamięci należy użyć parametru Unikalny identyfikator formularza metoda PlaceFile, przekazując identyfikator aktualnego formularza . Takie wartości zostaną usunięte z ich tymczasowego przechowywania dopiero po zamknięciu określonego formularza. W takim przypadku, gdy ten sam plik zostanie ponownie umieszczony w pamięci tymczasowej, poprzednia wartość musi zostać usunięta ręcznie. Na przykład:
Niewłaściwie:
FilenameToProcess = "C:/Pliki do przetworzenia/Load.xml"; ... // Pierwsze wywołanie serwera Adres = ""; PutFile(Adres, NazwaPlikuDoProcesu, NazwaPlikuDoProcesu, False, UniqueIdentifier); Wynik = Wykonaj InitialProcessingOnServer(Adres);
... // Drugie wywołanie serwera z tą samą wersją pliku Result = Perform IntermediateProcessingOnServer(Address); ...
// Trzeci serwer wywołanie z Nowa wersja Adres pliku = ""; PutFile(Adres, NazwaPlikuDoProcesu, NazwaPlikuDoProcesu, False, UniqueIdentifier); Wynik = Wykonaj FinalbProcessingOnServer(Adres); ...
Pozostawia to dwie kopie plików w tymczasowym magazynie formularza. Adres drugiej kopii będzie w zmiennej Adres zamieszkania, a adres pierwszej kopii zostanie utracony. Prowadzi to do wydatkowania dodatkowych zasobów aplikacji, spowalniając pracę.
Prawidłowo:
FilenameToProcess = "C:/Pliki do przetworzenia/Load.xml"; ... // Pierwsze wywołanie serwera Adres = ""; PutFile(Adres, NazwaPlikuDoProcesu, NazwaPlikuDoProcesu, False, UniqueIdentifier); Wynik = Wykonaj InitialProcessingOnServer(Adres); ... // Drugie wywołanie serwera z tą samą wersją pliku Result = Perform IntermediateProcessingOnServer(Address); ...
// Trzecie wywołanie serwera z nową wersją pliku DeleteFromTempStorage(Adres); Adres = ""; PutFile(Adres, NazwaPlikuDoProcesu, NazwaPlikuDoProcesu, False, UniqueIdentifier); Wynik = Wykonaj FinalbProcessingOnServer(Adres); ...
Zobacz też
Znajdujemy się: dostęp do systemu plików, Pobierz nazwę pliku tymczasowego (
Pozwól, że opowiem Ci przypadek z mojej praktyki. Kiedyś musiałem skonfigurować przesyłanie danych do 1c księgowość z konfiguracji, której nie można replikować. Rozładunek odbywał się w formie odrębnego przerobu, działającego zgodnie z zasadami giełdy. Same reguły zostały dołączone jako pozorne dane binarne. Algorytm działania jest typowy – reguły są rozładowywane do pliku tymczasowego, a następnie podciągane przez przetwarzanie” giełda uniwersalna dane w formacie XML.
Twórca reguł i przetwarzania transferów bił się w piersi i przysiągł, że wszystko u niego działa dobrze. W praktyce podczas rozładowywania danych ciągle pojawiał się błąd. Tekst komunikatu o błędzie otwarcie mówił, że problem tkwi w zasadach giełdy. „Dokument nie ma już takiej właściwości, odmawiam rozładunku” – czytał tekst wiadomości. Nie chciałem majstrować przy zasadach wymiany, bo. praca nie jest moja. Zamiast tego otworzyłem kod przetwarzania i postanowiłem zobaczyć, jak zorganizowany jest proces przesyłania reguł wymiany do pliku tymczasowego.
Okazało się, że to był problem. Rzecz w tym, że programista nie zadał sobie trudu, aby stworzyć unikalną nazwę pliku dla reguł wymiany (w katalogu tymczasowym), a nawet wstawił czek: „Jeśli plik istnieje, wgrywanie nie jest wymagane”. Oczywiście wszystko działało, dopóki przetwarzanie, a raczej układ z regułami, nie został zaktualizowany. W rezultacie użytkownicy nieustannie próbowali przesyłać pliki przy użyciu przestarzałych reguł wymiany. „Plik tymczasowy” w katalogu „temp” stał się trwały i dopóki go ręcznie nie usuniesz, zawsze będzie używany do przesyłania.
Twórz pliki tymczasowe poprawnie
Aby uniknąć takich osobliwych sytuacji, nie należy próbować wymyślać na nowo koła i kul w postaci „przebiegłych” funkcji wykorzystujących obiekty COM. Wystarczy skorzystać z funkcji wbudowanej w platformę - GetTemporaryFileName(), który automatycznie rozwiązuje wiele problemów:
Zapewnia, że nazwa pliku jest naprawdę unikalna;
Jeśli programista zapomni samodzielnie usunąć plik, zostanie on usunięty przy następnym uruchomieniu platformy.
Automatyczne usuwanie plików tymczasowych podczas restartu platformy to bardzo ciekawa funkcja, teoretycznie pozwalająca programiście zapomnieć o konieczności samodzielnego usuwania plików. Prawda jest taka, że nie należy go nadużywać. Jeśli kod jest wykonywany na serwerze, musisz zrozumieć, że serwer może nie zostać ponownie uruchomiony przez długi czas, co oznacza, że folder tymczasowy będzie młotkiem niepotrzebne pliki. W związku z tym nie powinieneś całkowicie ufać „brudnej” pracy platformy. Lepiej jest użyć tej funkcji jako rozwiązania awaryjnego i dodać jeden dodatkowy wiersz kodu do kodu, aby wymuszone usunięcie plik tymczasowy.
Bardzo często użytkownicy mają dziwne błędy: dla jednego użytkownika program działa poprawnie, dla innego, w pobliżu, na innym komputerze, jest zupełnie inaczej. Często po długich postępowaniach okazuje się, że przyczyną takich „usterek” w 1C 8 jest pamięć podręczna.
Poniżej powiem ci, czym jest pamięć podręczna 1C i jak ją wyczyścić.
buforowanie— proces tworzenia bufora często używanych i zwykle statycznych informacji. Buforowanie służy do przyspieszenia działania programu, w szczególności w 1C pliki konfiguracyjne są ładowane na komputer użytkownika, aby nie żądać ich od serwera przy każdym dostępie.
Jednak bardzo często platforma 1C nieprawidłowo obsługuje buforowanie konfiguracji, w wyniku czego otrzymujemy nieodpowiednie zachowanie konfiguracyjne.
Przyczyny nieprawidłowego zachowania mogą być różne: dynamiczna aktualizacja konfiguracji, awarie oprogramowania lub sprzętu.
Pierwszym sposobem jest ręczne wyczyszczenie pamięci podręcznej 1C
Aby rozwiązać problemy i „usterki” 1C, zwykle pomaga wyczyszczenie pamięci podręcznej platformy 1C 8.3.
Odbywa się to w następujący sposób:
krok 1
Znajdź katalog, w którym przechowywane są pliki tymczasowe 1C, można je zobaczyć w menu ustawień na liście IB:
2 kroki
Mamy adres jak
Uzyskaj 267 lekcji wideo 1C za darmo:
C:\Documents and Settings\nazwa użytkownika\Dane aplikacji\1C\1Cv82\tmplts\1c
Foldery pamięci podręcznej znajdują się w
C:\Documents and Settings\nazwa użytkownika\Dane aplikacji\1C\1Cv82\
*gdzie nazwa użytkownika to nazwa użytkownika systemu, a folder 1Cv82 może się różnić w zależności od wersji platformy 1C
Idąc tam znajdziemy wiele (liczba folderów jest równa liczbie konfiguracji) interesujących folderów:
Wszystkie wybrane katalogi to pamięć podręczna DB 1C, można je bezpiecznie usunąć. Przed usunięciem należy wylogować się z IB.
Jeśli nie masz ochoty szukać, gdzie znajdują się pliki, możesz użyć program specjalny(plik bat), który czyści foldery z plikami tymczasowymi - pobierz. Pamiętaj, że używasz ich na własne ryzyko. Zawierają następujące polecenie:
rmdir "%AppData%\1C\1Cv8" /S /Q
rmdir "%LOCALAPPDATA%\1C\1Cv8" /S /Q
Drugim sposobem na wyczyszczenie plików tymczasowych 1C jest usunięcie bazy danych z listy
Drugi sposób jest prostszy, ale nie do końca poprawny. Do czyszczenia wystarczy skasować tę konfigurację i utworzyć nową z tą samą ścieżką do IB.
W rezultacie stary folder z pamięcią podręczną „usunie” ten IB i zostanie utworzony nowy katalog.
Możesz to zrobić w ten sposób, pamięć podręczna jest czyszczona, ale pliki tymczasowe pozostają na dysku twardym.
Trzeci sposób to parametr ClearCache
Konieczne jest wpisanie polecenia /Wyczyść pamięć podręczną. Przykład użycia:
Wideo na temat czyszczenia pamięci podręcznej w programach 1C:
Jeśli „usterki” w 1C nie zniknęły po wyczyszczeniu pamięci podręcznej, a 1C nie działa tak, jak chcesz, możesz się do niego odwołać.
Jeśli zaczynasz uczyć się programowania 1C, polecamy nasze bezpłatny kurs(nie zapomnij zasubskrybuj youtube - nowe filmy są regularnie publikowane):
Więc jaki jest sens mojego artykułu?
1. Jest serwer (x64), z zainstalowanym pakietem Office 2016 (x64), jest 1C 8.3.8 również x64 (co oznacza serwer 1C). Użytkownicy łączą się zarówno za pośrednictwem cienkiego klienta, jak i klienta internetowego.
2. Istnieje wiele wzorców umów i faktur wystawianych (przygotowywanych) przez dział handlowy. Jest czcionka, akapit itp., oczywiście wszystko jest zaprojektowane w programie Word, Excel 2016 (x64), oczywiście nie ma ochoty rysować tego wszystkiego w 1C, ale istnieje chęć włożenia go do ActiveDocument układy formatu
Wydaje się, że decyzja jest banalna :) , nie będę opisywał całego mechanizmu jak to się robi, w jaki sposób dane z 1C są wypełniane do układu ActiveDocument - myślę, że beze mnie doskonale o tym wiesz. Ale w trakcie prac okazało się, że w królestwie nie wszystko jest takie gładkie Obiekt COM ow, a mianowicie:
2. Którą opcję lepiej wybrać: ActiveDocument czy BinaryData? Chociaż dla mnie brzmi to jak wybrać Wódkę Z Piwem czy Piwo Z Wódką :) . Jedna ilustracja, musisz wypełnić dokumenty danymi z 1C i przekazać je Klientowi.
No dobra, pomińmy teksty, wybieram ActiveDocument, nie będę opisywał całego algorytmu, po prostu wymienię „pułapki” i ich rozwiązanie. Wszystko to jest moim osobistym wymysłem iw żaden sposób nie twierdzi, że jest ostateczną prawdą. Być może rozwiązałeś te problemy lub rozwiązałeś je w inny sposób.
1. Kamień ” pierwszy". Metoda SaveAs nie działa (zarówno dla MSWord, jak i MSExcel). Podczas próby pisania BinaryData, 1C po prostu się zawiesza. Patrzymy na fragment listy:
MSWord = Układ.Pobierz(); Próba dokumentu = MSWord.Application.Documents(1); Dokument.Aktywuj(); //Następnie pobierz dane i wypełnij dokument Worda //Pobierz ścieżkę w katalogu tymczasowym, aby zapisać tam plik TimeName = GetTemporaryFileName(.docx"); Document.SaveAs(NazwaGodzina); //stone zaczyna się tutaj MyDocumentInBinaryData = New BinaryData(NameTime); //no, tutaj ten kamień wybija 1C :) MSWord.Application.Quit();
Wielkie dzięki.
Utwórz foldery
C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\Desktop
Rozwiązać problem. Temat zamknięty.
Jaki jest powód? Powodem jest to, że kod
MSWord = Układ.Pobierz();
Zawsze wywołuje wystąpienie obiektu COM (x32) bez względu na to, jaki pakiet Bitness Office jest zainstalowany. Czy zastanawiałeś się kiedyś, dlaczego plików z rozszerzeniem docx, xlsx nie można wstawić do układu ActoveDocument
można to również sprawdzić za pomocą Menedżera zadań, ale faktem jest, że układ ActiveDocument niejawnie wywołuje wystąpienie COM (x32) i dlatego wszystkie dalsze manipulacje muszą być wykonane z uwzględnieniem tej funkcji.
1. Serwer i całe oprogramowanie muszą mieć x32. Wtedy nie musisz nic robić (w sensie przepisywania kodu)
2. Albo przepisz kod w taki sposób
// pobierz tymczasową nazwę pliku TempFile = GetTemporaryFileName("doc"); // ten kod dokładnie wywoła instancję COM o wymaganej bitowości, w naszym przypadku x64 Word = New COMObject("Word.Application"); word.displayalerts = 0; DokumentN = Słowo.Aplikacja.Dokumenty.Dodaj(); DocumentH.SaveAs(PlikCzasu,0); Słowo.Zakończ(); // wtedy wszystko jest jak poprzednio Layout = PrintControl.PrintFormLayout("Document.Equipment Transfer Certificate."+LayoutName); MSWord = Układ.Pobierz(); Próba dokumentu = MSWord.Application.Documents(1); Dokument.Aktywuj(); // tu coś zrób, wypełnij dane // tu ponownie zapisujemy nasz plik z COM x62 na COM x64 MSWord.Application.Selection.WholeStory(); MSWord.Application.Selection.Copy(); DocumentH = MSWord.Aplikacja.Dokumenty.Open(PlikCzasu); DokumentH.Aktywuj(); MSWord.Application.Selection.Paste(); DocumentH.SaveAs(PlikCzasu,0); DokumentN.Zamknij(); msword = niezdefiniowane; Wyjątek // W przypadku wystąpienia błędu wyświetlane są dane błędu i obiekt jest zamykany. Informacja = Informacja o błędzie(); General PurposeClientServer.NotifyUser("Error - "+Information.Description+" kod błędu - "+Abbr(Information.SourceString)); MSWord.Aplikacja.Zakończ(); Koniec próby;
Myślę, że tutaj wszystko jest jasne, najpierw utworzyliśmy instancję COM o wymaganej głębi bitowej, utworzyliśmy pusty plik i zapisaliśmy go w folderze tymczasowym, potem działa z COM x32, wypełnia go danymi i na końcu kopiuje zawartość całego dokument i zapisuje go do wcześniej przygotowanego pliku.
Wszystko jedno, ale tylko dla Excela
TempFile = GetTempFileName("xls"); Excel = Nowy COMObject("Excel.Aplikacja"); Excel.WyświetlaczAlerty = 0; KsiążkaH = Excel.Książki.Dodaj(); ArkuszN = KsiążkaN.Arkusze robocze(1); BookH.SaveAs(PlikCzasu, -4143); Excel.Zakończ(); Layout = PrintControl.PrintFormLayout("Dokument.Faktura za sprzęt."+LayoutName); MSExcel = Układ.Pobierz(); SkoroszytH = MSExcel.Application.Workbooks.Open(TimeFile); ArkuszN = KsiążkaN.Arkusze robocze(1); Próba WBook = MSExcel.Application.Workbooks(1); Arkusz = WBook.Worksheets(1); Liść.Aktywuj(); // zrób coś, wypełnij danymi z 1C MSExcel.Application.WorkBooks(1).WorkSheets(1).Cells.Copy(SheetN.Cells); KsiążkaH.Zapisz(); KsiążkaN.Zamknij(); Wyjątek // W przypadku wystąpienia błędu wyświetlane są dane błędu i obiekt jest zamykany. Informacja = Informacja o błędzie(); General PurposeClientServer.NotifyUser("Error - "+Information.Description+" kod błędu - "+Abbr(Information.SourceString)); MSExcel.Aplikacja.Zakończ(); Koniec próby;
Proszę bardzo " pierwszy„Stone, który rozwiązałem, na serwerze x64 z Office x64 wszystko działa jak w zegarku, bez błędów i bez potrzeby tworzenia folderów i wszystkiego.
Złóg " druga„. fragment kodu
TempFile = GetTempFileName("xls");
nie jest bardzo dobrze, ponieważ pisze do folderu: "c:\Users\ co tam jest ....", ogólnie ten folder jest zawsze na czarnej liście przez wszystkie zapory, programy antywirusowe itp., itd., przynajmniej otwórz Centrum kontroli bezpieczeństwa programu Word lub Excel. Zajrzyjmy tam też
trzeba się z tym bawić, w przeciwnym razie istnieje możliwość "dziwnych" błędów. Dlatego proponuję:
1. Otwórz Konfigurator i dodaj nowy Rejestr informacji
tutaj będziemy przechowywać nasze gotowe Słowo, pliki Excel już wypełnione, oczywiście:
NazwaUkładu — Identyfikator układu
Dokument biurowy - Magazyn wartości, tutaj przechowujemy gotowy plik
2. Dodajemy kod napisany powyżej w następujący sposób:
MZ =Informacje o rejestrach.Miejsce do przechowywania tymczasowego.Utwórz menedżera rekordów(); MZ.Obiekt = Wybór.Odniesienie; MZ.NazwaUkładu = NazwaUkładu; MZ.Odczyt(); MZ.Obiekt = Wybór.Odniesienie; MZ.NazwaUkładu = NazwaUkładu; MZ.DocumentOffice = NewValueStorage(NewBinaryData(TempFile)); MZ.Zapisz(); UsuńPliki (Plik Szablonowy);
Co robimy, zapisujemy gotowy plik do rejestru informacyjnego, a następnie usuwamy sam plik tymczasowy, rozwiązujemy problem "Word, Excel Security Center". Pozostaje tylko jedna rzecz, aby pokazać Klientowi gotowy plik (klient cienki i internetowy)
3. Kamień ” trzeci" - przeniesienie pliku do klienta, tu tylko cały kod wyślę, wziąłem coś z BSP, coś z konfiguracji demo "Aplikacja zarządzana", coś z internetu, ale w ogóle kod tutaj (w całości )
//////////////////////////////////////////////// / //////////////////////////////// PROCEDURY SERWISOWE I FUNKCJE BSP &AtServer Funkcja GetLayout() ObjectReference = DataStructure.Object; LayoutName = DataStructure.LayoutName; RecordKey = DataRegisters.Office TemporaryStorage.CreateRecordKey(Nowa struktura("Obiekt,NazwaUkładu",OdniesienieObiektu,NazwaUkładu)); // Adres = GetNavigationLink(RecordKey,"OfficeDocument"); Adres zwrotny; EndFunction // Procedura &OnClient AfterApplicationStart(ReturnCode, ApplicationName) Export; // EndProcedure &AtClient Procedura AfterFilesReceived(SubmittedFiles, AdditionalParameters) Eksportuj If NOT SubmittedFiles=Niezdefiniowany Następnie dla każdego opisu z pętli SubmittedFiles OpAfterApplicationStart = NewAlertDescription("AfterApplicationStart", ThisObject, Description.Name); StartApplicationStart(OpAfterApplicationStart, Opis.Nazwa); Zakończ cykl; EndIf; EndProcedure &OnClient Procedura AfterDirSelect(SelectedFiles,CommandName) Eksportuj If FilesSelected = Undefined Then Return; EndIf; Katalog = SelectedFiles; Ogólnego przeznaczeniaCallServer.SaveWorkingDirectory(Directory); If CommandName = "Faktura" Then LayoutName = "Faktura" EndIf; DataStructure.Insert("Katalog", Katalog); ConnectWaitingHandler("Connected_TransferFileToClient",5,True); EndProcedure &OnClient Procedure OpenFilesViaExtension(CommandName) OpAfterCatalog Selection = New AlertDescription("Po wyborze katalogu", ThisObject, CommandName); Katalog = Ogólne przeznaczenieCallServer.GetWorkingDirectory(); If Directory = Undefined OR Directory = "" Then Dialog = NewFileChoiceDialog(FileChoiceDialogMode.CatalogChoice); Dialog.Title = НStr("ru = "Wybierz katalog do tymczasowego przechowywania plików"", "ru"); Dialog.Show (OpAfterCatalog Selection); Else SelectedFiles = Nowa tablica; SelectedFiles.Add(Katalog); ExecuteAlertProcessing (OpAfterSelectingCatalog, SelectedFiles); EndIf; EndProcedure &OnClient Procedura HandleFileWorkingExtensionConnection(ExtensionConnected,AdditionalParameters) Eksportuj, jeśli ExtensionConnected, a następnie OpenFilesViaExtension(AdditionalParameters.CommandName); EndIf; EndProcedure &AtClient Procedura Connected_PassFileClient() Adres = GetLayout(); Jeśli adres<>Undefined Then DisableWaitingHandler("Connected_PassFileClient"); NumerDokumentu = StrukturaDanych.NumerDokumentu; Katalog = Struktura danych.Katalog; LayoutName = DataStructure.LayoutName; ŚcieżkaDoPliku = Katalog+"\"+NazwaUkładu+"_#"+NumerDokumentu+".xls"; Description = Nowy opis przesyłanego pliku (ścieżka do pliku, adres); PrzeniesionePliki = Nowa tablica; PrzeniesionePliki.Dodaj(Opis); StartReceiveFiles(NewNotificationDescription("Po otrzymaniuPlików", ThisObject), PrzeniesionePliki, "", False); EndIf; EndProcedure &AtServer Procedura ExecutePrintServer() ObjectReference = DataStructure.Object; LayoutName = DataStructure.LayoutName; DataStructure.Insert("NumerDokumentu", NumerReferencjiObiektu); ArrayObjects = Nowa tablica; ArrayObjects.Add(ObjectReference); Documents.InvoiceEquipment.PrintInvoice(ArrayObjects,LayoutName,True); EndProcedure &OnClient Procedura Connected_ExecutePrint() ExecutePrintServer(); EndProcedure // StandardSubsystems.Print &OnClient Procedura Connected_ExecutePrintCommand(Command) Reference = Items.List.CurrentData.Reference; Struktura Danych = Nowa struktura; DataStructure.Insert("Obiekt", Link); DataStructure.Insert("NazwaUkładu", "Faktura"); ConnectWaitingHandler("Connected_PerformPrint", 1, Prawda); CommandDescription = PrintControlClient.PrintCommandDescription(Polecenie.Nazwa,NazwaFormularza); RozpocznijInstalowanieRozszerzeńPlikWorking(); StartFileExtensionConnection(New AlertDescription("ProcessFileExtensionConnection",ThisObject,New Structure("CommandName",CommandDescription.Identifier)))); EndProcedure // End StandardSubsystems.PrintKilka wyjaśnień:
1. Po pierwsze, klient pracuje dla nas zarówno w trybie Thin jak i Web, dlatego z góry ustawiamy następujące wartości we właściwościach Konfiguratora:
Aby uniknąć problemów podczas pracy z przeglądarką
2. Używamy obsługi oczekiwania, aby uniknąć problemów z synchronizacją połączeń (dotyczy to tylko trybu Web)
3. I na koniec podłączamy rozszerzenie do pracy z plikami (pamiętaj, że w trybie cienkiego klienta to rozszerzenie jest zawsze włączone). I poprzez kod:
przesyłamy plik do Klienta za pomocą mechanizmu NavigationLink, w przeglądarce otrzymujemy następujące komunikaty (Slim działa sam):
Cóż, wydaje się, że to wszystko. Mam nadzieję, że to komuś pomoże...
Czy chodzi o pliki Word, Excel do wstawienia w postaci BinaryData? Jaki jest problem?
1. Musimy albo wyciągnąć te BinaryData z układu i wypełnić je danymi z 1C i UWAGA ponownie zapisać je w postaci BinaryData (Wódka Z Piwem lub Piwo Z Wódką)
2. Albo musimy pobrać układ BinaryData po stronie Klienta i tam go wypełnić, ALE obiekt COM jest obsługiwany tylko przez przeglądarkę IE a potem z tańcami z ustawieniami ActiveX, inne przeglądarki dawno zrezygnowały z używania ActiveX