Połączenia z obiektem com kalkulatora. Trzy wieloryby pracują z obiektami COM. Praca nad połączeniem COM jest łatwiejsza niż mogłoby się wydawać. Nawiąż połączenie OLE
Słowa kluczowe: COM, połączenie, zewnętrzne, OLE, Automatyzacja, Połącz, ComConnector, Srvr
W przypadku korzystania z połączeń 1C:Enterprise 8.0 COM w celu uzyskania dostępu do danych istnieją następujące zalety w porównaniu z korzystaniem z serwera automatyzacji:
- Więcej szybka instalacja połączenie, ponieważ nie jest wymagany oddzielny proces system operacyjny, a wszystkie akcje są wykonywane w procesie wywołującym;
- Szybszy dostęp do właściwości i metod obiektów 1C:Enterprise, ponieważ organizacja odwołania nie wymaga organizacji komunikacji międzyprocesowej;
- Mniejsze zużycie zasobów systemu operacyjnego.
Ogólnie rzecz biorąc, praca z 1C:Enterprise 8.0 za pośrednictwem połączenia COM jest podobna do pracy z 1C:Enterprise w trybie serwera automatyzacji. Główne różnice są następujące:
- W przypadku serwera automatyzacji uruchamiana jest pełnoprawna aplikacja 1C:Enterprise 8.0, aw przypadku połączenia COM uruchamiany jest stosunkowo niewielki serwer COM w procesie.
- Podczas pracy przez połączenie COM nie są dostępne funkcjonalność w taki czy inny sposób związany z organizacją interfejsu użytkownika 1C: Enterprise 8.0;
- Podczas pracy z połączeniem COM moduł aplikacji konfiguracyjnej 1C:Enterprise 8.0 nie jest używany. Jego rolę podczas pracy z połączeniem COM pełni zewnętrzny moduł połączeń.
1.1 Jak nawiązać połączenie COM
Aby zorganizować dostęp do danych 1C:Enterprise 8.0 za pośrednictwem połączenia COM, wykonywana jest następująca sekwencja działań:
- tworzony jest obiekt COM o identyfikatorze V8.COMConnector , za pomocą którego nawiązywane jest połączenie;
- wywoływana jest metoda Connect wcześniej utworzonego obiektu V8.COMConnector. Metoda Connect zwraca odwołanie do obiektu połączenia COM z baza informacji 1C: Przedsiębiorstwo 8.0;
- poprzez otrzymany obiekt połączenia COM uzyskuje się dostęp do dozwolonych metod, właściwości i obiektów infobazy, z którą nawiązywane jest połączenie.
Ważny! Ze względu na brak interfejsu użytkownika w połączeniu COM nie wszystkie obiekty, a także właściwości i metody mogą być używane w połączeniu COM.
1C: Obiekty korporacyjne dostępne z zewnątrz przez połączenie COM:
- Wyeksportowane zmienne i procedury/funkcje modułu Outer Link
- Wyeksportowane zmienne i procedury/funkcje wspólnych modułów
- Dołączanie i wykluczanie całych modułów przez ustawienie właściwości modułu współdzielonego
- Dołączanie i wykluczanie fragmentów popularnych modułów przy użyciu preprocesora
- Kontekst globalny 1C:Enterprise 8.0, z wyjątkiem obiektów, które są sztywno powiązane z aplikacją kliencką (TextDocument, SpreadsheetDocument, ...)
1.2 Zewnętrzny moduł połączeniowy
Jak już wspomniano, obowiązki modułu aplikacji podczas pracy przez połączenie COM są wykonywane przez zewnętrzny moduł połączenia. Moduł ten może posiadać procedury obsługi zdarzeń AtStartSystemWork() i AtShutdownSystem(), które mogą zawierać akcje do wykonania odpowiednio podczas inicjowania i kończenia połączenia.
Procedury, funkcje i zmienne globalne zdefiniowane w module złączenia zewnętrznego za pomocą słowo kluczowe Eksporty stają się, tak jak w przypadku modułu aplikacji, częścią kontekstu globalnego.
1.3 Moduły ogólne
Właściwości "Client", "Server" i "ExternalConnection" zostały wprowadzone dla typowych modułów. Mają one na celu zdefiniowanie w konfiguracji wykorzystania modułów w wersji klient-serwer oraz w trybie połączenia COM.
1.4 Obiekt "V8.COMConnector"
Jedynym zadaniem rozwiązywanym przez obiekt COM V8.COMConnector jest nawiązanie połączenia COM z bazą danych 1C:Enterprise 8.0. Za pomocą pojedynczej instancji obiektu V8.COMConnector można nawiązać nieograniczoną liczbę połączeń. Obiekt V8.COMConnector ma pojedynczą metodę Connect, która służy do nawiązywania połączenia COM z bazą danych 1C:Enterprise 8.0.
<СтрокаСоединенияИБ>
Ciąg połączenia IB to łańcuch fragmentów w postaci Parametr=Wartość. Fragmenty są oddzielone od siebie znakiem „;”. Jeśli wartość zawiera znaki odstępu, musi być ujęta w cudzysłów (").
Wspólne parametry:
usr - nazwa użytkownika;
hasło - hasło.
Dla wariantu pliku zdefiniowany jest parametr:
Plik - katalog infobazy.
Dla wersji klient-serwer zdefiniowane są następujące parametry:
Srvr - 1C: Nazwa serwera Enterprise;
Ref - nazwa infobazy na serwerze.
Metoda Connect nawiązuje połączenie COM z bazą danych 1C:Enterprise 8.0 i zwraca odwołanie do obiektu połączenia COM.
// tworzony jest obiekt łącznika
V8 = Nowy COMObject("V8.COMConnector");
// utwórz obiekt połączenia COM
Połączenie = V8.Connect("Plik=""c:\InfoBases\Trade""; Usr =""Dyrektor"";")
1.5 Obiekt "Połączenie COM"
Połączenie COM z bazą danych 1C:Enterprise zapewnia pełny dostęp do jego globalnego kontekstu (zobacz „Kontekst wykonania moduł oprogramowania"). W związku z tym połączenie COM może mieć jako swoje metody: stałe systemowe, wartości obiektów określonych w konfiguratorze, dostępne za pomocą menedżerów (na przykład stałe, wyliczenia, katalogi, dokumenty, logi dokumentów, raporty, przetwarzanie, plany typów charakterystyk, kont planów, planów typu obliczeń, rejestrów), a także zmiennych zadeklarowanych w module połączeń zewnętrznych za pomocą słowa kluczowego Export.
Dodatkowo połączenie COM posiada dodatkową metodę NewObject, którą można wykorzystać do tworzenia wartości określonych typów.
ts = Połączenie. NewObject("TabelaWartości");
Metoda ciągów Umożliwia uzyskanie reprezentacji ciągów wartości 1C:Enterprise.
Widok = Connection.String(Data.UniqueIdentifier());
1.6. Cechy pracy z połączeniem COM
W automatyzacji i na połączeniu COM TRUE i FALSE mają odpowiednio wartości -1 (minus jeden) i 0.
Istnieje możliwość zorganizowania puli połączeń COM. Jednocześnie na hoście na serwerze 1C:Enterprise w ADVANCE tworzonych jest kilka obiektów połączenia COM, a nawiązanie połączenia zajmuje jeszcze mniej czasu, ponieważ nie ma potrzeby tworzenia nowego obiektu.
Zaimplementowano nowy obiekt konstruktora zapytań, przeznaczony do generowania tekstów zapytań na podstawie określonych ustawień. Ten obiekt obsługuje funkcję kreatora raportów inną niż wysyłanie raportu do dokument w arkuszu kalkulacyjnym i inne zadania związane z interfejs użytkownika. Ten obiekt może być używany na serwerze 1C:Enterprise i w połączeniu COM.
Korzystanie z obiektów COM jest dostępne, gdy wbudowany język działa na serwerze 1C:Enterprise.
Błędy COM są tłumaczone na wyjątki 1C:Enterprise.
Jeśli konfiguracja próbuje utworzyć nieprawidłowy obiekt, taki jak dokument arkusza kalkulacyjnego, w zewnętrznym module połączenia, wspólnym module lub module obiektu, połączenie COM może nie zostać nawiązane lub zakończone z wyjątkiem wyjątku.
) Zgadza się
Jednocześnie nie raz widziałem, jak publikacje po prostu „startują”, które nie ciągną nawet 10 punktów.
Dlaczego się to stało? Pewnie dlatego, że ktoś najwyraźniej je lubił.
Mówię o tym i mówię, że fajnie byłoby nie czytać artykułu oceniając, aby zrozumieć, jak bardzo go potrzebujesz, lub oceniać go nie tak prymitywnie +/-. Co do tego, co mi się podobało, poprawiłbym to tak: zdobyła tyle punktów ze względu na to, że gwiazdy uformowały się w taki sposób i dużo ludzi zgromadziło się na stronie i wielu to polubiło, sam rozumiesz, że to kwestia przypadku. jak tylko artykuł wyjdzie strona główna wtedy można go już znaleźć tylko na życzenie, a więc wszyscy przechodzą głosami. A do wsparcia na stronie głównej, o ile rozumiem, pozwalają tylko na ciągłe komentarze = promocja artykułu.
Właśnie po to stawiają sklepy na ulicach arterii – w końcu często nie liczy się jakość i trafność produktu, ale drożność miejsca, ludzie często spacerujący kupują to, co wyrzucą następnego dnia, tylko ze względu na proces. To dobrze znana choroba - shopomania. Lub po prostu zwiększenie przepływu zwiększa prawdopodobieństwo odpowiedniego nabywcy.
A plusy i minusy… to tylko swego rodzaju „dziękuję” za poświęcony czas i pracę
Tych. Czy minus też liczy się jako „dziękuję”? Chciałem więc poznać twoje podejście do tego, czy w takich przypadkach trzeba to stawiać i jak ciekawie myślą inni? Niezależnie od tego, czy umieścić go, gdy artykuł jest szkodliwy / zły, czy po prostu jest dla ciebie bezużyteczny / pusty.
Moim zdaniem artykuł wygląda jak podniesienie oceny, ponieważ:
1. Problem z podanymi przeze mnie typami został przez autora generalnie zignorowany, chociaż nie był zbyt leniwy, żeby napisać masę komentarzy.
2. W artykule jest wyraźna nieścisłość: mówi się, że to jedyny sposób
V82 = Nowy obiekt COM("V82.ComConnector"); Kod = KontrahentCOM.Kod;
ale spokojnie robię to za pomocą przetwarzania tak:
Notify(Base.Directories.Counterparties.FindBy Name("LLC").Code);
i wszystko jest w porządku! I wybieram połączenie V82.ComConnector
Dziwne, że autorowi w ogóle nie zależy na tym, że jego artykuł zawiera takie problemy, które zostały wypunktowane, ale w żaden sposób nie reaguje.
3. Ale nadal jest problem, gdy wyskakuje błąd „Klasa nie istnieje”
4. Ale jest problem, gdy jest zainstalowany 8.2, a potem 8.1 jest zainstalowany - spróbuj wymienić przez OLE/COM z typową wymianą UT-BP!
5. Czy mógłbyś wskazać główne przetwarzanie w serwisie, które pozwala na uniwersalne łączenie się przez OLE/COM aby początkujący nie tracili czasu, piszesz dla nich! Nawiasem mówiąc, z jakiegoś powodu jej zdjęcie pyszni się z tobą, dlaczego? W rezultacie 2 słowa o meritum i 6 więcej za kulisami.
Generalnie nie obrzucam Cię błotem, tylko zaznaczam konkretne luki, ale nie ma reakcji. Jeśli jest to doświadczenie, którym się dzielisz, to jest ono w jakiś sposób błędne i niekompletne.
Chodzi mi o to, że gdyby autor miał ochotę zebrać wszystkie usterki, mógłby przynajmniej posłuchać cudzych doświadczeń, a nie kpić z komentarzy. Od razu dochodzi do sytuacji, że ten, kto ją czyta, wie więcej od autora, mówi mu (czasem niepoprawnie), a on też walczy. W rezultacie wszystkie informacje nie znajdują się w artykule, ale w komentarzach! Zabawny! Często się to zdarza, ale jednocześnie nie musisz opierać się na tym, czego chciałeś najbardziej – ja pokazuję, jak jest lepiej, a inni to pokazują! Dołącz to do artykułu, a warto, nie wszyscy są zainteresowani czytaniem tej potyczki.
Jedną z opcji wymiany danych między bazami danych 1C jest wymiana za pośrednictwem połączenia COM.
Używając Połączenia COM możesz łączyć się z jednej bazy danych 1C do drugiej i czytać lub zapisywać dane. Metodę tę można stosować zarówno w wariantach baz danych klient-serwer, jak i w bazy danych plików. W tym artykule przeanalizujemy przykłady takich związków. Przykłady wykorzystują platformę 8.2.
Możesz utworzyć dwa typy obiektów COM dla aplikacji 1C. to V82.Aplikacja oraz Złącze V82.COM. W przypadku V82.Aplikacja uruchomiona zostaje prawie pełnoprawna kopia aplikacji 1C. w przypadku użycia Złącze V82.COM mała część serwerowa jest uruchomiona.
Szybkość pracy w tym przypadku jest wyższa, ale niektóre funkcje mogą być niedostępne. W szczególności praca z formularzami oraz ze wspólnymi modułami, dla których nie jest ustawiona właściwość pracy z połączeniami zewnętrznymi. Powinieneś głównie używać Złącze V82.COM i tylko w przypadku braku funkcjonalności V82.Aplikacja. Różnica w szybkości może być szczególnie zauważalna w przypadku dużych baz danych.
Więc zacznijmy
- Stwórzmy obiekt COM
- dla V82.Aplikacja Połączenie = Nowy COMObject("V82.Application" );
- dla Złącze V82.COM Połączenie = Nowy COMObject("V82.COMConnector" );
- Stwórzmy ciąg połączenia
- dla wersji serwera bazy danych ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
- dla wersji pliku bazy danych ConnectionString = "File = " "PathKBase" "; Usr = Nazwa użytkownika; Hasło = Hasło";
- Nawiązywanie połączenia z bazą danych Próba połączenia = Połączenie. Połącz(CiągPołączenia) ; Komunikat wyjątku = Nowa wiadomośćDoUżytkownika; Wiadomość. Tekst = + DescriptionErrors(); Wiadomość. Zgłosić() ; KoniecSpróbuj ;
- Odłączanie od bazy Połączenie = Niezdefiniowane ;
Dla obiektu V82.Aplikacja połączenie jest obowiązkowe, w przeciwnym razie niekompletna sesja pozostanie zawieszona, którą następnie trzeba będzie usunąć ręcznie. W przypadku Złącze V82.COM połączenie zostaje automatycznie zerwane po zakończeniu procedury, w której połączenie zostało nawiązane.I jest jeszcze jeden mały moment.
Dla użytkownika, w ramach którego nawiązywane jest połączenie, pole wyboru „Pytaj o potwierdzenie przy zamykaniu programu” w jego ustawieniach musi być wyłączone.
A teraz ułóżmy cały kod razem
Połączenie = Nowy COMObject("V82.Application" ); //Połączenie = Nowy COMObject("V82.COMConnector"); ConnectionString = "Srvr = ""Server1C"";Ref = ""MyBase""; Usr = Peter; Pwd = 123" ; //ConnectionString = "Plik = ""С:\MyBase""; Usr = Peter; Pwd = 123"; Próba połączenia = Połączenie. Połącz(CiągPołączenia) ; Komunikat wyjątku = Nowa wiadomośćDoUżytkownika; Wiadomość. Tekst = "Nie można połączyć się z bazą danych"+ OpisBłąd(); Wiadomość. Zgłosić() ; KoniecSpróbuj ; Połączenie = Niezdefiniowane ;
Dla typu połączenia V82.Aplikacja metoda jest stosowana do obiektu COM, który został pierwotnie utworzony, a dla Złącze V82.COM metoda jest stosowana do połączenia. dalsza praca z wnioskiem idzie standardowe środki 1C. w kodzie wygląda to tak:
Żądanie = Połączenie. NewObject("Żądanie") ; // dla Złącze V82.COM Żądanie = Połączenie. NewObject("Żądanie") ; // dla V82.Aplikacja Żądanie. Tekst = „WYBIERZ | Stanowiska organizacji Kodeks, | Stanowiska organizacji Nazwa| OD | Katalog Stanowiska organizacji AS Stanowiska organizacji ”; Wynik = żądanie. Wykonać () ; Próbka = Wynik. Wybierać() ; Podczas selekcji. Dalej() Cykl EndCycle ;
W wersji 1C:Enterprise 8.3 wszystko pozostaje niezmienione, z wyjątkiem tego, że podczas tworzenia COMObjects musisz użyć "V83.COMZłącze" lub V83.Aplikacja.
Cześć Khabravchans!
W tym artykule chcę opowiedzieć o tym, jak w mojej organizacji powstaje integracja z platformą 1C. To, co skłoniło mnie do tego, to prawie całkowity brak Specyfikacja w tym temacie. Czytając różne artykuły i raporty na temat łączenia 1C z dowolnym systemem informacyjnym, jesteś ciągle przekonany, że wszystkie mają charakter marketingowy, demonstracyjny, a nigdy techniczny, odzwierciedlający problem i istotę jego rozwiązania.
Ostrzegam, że metoda w żaden sposób nie pretenduje do miana uniwersalnej. Ponieważ istnieje wiele samych konfiguracji 1C i systemy informacyjne, języki i platformy – co więcej, liczba możliwych kombinacji jest ogromna. Moim celem jest zademonstrowanie jednego możliwego rozwiązania.
Jako język, który będzie integrował się z 1C, wybrałem Pythona. Bardzo dobrze nadaje się do automatyzacji procesów. Ułatwia to minimalistyczna składnia (kod jest wpisywany bardzo szybko), bogata biblioteka standardowa (mniejsze zapotrzebowanie na moduły firm trzecich), wieloplatformowość - z dużym prawdopodobieństwem kod napisany w Linix OS będzie działał z powodzeniem w Okna.
Na początek przedstawię dane, z którymi będziemy pracować. Organizacja - firma energetyczna w regionie Dalekiego Wschodu - obsługuje około 400 tysięcy abonentów, podstawa to 1C na własnej konfiguracji. Dla każdego abonenta przechowywane są jego płatności, rozliczenia międzyokresowe, zużyte usługi i schematy obliczeniowe, urządzenia pomiarowe, odczyty i wiele innych danych.
Kiedyś w organizacji był program napisany w Delphi i wykorzystujący MSSQL/Firebird jako bazę danych. W tamtych czasach można było łączyć się z bazą w dowolnym języku i wykonywać wiele czynności - wybierać subskrybentów dłużników, księgować otrzymane wpłaty, rejestrować odczyty instrumentów. Nic dziwnego, że zbiór skryptów automatyzujących rutynę stale się powiększa. Programiści mogli wykonać dowolną akcję bez otwierania samego programu.
Niestety, wraz z przejściem na 1C zakończył się freebie - nie było już możliwe bezpośrednie połączenie z bazą danych. Ogólnie rzecz biorąc, sama platforma 1C jest niepodzielna i słabo zintegrowana z innymi systemami. Jest, jak mówią, rzeczą samą w sobie. Podczas ładowania danych do 1C należy pamiętać, że wyodrębnienie ich stamtąd nie będzie takie łatwe. Ale w związku z tym, że organizacja była zobowiązana do wdrożenia systemów płatności i Obszar osobisty, trzeba było znaleźć rozwiązanie.
Głównymi zadaniami, z jakimi się zmierzyłam, była umiejętność szybkiego pozyskania danych na temat konkretnego konto osobiste- Imię i nazwisko, adres, urządzenia pomiarowe, odczyty przyrządów, płatności, opłaty. Plus tworzenie dokumentów - akt pojednania, pokwitowanie płatności. Nie ma więc możliwości bezpośredniego połączenia z bazą danych - każdy, kto przejrzał bazę danych 1C na serwerze SQL, zauważył, że trudno to rozgryźć w masie tabel jak aaa1, aaa2. A budowanie zapytań z takimi nazwami tabel i pól jest po prostu nierealne. Ponadto wiele stołów 1C (zwłaszcza tych najważniejszych, takich jak cięcie ostatniego, salda i obroty) jest wirtualnych i jest rozrzuconych po różnych fizycznych stołach, gromadzących się w wielu złączach. Ta metoda nie jest odpowiednia.
Platforma 1C zapewnia możliwość połączenia się z nią za pośrednictwem połączenia COM. Podobnie jak wiele programów Windows, podczas instalacji 1C w systemie rejestrowane są dwa obiekty COM - Automation Server i COM Connector. Z oboma obiektami można pracować w języku obsługującym technologię COM.
Obiekt Automation Server to aplikacja 1C, która prawie nie różni się od zwykłej aplikacji klienckiej. Różnica polega na tym, że dodatkowo istnieje możliwość programowej kontroli instancji aplikacji. Podczas pracy z obiektem COM Connector uruchamiana jest lekka wersja aplikacji 1C, w której formularze nie są dostępne, a także funkcje i metody związane z interfejsem i efekty wizualne. Sama aplikacja uruchamia się w trybie „Połączenie zewnętrzne”. Inicjalizacja zmiennych globalnych (na przykład definiowanie aktualny użytkownik i jego ustawienia) należy wykonać w zewnętrznym module połączeniowym 1C. Jeśli w trybie połączenia zewnętrznego zostanie wywołana funkcja w kodzie, która nie jest dostępna w tym trybie, zostanie zgłoszony wyjątek (który zostanie przekazany do naszego skryptu Pythona). Wywołania do niebezpiecznych funkcji powinny być otoczone konstrukcjami formularza
#If NOT OuterConnection Then Warning("Hello!"); #Koniec, jeśli
Ponieważ praca z obiektami COM jest technologią tylko dla systemu Windows, nie dziwi fakt, że nie jest ona zawarta w standardowej dystrybucji Pythona. Będziesz musiał zainstalować rozszerzenie - zestaw modułów, które zapewniają wszystkie niezbędne funkcje do programowania pod Windows w Pythonie. Można go pobrać jako już zmontowany instalator exe. Samo rozszerzenie zapewnia dostęp do rejestru, usług, obiektów ODBC, COM i tak dalej. Alternatywnie możesz od razu zainstalować dystrybucję ActiveState Python, w której rozszerzenie Win32 wychodzi z pudełka.
Przez jakiś czas eksperymentowałem z połączeniem COM przy tworzeniu aplikacji webowych, w szczególności konta osobistego. Zidentyfikowano następujące wady:
Połączenie COM jest wolne. Niska wydajność to dobrze znany minus technologii COM.
- Proces nawiązywania połączenia z 1C, w zależności od konfiguracji, może zająć od 1 do 8 sekund (w moim przypadku - 6 sekund). Nie trzeba dodawać, że nawiązanie połączenia dla każdego żądania spowoduje załadowanie każdej strony w ciągu 8 sekund.
- Ponieważ aplikacje internetowe Pythona działają jako niezależne serwery, poprzedni punkt można skompensować, przechowując połączenie w jakiejś zmiennej globalnej i przywracając je w przypadku błędu. Jak utrzymać połączenie w PHP, szczerze mówiąc, jeszcze nie pomyślałem.
- Utracona wieloplatformowa aplikacja internetowa.
W oparciu o powyższe punkty postanowiono zmienić zasadę interakcji, dzieląc ją na 2 części - pierwszą zależną od platformy (Windows), rozładowującą dane 1C do dowolnego dogodnego formatu, a drugą, niezależną od platformy, zdolną do praca z danymi w zasadzie bez podejrzeń o 1C.
Strategia działania jest następująca: skrypt Pythona łączy się z 1C, wykonuje niezbędne zapytania i przesyła dane do bazy danych SQLite. Możesz połączyć się z tą bazą danych z Pythona, PHP, Java. Większość naszych projektów jest w Pythonie, a ponieważ nienawidzę ręcznego pisania surowych zapytań SQL, cała praca z bazą danych SQLite odbywa się za pośrednictwem ORM SQLAlchemy. Należało jedynie opisać strukturę danych bazy danych w stylu deklaratywnym:
From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key= True) account = Kolumna(Unicode(32), indeks=True) code = Kolumna(Unicode(32))adres = Kolumna(Unicode(512)) fio = Kolumna(Unicode(256)) source = Kolumna(Unicode(16) ) psu = Kolumna(Unicode(256)) tso = Kolumna(Unicode(256)) np = Kolumna(Unicode(256)) Ulica = Kolumna(Unicode(256))dom = Kolumna(Integer) flat = Kolumna(Integer) mro = Column(Unicode(256)) class Płatność(Baza): __tablename__ = "płatności" # i tak dalej...
Teraz wystarczy zaimportować ten moduł do dowolnego projektu Pythona i można pracować z danymi.
Przewiduję twoje pytanie - "dlaczego SQLite"? Głównym powodem jest to, że baza danych jest potrzebna tylko do odczytu, więc nie powinniśmy się martwić problemami z zapisem do SQLite. Po drugie, format tego DBMS jest wygodny - wygodniej jest go przeglądać (jest ich wiele darmowe narzędzia, w tym super rozszerzenie dla FireFox). Po trzecie, w niektórych przypadkach wymagane było uzyskanie dostępu do subskrybentów z tych maszyn, na których nie ma połączenia z serwerem MySQL. W takim przypadku wystarczy skopiować plik bazy danych SQLite, a na tej maszynie będziesz miał dostęp do wszystkich informacji.
Rozładunek odbywa się raz dziennie w nocy. Wprowadzanie danych do 1C można zautomatyzować w ten sam sposób. Na przykład wymagane jest rejestrowanie odczytów pozostawionych przez subskrybentów na stronie konta osobistego. W takim przypadku ponownie łączymy się z 1C i programowo tworzymy i wykonujemy dokument „Akt składania zeznań”. Kod podam poniżej.
Praca z obiektami COM w Pythonie jest nieco niezwykła. Po pierwsze, „pythonicity” kodu zostaje utracone - zasady nazywania zmiennych i funkcji w 1C, delikatnie mówiąc, nie odpowiadają Zenowi Pythona. Po drugie, wszyscy wiedzą, że obiekty 1C są często nazywane znakami cyrylicy, co spowoduje problemy podczas programowania w Pythonie… ale można je rozwiązać. Proponuję spojrzeć na kod:
Importuj import pythoncom win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=nazwa użytkownika;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Połącz(V82_CONN_STRING)
Jak widać z kodu, klient jest inicjowany do pracy z 1C. Obiekt COM jest zdefiniowany przez nazwę „V82.COMConnector”. Należy pamiętać, że ta nazwa jest ważna dla platformy V8.2, jeśli masz wersję 8.1, nazwa będzie brzmieć „V81.COMConnector”.
Na zainicjowanym kliencie wywołujemy metodę Connect(), przekazując jej ciąg połączenia. Ciąg składa się z nazwy serwera, bazy danych, użytkownika i hasła. Wynikowy obiekt V82 przechowuje połączenie z aplikacją 1C. Nie ma metody Disconnect() ani niczego w tym rodzaju. Aby odłączyć się od bazy wystarczy usunąć obiekt z pamięci funkcją del() lub przypisać zmienną do None.
Mając obiekt, możesz uzyskać dostęp do dowolnych pól i metod globalnego kontekstu 1C, operować obiektami uniwersalnymi, takimi jak TabularDocument, TableValues itp. Ważne jest, aby pamiętać, że podczas pracy przez połączenie COM 1C działa w trybie „Połączenie zewnętrzne”. Nie zawiera żadnych funkcji do pracy interaktywnej, takich jak wyskakujące okna dialogowe, powiadomienia i, co najważniejsze, formularze. Jestem pewien, że nie raz będziesz przeklinał programistów konfiguracji za umieszczenie najważniejszej funkcjonalności w procedurze Button1Press() w module formularza dokumentu.
Porozmawiajmy o tak ważnej rzeczy jak atrybuty cyrylicy. Pomimo faktu, że 1C jest środowiskiem dwujęzycznym i istnieje angielski odpowiednik dla każdej rosyjskiej metody, prędzej czy później będziesz musiał zwrócić się do atrybutu cyrylicy. Jeśli włączone Języki PHP lub VBSCript nie spowoduje żadnych problemów,
Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Ciąg połączenia") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... KontaZapis.Zapis()
Następnie kod Pythona po prostu ulegnie awarii z błędem składni. Co robić? Zmienić konfigurację? Nie, po prostu użyj metod getattr i setattr. Przekazując do tych funkcji obiekt COM i nazwę atrybutu cyrylicy, można uzyskać i ustawić odpowiednio wartości:
#coding=cp1251 katalog = getattr(V82.Catalogs, "PersonalAccounts")
Ważne jest, aby nazwy atrybutów oraz parametry funkcji i metod były przekazywane w kodowaniu cp1251. Dlatego, aby uniknąć zamieszania w kodowaniu, warto zadeklarować to na początku pliku: #coding=cp1251. Następnie możesz przekazywać ciągi znaków, nie martwiąc się o ich kodowanie. Ale! Wszystkie ciągi otrzymane z 1C (wyniki wywołań funkcji, żądania) będą kodowane w UTF-8.
Przykład kodu, który wykonuje zapytanie w środowisku 1C, iteruje wynik i zapisuje bazę danych w SQLite:
#coding=cp1251 q = """ SELECT KontaOsobiste.Kod Kod AS, KontaOsobiste.Budynek.Lokalizacja.Nazwa + ", " + KontaOsobiste.KrótkiAdres AS adres, KontaOsobiste.Abonent.Nazwa AS fio, KontaOsobiste.Oddział.Nazwa AS psu, EKSPRESOWE(Charakterystyka KontaOsobisteSkrajka.Wartość AS Katalog.Organizacje siatki terytorialnej).Nazwa AS tso,KontaOsobiste.Budynek.Rozliczenie.Nazwa AS np,KontaOsobiste.Budynek.Ulica.Nazwa AS Ulica,KontaOsobiste.Budynek.Dom AS mieszkanie,KontaOsobiste.KontaOsobiste. Dression Retor Nazwisko jako mro z książki referencyjnej Niewiele dowodów jako konto twarzy lewego połączenia regestów Charakterystyka sygnalizacji Namiętny (, vidcharacteristics = wartość (książka referencyjna. Organizacja w kształcie vidcharakteristic)) jako cechy charakterystyczne elementy śledzące = V82.NewObject( "zapytanie", q) selekcja = zapytanie.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() podczas selekcji.Next(): abonent = modele.Abonent() Abonent.account = selekcja.code.strip() abonent.code = selekcja.kod abonent.fio = selekcja.fio abonent.adres = selekcja.adres abonent.psu = selekcja.psu abonent.tso = selekcja.tso abonent.source = u "ASRN" abonent.np = wybór.np abonent.street = wybór.ulica abonent.house = wybór.dom abonent.flat = wybór.abonent.mro = wybór.mro CONN.add(abonent) CONN.commit()
Tutaj CONN jest sesją połączenia z bazą danych SQLite. Tworzony jest obiekt zapytania, jego tekst jest wypełniany. Jak wspomniano powyżej, tekst żądania musi być w cp1251, dla którego kodowanie jest najpierw zadeklarowane. Po wykonaniu zapytania wszyscy subskrybenci są usuwani z bazy danych, aby nie dodawać duplikatów, następnie są dodawani cyklicznie i następuje ostateczne zatwierdzenie.
Podczas pracy z żądaniami odkryłem następujące zasady.
Wybierając pola, nadaj im nazwy łacińskie, znacznie wygodniej będzie uzyskać do nich dostęp za pomocą selektora (kropki), zamiast getattr().
- Wybierz tylko prymitywne typy danych: ciągi, liczby, daty i wartości logiczne. Nigdy nie wybieraj linków do obiektu (dokumentu, katalogu)! W tym kontekście absolutnie nie potrzebujesz referencji, a nawet są szkodliwe, ponieważ każdy dostęp do atrybutu lub metody referencji spowoduje żądanie przez połączenie COM. Jeśli uzyskasz dostęp do atrybutów łącza w pętli, będzie to bardzo powolne.
— Jeśli wybierzesz pole Data, zostanie ono zwrócone jako obiekt PyTime. Jest to specjalny typ danych do przekazywania daty/godziny w połączeniu COM. Praca z nim nie jest tak wygodna, jak ze zwykłą datą i godziną. Jeśli przekażesz ten obiekt do int(), to zostanie zwrócony znacznik czasu, z którego możesz pobrać datę i czas za pomocą metody fromtimestamp().
Przyjrzyjmy się teraz, jak powstają drukowane dokumenty. Faktem jest, że konsument musi mieć możliwość pobrania wcześniej przygotowanych dokumentów, na przykład pokwitowania płatności lub aktu pojednania. Dokumenty te są generowane w 1C zgodnie z ustalonymi wymaganiami, ich implementacja w Pythonie zajmie dużo czasu. Dlatego lepiej generować dokumenty w 1C i zapisywać je w format Excela.
Tak więc dokument aktu pojednania jest generowany przez specjalny przetwarzanie zewnętrzne. Dla tych, którzy nie znają terminologii 1C: przetwarzanie to autonomiczny program, który ma własny moduł, formularze, szablony, zaprojektowany do działania w środowisku 1C. Konieczne jest zainicjowanie przetwarzania, wypełnienie jego szczegółów i wywołanie funkcji, która zwróci nam dokument arkusza kalkulacyjnego przeznaczony do przeglądania w 1C. Dokument ten musi być zapisany w formacie Excel i skopiowany na serwer lub zapisany w bazie danych.
Link = getattr(V82.Catalogs, "SystemReports").FindByDescription("Elen's Verification Act") nav_url = V82.GetURL(link, "Report") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports.Create (nazwa) setattr(ExternalReport, "PersonalAccount", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report .account = reference.Code.strip() report.type = u"działaj" report.document = open(ścieżka, "rb").read() CONN.add(raport)
Powyższy fragment kodu wykonuje następujące czynności. Przetwarzanie, które tworzy dokument, jest połączone. Przetwarzanie może być wbudowane w konfigurację, przechowywane na dysku lub w bazie danych 1C (w jakimś katalogu). Ponieważ przetwarzanie zmienia się często, aby nie aktualizować konfiguracji za każdym razem, najczęściej zmieniające się przetwarzanie jest przechowywane w katalogu „ReportsSystem”, w atrybucie typu „value storage” o nazwie Raport. Przetwarzanie można zainicjować wyładowując go z bazy danych na dysk i ładując go lub za pomocą metody GetURL(), do której należy przekazać łącze do elementu katalogu i nazwę atrybutu. Przypisujemy wartości atrybutów do wynikowego obiektu przetwarzania, wywołujemy wyeksportowaną funkcję GetDoc() i otrzymujemy dokument arkusza kalkulacyjnego, który jest zapisywany w tymczasowym pliku Excel. Zawartość tego pliku jest zapisywana w bazie danych SQlite.
Ostatnią rzeczą, którą należy rozważyć, jest programowe wprowadzanie danych do 1C. Załóżmy, że wymagane jest wprowadzenie wskazań od subskrybentów. Aby to zrobić, wystarczy stworzyć i przeprowadzić dokument „Akt dowodowy”:
#coding=cp1251 act = getattr(V82.Documents, "Akt składania zeznań") act = acti.CreateDocument() setattr(act, "Wskazanie", 1024.23) setattr(act, "Abonent", "Ivanov") # Wypełnienie w innych szczegółach ..działaj.Zapisuj()
Teraz wprowadzanie danych jest zautomatyzowane.
Tak więc przedstawiłem metodę, która opiera się na programowym przesyłaniu i pobieraniu danych za pomocą połączenia COM. Ta metoda z powodzeniem działa w mojej organizacji od prawie roku. Baza, utworzona z 1C, obsługuje 3 systemy płatności, pozyskiwanie przez Internet (płatność kartami przez Internet), a także konto osobiste. Ponadto baza danych jest podłączona różne skrypty do rutynowej automatyzacji.
Pomimo niedociągnięć metody ( niska prędkość COM), na ogół działa stabilnie. Posiadamy dane w postaci niezależnej od platformy (SQLite), z którymi można pracować w dowolnym języku. A główna część kodu jest napisana w Pythonie, co oznacza, że dostępnych jest wiele narzędzi i technik, o których nie można nawet marzyć w 1C.
To jest jeden z możliwe sposoby interakcja z 1C. Jestem pewien, że nie jest nowy i prawdopodobnie został już przez kogoś przetestowany i zoptymalizowany. Jednak starałem się przedstawić jak najwięcej szczegółów procesu, aby uchronić Cię przed pułapkami, na które sam wszedłem.
Życzę wszystkim powodzenia i pamiętaj, że 1C nie jest tak przerażający, jak go malują!