DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Nie ma nic lepszego do wymiany informacji między dwoma bazami informacji bez zbędnego przesyłania i wymiany plików niż połączenie COM. I trudno z tym dyskutować, ponieważ korzystanie z tego typu połączenia jest dość proste i stabilne. Ale w tym mechanizmie i w tym jednym wąskim gardle i nieprzyjemnym miejscu - czas na nawiązanie połączenia z inną bazą. W niektórych przypadkach może osiągnąć wystarczająco duże wartości, tj. być bardzo długi.

O co chodzi?

W momencie połączenia przez łącze COM podłączana baza w całości ładuje konfigurację bazy, do której się podłączamy. Próbując na przykład połączyć się z bazą danych „Enterprise Accounting”, naciśnięcie czekania trwałoby wystarczająco długo, ponieważ wielkość konfiguracji wynosi setki megabajtów. Staje się jasne, że wszystkie połączenia muszą być buforowane i utrzymywane w celu zwiększenia wydajności.

Analiza wydajności

Zadajmy sobie pytanie, czy w ogóle konieczne jest buforowanie połączeń i czy zaowocuje to intensywną pracą użytkowników połączeniem COM. Zmierzmy czas połączenia do konfiguracji 20 KB.

Widzimy, że połączenie z małą bazą danych zajęło 3,5 sekundy. Podczas łączenia się z większą bazą danych czas ten wydłuży się kilkakrotnie.

Podczas zapisywania obsługiwanego połączenia te kroki zajmie kilka rzędów wielkości mniej czasu.

Jak utrzymujemy aktywne połączenie COM?

Problem polega na tym, że platforma 1C nie zapewnia standardowych środków do przechowywania połączeń COM w bezpieczeństwie informacji. Zachowywanie połączenia w podręcznikach i dokumentach nie ma sensu, ponieważ często może się zmieniać. Najbardziej obiecującą opcją jest zapisanie połączenia w parametrze sesji. Ale nawet tutaj wszystko nie jest takie gładkie. W końcu nie ma odpowiedniego typu danych do przechowywania połączenia COM.

Te rozważania prowadzą do tego, że przechowywanie jest możliwe tylko na kliencie w jakiejś zmiennej. Rozważmy opcję zarządzanego formularza. Konieczne jest zainicjowanie w postaci zmiennej z dyrektywą & OnClient, w której zapiszemy wartości połączeń. W związku z tym można również wywołać to połączenie tylko na kliencie, ponieważ nie można przesłać obiektu COM z klienta na serwer. W przypadku zwykłych formularzy nie ma separacji między serwerem a klientem, a ten mechanizm staje się jeszcze prostszy. Pamiętaj, aby odłączyć się przed zamknięciem używanego formularza, aby zapobiec wyciekom pamięci.

Zamiast wyjścia

Chociaż ten schemat rozwiązuje niektóre problemy z wydajnością, jest daleki od ideału. Każdy formularz, w którym konieczne będzie utrzymywanie połączenia COM, utworzy nową sesję w bazie danych odbiornika i odpowiednio będzie potrzebnych więcej licencji. Jedną z głównych wad jest również wykluczenie obsługi połączeń na serwerze

W następnym artykule przyjrzymy się lepszemu sposobowi eliminacji tych problemów (łączenie się za pośrednictwem usług internetowych).

Drukuj (Ctrl + P)

Jedną z opcji wymiany danych między bazami 1C jest wymiana poprzez połączenie COM. Korzystając z połączenia COM, możesz łączyć się z inną z jednej bazy danych 1C i odczytywać lub zapisywać dane. Ta metoda może być używana zarówno w wersjach baz danych klient-serwer, jak i plikowych bazach danych. W tym artykule omówiono tego rodzaju połączenia na platformie 8.3

połączenie com

Możesz utworzyć dwa typy obiektów COM dla aplikacji 1C. To stare połączenie V83.Aplikacja i połączenia komunikacyjne V83.COMConnector ... W przypadku V83.Aplikacja zostaje uruchomiona prawie pełnoprawna instancja aplikacji 1C. W przypadku użycia V83.COMConnector uruchamia się niewielka część serwera. W tym przypadku prędkość działania jest wyższa, ale niektóre funkcje mogą być niedostępne. W szczególności pracuj z formularzami i typowymi modułami, dla których właściwość pracy ze złączeniami zewnętrznymi nie jest ustawiona. Przeważnie powinieneś używać V83.COMConnector i tylko w przypadku braku funkcjonalności V83.Aplikacja... Różnica w szybkości działania może być szczególnie zauważalna w przypadku dużych baz danych. Używana platforma 8.2 V82.Application lub V82.COMConnector

Ustanów połączenie OLE

Connection \u003d New COMObject („V83.Application”);

Ustanów połączenie COM

Connection \u003d New COMObject („V83.COMConnector”);

Ciąg połączenia

// Dla opcji klient-serwer
StringConnection \u003d „Srvr \u003d“ “ServerName” “; Ref \u003d“ “BaseName”;
// Dla opcji trybu pliku:
StringConnection \u003d „Plik \u003d„ „Ścieżka do bazy” „; Usr \u003d nazwa użytkownika; Pwd \u003d Hasło ";
Próba
Connection \u003d Połączenie ... Połączyć(Ciąg połączenia);
Wyjątek
Message \u003d Nowa wiadomość do użytkownika;
Wiadomość ... Tekst = „Nie udało się połączyć z bazą” + OpisErrors (); Wiadomość ... Zgłosić();
Koniec prób;

Przerwij połączenie

Połączenie \u003d niezdefiniowane;
Do obiektu V83.Aplikacja konieczne jest zakończenie połączenia, w przeciwnym razie niezakończona sesja pozostanie zawieszona, co będzie musiało zostać usunięte ręcznie. W przypadku V83.COMConnector połączenie jest przerywane automatycznie na koniec procedury, w której zostało utworzone. Jest jeszcze jeden mały punkt. W przypadku użytkownika, z którym następuje połączenie, w jego ustawieniach należy wyłączyć opcję „Pytaj o potwierdzenie przy zamykaniu programu”.

NewObject ()

Aby utworzyć nowy obiekt, możesz użyć metody NewObject (), na przykład:

dla V83.COMConnector

RequestCOM \u003d Połączenie. NewObject ( "Żądanie ") ;
TableCOM \u003d Połączenie. NewObject ( „Tabela wartości”) ;
ArrayCOM \u003d Połączenie. NewObject („Array”);

WidCOM \u003d Connection.NewObject

dla V83.Aplikacja

ŻądanieOLE \u003d Połączenie. NewObject („ Żądanie ") ;
Tabela OLE \u003d połączenie. NewObject(„Tabela wartości”) ;
ArrayOLE \u003d Connection.NewObject("Szyk");
WidCOM \u003d Connection.NewObject(„UniqueIdentifier”, StringUID);

RequestCOM ... Tekst \u003d"WYBIERAĆ
| Pozycje organizacji. Kod,
| Stanowiska organizacji.
| OD | Katalog. Pozycje organizacji
AS Pozycje organizacji ”;

Wynik \u003d QueryCOM. Biegać ();
Próba \u003d Wynik. Wybierz ();
Podczas próbkowania. Następujący()Cykl
Koniec cyklu;
Możesz także użyć menedżerów obiektów konfiguracyjnych:
ReferenceCOM \u003d Połączenie. Leksykony. Nazwa katalogu;
DocumentCOM \u003d Połączenie. Dokumenty. Nazwa dokumentu;
Zarejestruj COM \u003d Połączenie. Rejestry informacji... Nazwa rejestru;

Pobieranie i porównywanie wyliczenia przez połączenie COM

Aby porównać wartości elementów wyliczeniowych zdefiniowanych w konfiguracji, konieczne jest przekonwertowanie tych elementów na jeden z typów pierwotnych, którego porównanie nie jest trudne. Te typy mogą być numeryczne lub łańcuchowe. Możesz przekonwertować wartość elementu wyliczenia na typ liczbowy, taki jak ten

EnumerationElement \u003d Connection.Directories.Directory1.FindByCode (1) .Props1;

PossibleValues \u200b\u200b\u003d EnumerationElement.Metadata (). EnumerationValues;

EnumerationElementNumber \u003d PossibleValues.Index (PossibleValues.Find (Connection.XMLString (EnumerationElement)));

Jeśli EnumItemNumber \u003d 0, to zgłoś ( „EnumerationValue1”);

ElseIf EnumerationElementNumber \u003d 1 Następnie Raport („EnumerationValue2”);

EndIf;

Pobieranie obiektu przez COM według identyfikatora

Poprzez menedżery obiektów konfiguracyjnych otrzymujemy obiekt com, na przykład:
DocumentCOM \u003d Połączenie. Dokumenty. Nazwa dokumentu;

Następnie otrzymujemy unikalny ciąg identyfikacyjny:

StringUID \u003d Connection.string ( DocumentCOM.UniqueIdentifier())

ID \u003d nowy U uniqueID (StringUID);
Z linkById \u003d Documents [DocumentName] .GetLink (ID);

Jeśli chcesz znaleźć obiekt com według dokumentu według identyfikatora, musisz napisać w ten sposób:

WidCOM \u003d Connection.NewObject(„UniqueIdentifier”, StringUID);
ReferenceById \u003d Connection.Dokumenty [DocumentName] .GetLink (UIDCOM);

Cześć Habravchans!

W tym artykule chcę porozmawiać o tym, jak integracja z platformą 1C jest ustanowiona w mojej organizacji. Prawie całkowity brak informacji technicznych na ten temat skłonił mnie do tego. Czytając różne artykuły i raporty na temat łączenia 1C z dowolnym systemem informacyjnym, w kółko jesteś przekonany, że wszystkie one mają charakter marketingowy, demonstracyjny, a nigdy techniczny, odzwierciedlając problem i istotę jego rozwiązania.

Ostrzegam, że metoda w żaden sposób nie twierdzi, że jest uniwersalna. Ponieważ istnieje wiele samych konfiguracji 1C, a jest jeszcze więcej systemów informacyjnych, języków i platform, liczba możliwych kombinacji jest ogromna. Moim celem jest zademonstrowanie jednego z możliwych rozwiązań.


Wybrałem Python jako język, który będzie integrował się z 1C. Bardzo dobrze nadaje się do automatyzacji procesów. Ułatwia to minimalistyczna składnia (kod wpisuje się bardzo szybko), bogata biblioteka standardowa (mniejsze zapotrzebowanie na moduły firm trzecich), wieloplatformowość - z dużym prawdopodobieństwem kod napisany w Linix OS z powodzeniem będzie działał na Windowsie.

Najpierw nakreślę dane, z którymi będziemy pracować. Organizacja - firma zajmująca się sprzedażą energii w regionie Dalekiego Wschodu - obsługuje około 400 tysięcy abonentów, w oparciu o 1C w samodzielnie napisanej konfiguracji. Dla każdego abonenta przechowywane są jego płatności, opłaty, 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 chwalebnych czasach można było połączyć się z bazą danych w dowolnym języku i wykonywać różne czynności - wybierać subskrybentów dłużników, odbierać płatności pocztą, rejestrować odczyty instrumentów. Nic dziwnego, że zbiór skryptów, które automatyzują tę procedurę, stale się powiększał. Programiści mogli wykonywać dowolne czynności bez otwierania samego programu.

Niestety, wraz z przejściem na 1C, freebie się skończyło - nie było już możliwości bezpośredniego połączenia z bazą. Ogólnie sama platforma 1C jest niepodzielna i nie nadaje się do integracji z innymi systemami. Ona, jak mówią, jest rzeczą samą w sobie. Podczas ładowania danych do 1C należy pamiętać, że wyodrębnienie ich stamtąd nie będzie tak łatwe. Ale ponieważ organizacja musiała wdrożyć systemy płatności i konto osobiste, konieczne było znalezienie jakiegoś rozwiązania.

Głównymi zadaniami stojącymi przed mną była możliwość szybkiego uzyskania danych na konkretnym koncie osobistym - imię i nazwisko, adres, urządzenia pomiarowe, stany liczników, płatności, opłaty. Plus tworzenie dokumentów - akt pojednania, pokwitowanie płatności. Nie ma więc bezpośredniego połączenia z bazą danych - każdy, kto przeglądał bazę danych 1C na serwerze SQL, widział, że trudno było zrozumieć masę tabel w postaci aaa1, aaa2. A tworzenie zapytań z takimi nazwami tabel i pól jest po prostu nierealne. Ponadto wiele tabel 1C (szczególnie tych najważniejszych, takich jak cięcie tego ostatniego, reszty i obroty) jest wirtualnych i jest rozproszonych po różnych tabelach fizycznych, zbieranych przez wielokrotne łączenia. Ta metoda nie jest odpowiednia.

Platforma 1C zapewnia możliwość połączenia się z nią poprzez połączenie COM. Podobnie jak wiele programów Windows, podczas instalacji 1C w systemie rejestrowane są dwa obiekty COM - Serwer Automatyki i Złącze COM. Z oboma obiektami można pracować przy użyciu języka obsługującego 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 można dodatkowo programowo sterować instancją aplikacji. Podczas pracy z obiektem COM Connector uruchamiana jest lekka wersja aplikacji 1C, w której formularze oraz funkcje i metody związane z interfejsem i efektami wizualnymi nie są dostępne. Sama aplikacja jest uruchamiana w trybie „Połączenie zewnętrzne”. Inicjalizację zmiennych globalnych (np. Określenie aktualnego użytkownika i jego ustawień) należy przeprowadzić w zewnętrznym module przyłączeniowym 1C. Jeśli w trybie połączenia zewnętrznego w kodzie zostanie wywołana funkcja, która nie jest dostępna w tym trybie, zostanie zgłoszony wyjątek (który zostanie przekazany do naszego skryptu w Pythonie). Wywołania niebezpiecznych funkcji powinny być otoczone konstrukcjami takimi jak

# Jeśli NIE OuterConnection to Warning ("Hello!"); #EndIf

Ponieważ praca z obiektami COM jest wyłącznie technologią Windows, nie jest zaskakujące, że nie ma jej w standardowym pakiecie Pythona. Będziesz musiał zainstalować rozszerzenie - zestaw modułów, które zapewniają wszystkie niezbędne funkcje do programowania w systemie Windows w Pythonie. Można go pobrać jako już zmontowany exe-instalator. Samo rozszerzenie zapewnia dostęp do rejestru, usług, ODBC, obiektów COM itp. Alternatywnie możesz natychmiast zainstalować dystrybucję ActiveState Python, która jest dostarczana z rozszerzeniem Win32 po wyjęciu z pudełka.

Od jakiegoś czasu eksperymentowałem z połączeniem COM przy tworzeniu aplikacji internetowych, aw szczególności mojego konta osobistego. Zidentyfikowano następujące wady:

Połączenie COM jest powolne. Niska wydajność jest znaną wadą 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 ładowanie każdej strony przez 8 sekund.
- Ponieważ aplikacje internetowe w Pythonie działają jako niezależne serwery, poprzedni punkt można skompensować, przechowując połączenie w jakiejś zmiennej globalnej i, w przypadku błędu, przywrócić je. Szczerze mówiąc, nie zastanawiałem się, jak utrzymać połączenie w PHP.
- Utracono wieloplatformową aplikację internetową.

W oparciu o powyższe punkty postanowiono zmienić zasadę interakcji, dzieląc ją na 2 części - pierwszą zależną od platformy (Windows), wyładowującą dane 1C w jakimś wygodnym formacie, a drugą, niezależną od platformy, zdolną do pracy z danymi, niczego nie podejrzewając około 1C w zasadzie.

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 działa w Pythonie, a ponieważ nie mogę znieść ręcznego pisania surowych zapytań SQL, cała praca z bazą danych SQLite jest wykonywana za pośrednictwem SQLAlchemy ORM. Wystarczyło opisać strukturę danych bazy danych w stylu deklaratywnym:

Z sqlalchemy.ext.declarative import declarative_base z sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeB, ForeignKey Base \u003d declarative_base () class Abonent (Base): __tablename__ \u003d "abonents" id \u003d Column (Integer, primary_key \u003d True) konto \u003d Kolumna (Unicode (32), indeks \u003d True) kod \u003d Kolumna (Unicode (32)) adres \u003d Kolumna (Unicode (512)) fio \u003d Kolumna (Unicode (256)) source \u003d Kolumna (Unicode (16) ) psu \u003d Kolumna (Unicode (256)) tso \u003d Kolumna (Unicode (256)) np \u003d Kolumna (Unicode (256)) street \u003d Kolumna (Unicode (256)) house \u003d Kolumna (Integer) flat \u003d Kolumna (Integer) mro \u003d Kolumna (Unicode (256)) klasa Płatność (podstawa): __tablename__ \u003d "płatności" # i tak dalej ...

Teraz wystarczy zaimportować ten moduł do dowolnego projektu w Pythonie i możesz pracować z danymi.

Przewiduję twoje pytanie - dlaczego SQLite? Głównym powodem jest to, że baza danych jest tylko do odczytu, więc problemy z zapisem do SQLite nie powinny nas martwić. Po drugie, format tego DBMS jest wygodny - wygodniej jest go przeglądać (istnieje wiele bezpłatnych narzędzi, w tym super-rozszerzenie dla FireFox). Po trzecie, w niektórych przypadkach konieczne było uzyskanie dostępu do abonentów z tych maszyn, na których nie ma połączenia z serwerem MySQL. W takim przypadku wystarczy skopiować plik bazy danych SQLite, a ta maszyna będzie miała 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 internetowej ich konta osobistego. W takim przypadku ponownie łączymy się z 1C i korzystając z metody programu tworzymy i wykonujemy dokument „Akt dokonywania odczytów”. Podam kod poniżej.

Praca z obiektami COM w Pythonie jest nieco nietypowa. Po pierwsze, „pytoniczność” kodu zostaje utracona - zasady nazewnictwa zmiennych i funkcji w 1C, delikatnie mówiąc, nie odpowiadają zenowi Pythona. Po drugie, wszyscy wiedzą, że obiekty 1C są często nazywane symbolami cyrylicy, co będzie powodować problemy podczas programowania w Pythonie ... ale można je rozwiązać. Proponuję przeczytać kod:

Importuj pythoncom import win32com.client V82_CONN_STRING \u003d "Srvr \u003d v8_server; Ref \u003d v8_db; Usr \u003d nazwa użytkownika; Pwd \u003d megapass;" pythoncom.CoInitialize () V82 \u003d win32com.client.Dispatch ("V82.COMConnector"). Połącz (V82_CONN_STRING)

Jak widać z kodu, klient jest zainicjowany do pracy z 1C. Obiekt COM jest zdefiniowany pod nazwą „V82.COMConnector”. Należy pamiętać, że ta nazwa jest ważna dla platformy V8.2. Jeśli masz wersję 8.1, będzie to nazwa „V81.COMConnector”.

Na zainicjowanym kliencie wywołujemy metodę Connect (), przekazując jej parametry połączenia. Ciąg składa się z nazwy serwera, bazy danych, użytkownika i hasła. Powstały obiekt V82 przechowuje połączenie z aplikacją 1C. Nie ma metody Disconnect () ani nic w tym stylu. Aby odłączyć się od bazy wystarczy usunąć obiekt z pamięci za pomocą funkcji del () lub przypisać go do zmiennej None.

Mając obiekt, możesz uzyskać dostęp do dowolnych pól i metod globalnego kontekstu 1C, działać z uniwersalnymi obiektami, takimi jak TabularDocument, ValuesTable itp. Należy wziąć pod uwagę, że pracując przez połączenie COM, 1C działa w trybie „Połączenie zewnętrzne”. Nie ma żadnych interaktywnych funkcji, takich jak wyskakujące okna dialogowe, powiadomienia i, co najważniejsze, formularze. Jestem pewien, że będziesz wielokrotnie przeklinać programistów konfiguracji, którzy zawarli najważniejsze funkcje w procedurze Button1Click () w module formularza dokumentu.

Porozmawiajmy o tak ważnej rzeczy, jak atrybuty cyrylicy. Pomimo tego, że 1C jest środowiskiem dwujęzycznym, a dla każdej metody rosyjskiej istnieje analog w języku angielskim, prędzej czy później konieczne będzie przejście do atrybutu cyrylicy. Jeśli w językach PHP lub VBSCript nie powoduje to żadnych problemów,

Set Con \u003d CreateObject ("v81.COMConnector") Set v8 \u003d Con.Connect ("ConnectionString") Set AccountsManager \u003d v8.Documents.Accounts .... Set AccountsRecord \u003d AccountsManager.CreateElement () AccountsRecord.Contractor \u003d .... .... AccountsWrite.Write ()

Wtedy kod Pythona po prostu ulegnie awarii z błędem składni. Co robić? Czy edytować konfigurację? Nie, wystarczy użyć metod getattr i setattr. Przekazując obiekt COM i cyrylicką nazwę atrybutu do tych funkcji, można odpowiednio pobrać i ustawić wartości:

# coding \u003d cp1251 catalog \u003d getattr (V82.Catalogs, „Konta osobiste”)

Ważne jest to, że nazwy atrybutów, a także parametry funkcji i metod muszą być przekazywane w kodowaniu cp1251. Dlatego, aby z góry uniknąć ścieżki kodowania, warto zadeklarować ją na początku pliku: # coding \u003d cp1251. Następnie możesz przesyłać ciągi bez martwienia się o ich kodowanie. Ale! Wszystkie ciągi otrzymane z 1C (wyniki wywołań funkcji, żądań) będą w kodowaniu UTF-8.

Przykład kodu, który wykonuje zapytanie w środowisku 1C, iteruje wynik i zapisuje bazę danych w SQLite:

# coding \u003d cp1251 q \u003d "" "SELECT PersonalAccounts.Code Kod AS, PersonalAccounts.Structure.PopulatedPart.Name +", "+ PersonalAccounts.ShortAddress Adres AS, PersonalAccounts.Subscriber.Name AS fio, PersonalAccounts.CA Division psu.Name EXPRESS (CharacteristicsPersonalAccountsSliceLast.Value AS Directory.TerritoruallyNetworkOrganizations) .Name AS tso, PersonalAccounts.Structure.PopulatedPart.Name AS np, PersonalAccounts.Street.Room.Room.Number AS ulica, Face.AccountsNo. , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT JOIN Data Register.CharacteristicsPersonalAccounts.SliceLast (, TypeCharacteristics \u003d VALUE (Directory.TypesCharacteristics.TerritorialCounts) \u003d V82.NewObject ( "Zapytanie", q) selection \u003d query.Execute (). Choose () CONN \u003d db.connect () CONN.query (models.Abonent) .delete () while selection.Next (): abonent \u003d models.Abonent () abonent.account \u003d selection.code.strip () abonent.code \u003d selection.code abonent.fio \u003d selection.fio abonent.address \u003d selection.address abonent.psu \u003d selection.psu abonent.tso \u003d selection.tso abonent.source \u003d u "ASRN" abonent.np \u003d selection.np abonent.street \u003d selection.street abonent.house \u003d selection.house abonent.flat \u003d selection.flat abonent.mro \u003d selection.mro CONN.add (abonent) CONN.commit ()

Tutaj CONN jest sesją do połączenia z bazą danych SQLite. Obiekt zapytania zostaje utworzony, jego tekst jest wypełniony. Jak wspomniano powyżej, tekst żądania musi być w cp1251, dla którego kodowanie jest zadeklarowane jako pierwsze. Po wykonaniu żądania wszyscy subskrybenci są usuwani z bazy danych, aby nie dodawać duplikatów, następnie są dodawani w pętli i następuje ostateczne zatwierdzenie.

Podczas pracy z zapytaniami znalazłem następujące zasady.

Wybierając pola, przypisuj im nazwy w języku łacińskim, znacznie wygodniej będzie uzyskać do nich dostęp za pomocą selektora (kropki) zamiast getattr ().
- Wybierz tylko pierwotne typy danych: łańcuchy, liczby, datę i wartość logiczną. Nigdy nie wybieraj odniesień do obiektu (dokumentu, odniesienia)! W tym kontekście linki są dla ciebie absolutnie niepotrzebne, a nawet szkodliwe, ponieważ każde wywołanie właściwości lub metody łącza prowadzi do żądania 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 typu Date, 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 w przypadku zwykłej daty i godziny. Jeśli przekażesz ten obiekt do funkcji int (), zostanie zwrócony znacznik czasu, z którego możesz pobrać datę i godzinę 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 raportu uzgodnienia. 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 formacie Excel.

Tak więc dokument aktu pojednania jest generowany przez specjalne zewnętrzne przetwarzanie. Dla tych, którzy nie są zaznajomieni z terminologią 1C: przetwarzanie to samodzielny program, który ma własny moduł, formularze, szablony, zaprojektowane do działania w środowisku 1C. Konieczne jest zainicjowanie przetwarzania, wypełnienie jego danych i wywołanie funkcji, która zwróci nam dokument arkusza kalkulacyjnego przeznaczony do przeglądania w 1C. Dokument ten należy zapisać w formacie Excel i skopiować na serwer lub zapisać w bazie danych.

Link \u003d getattr (V82.Catalogs, "Raporty systemowe"). FindByDescription ("Akt uzgadniania Elaine") nav_url \u003d V82.GetURL (łącze, "Raport") name \u003d V82.ExternalReports.Connect (nav_url) ExternalReport \u003d V82.ExternalReports.Creport (nazwa) setattr (ExternalReport, "Konto osobiste", odniesienie) table_doc \u003d ExternalReport.GetDoc () path \u003d V82.GetTempFileName ("xls") table_doc.Write (path, V82 .SpreadsheetDocumentFileType.XLS) report \u003d modeles.Report () report .account \u003d reference.Code.strip () report.type \u003d u "act" report.document \u003d open (path, "rb"). read () CONN.add (report)

Powyższy fragment ma następujące znaczenie. Przetwarzanie, które tworzy dokument, jest połączone. Przetwarzanie można wbudować w konfigurację, przechowywać na dysku lub w bazie danych 1C (w jakiejś książce). Ponieważ przetwarzanie zmienia się często, więc za każdym razem, gdy konfiguracja nie jest aktualizowana, najczęściej zmieniające się przetwarzanie jest przechowywane w katalogu System Reports, w atrybucie typu „magazyn wartości” o nazwie Report. Przetwarzanie można zainicjować przez wyładowanie go z bazy danych na dysk i załadowanie go lub za pomocą metody GetURL (), do której należy przekazać łącze do pozycji katalogu i nazwę atrybutu. Przypisujemy wartości atrybutów do otrzymanego obiektu przetwarzania, wywołujemy wyeksportowaną funkcję GetDoc (), pobieramy 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 chcesz wprowadzić odczyty od subskrybentów. W tym celu wystarczy stworzyć i przeprowadzić dokument „Oświadczenie o czytaniu”:

# coding \u003d cp1251 act \u003d getattr (V82.Documents, "Acceptance Act") act \u003d acts.CreateDocument () setattr (act, "Indication", 1024.23) setattr (act, "Subscriber", "Ivanov") # Uzupełnienie innych szczegółów. .. act.Write ()
Teraz wprowadzanie danych jest zautomatyzowane.

Tak więc nakreśliłem metodę, która opiera się na programowym zwalnianiu i ładowaniu danych za pomocą połączenia COM. Ta metoda z powodzeniem funkcjonuje w mojej organizacji od prawie roku. Baza, utworzona z 1C, obsługuje 3 systemy płatności, pobieranie przez Internet (płatność kartami przez Internet), a także konto osobiste. Ponadto do bazy danych podłączane są różne skrypty w celu automatyzacji procedury.

Pomimo wad metody (mała prędkość połączenia COM) ogólnie działa stabilnie. Dysponujemy danymi w formie niezależnej od platformy (SQLite), z którą można pracować w dowolnym języku. A główna część kodu jest napisana w Pythonie, co oznacza, że \u200b\u200bdostępnych jest wiele narzędzi i technik, o których w 1C nie można nawet marzyć.

To jeden z możliwych sposobów interakcji z 1C. Jestem pewien, że nie jest nowy i prawdopodobnie został już przez kogoś przetestowany i zoptymalizowany. Próbowałem jednak podać maksymalne szczegóły procesu, aby uchronić Cię przed pułapkami, na które sam się nadepnąłem.

Życzę wszystkim powodzenia i pamiętajcie, że 1C nie jest tak straszny, jak jest malowany!

) Zgadza się

Jednocześnie nie raz widziałem, kiedy publikacje, które nie ciągnęły się nawet o 10 punktów, po prostu „wystartowały”.
Dlaczego się to stało? Najwyraźniej dlatego, że ktoś ich wyraźnie lubił.


Mam na myśli to i powiem, że byłoby miło nie czytać artykułu na temat oceny, aby zrozumieć, jak bardzo go potrzebujesz, lub ocenić go nie tak prymitywnie +/-. Jeśli chodzi o to, co mi się podobało, poprawiłbym to w ten sposób: zdobyła tak dużo ze względu na fakt, że gwiazdy uformowały się w ten sposób i wiele osób zebrało się na miejscu i wielu to polubiło, sam rozumiesz, że to kwestia przypadku, tk. jak tylko artykuł opuści stronę główną, to można go już znaleźć tylko na żądanie, a więc każdemu, kto przejdzie przez głosowanie. A żeby utrzymać się na stronie głównej, o ile rozumiem, to tylko ciągłe komentarze \u003d promocja artykułu, który na to pozwala.
To z tego powodu sklepy są stawiane na ulicach - w końcu często nie jakość i trafność towarów jest ważna, ale przepuszczalność miejsca, ludzie spacerujący często kupują to, co wyrzucają następnego dnia, tylko ze względu na proces. To choroba znana wszystkim od dawna - shopomania. Lub po prostu zwiększenie przepływu zwiększa prawdopodobieństwo znalezienia odpowiedniego nabywcy.

A plusy i minusy… to tylko swego rodzaju „dziękuję” za poświęcony czas i pracę


Te. minus jest również uważany za „dziękuję”? Chciałem więc poznać Twoje podejście do tego, czy należy to umieścić w takich przypadkach i na ile interesująco myślą inni? Czy umieścić to, gdy artykuł jest szkodliwy / zły, czy też jest dla Ciebie po prostu bezużyteczny / pusty.
Moim zdaniem artykuł wygląda jak zwykłe podwyższenie oceny, ponieważ:
1. Problem z cytowanymi przeze mnie typami był generalnie ignorowany przez autora, chociaż nie był zbyt leniwy, aby napisać kilka komentarzy.
2. Artykuł zawiera wyraźną nieścisłość: mówi, że to jedyny sposób

V82 \u003d Nowy obiekt COM („V82.ComConnector”); Code \u003d CounterpartyCOM.Code;


ale spokojnie robię to używając takiego przetwarzania:

Raport (Podstawa. Podręczniki. Wykonawcy. FindByName ("LLC"). Kod);


i wszystko w porządku! I wybieram połączenie V82.ComConnector
To trochę dziwne, że autorowi wcale nie zależy, że jego artykuł zawiera takie problemy, jak wskazano, i nie reaguje w żaden sposób.
3. Ale nadal występuje problem, gdy błąd „Klasa nie istnieje”
4. A gdy jest zainstalowany 8.2, a potem 8.1 - spróbuj zamienić OLE / COM na typową centralę UT-BP!
5. Możesz wskazać główne przetwarzanie na stronie, które pozwala na uniwersalne połączenie przez OLE / COM, aby nowicjusze nie tracili czasu, piszesz za nich! To samo przy okazji jej zdjęcia z jakiegoś powodu, z którego się afiszujesz, dlaczego? W rezultacie 2 słowa w zasadzie i 6 więcej za kulisami.

Generalnie nie rzucam błota, tylko wskazuję na konkretne luki, ale reakcje są zerowe. Jeśli to jest doświadczenie, którym się dzielisz, to jest ono błędne i niekompletne.
Chodzi mi o to, że gdyby autor chciał zebrać wszystkie usterki, to mógł przynajmniej posłuchać cudzego doświadczenia, a nie warknąć w komentarzach. Natychmiast pojawia się sytuacja, gdy ten, kto ją czyta, wie więcej niż autor, mówi mu (czasem niepoprawnie), a on też walczy. W rezultacie wszystkie informacje nie znajdują się w artykule, ale w komentarzach! To jest zabawne! Zdarza się to często, ale jednocześnie nie musisz spoczywać na tym, co chciałeś być najlepszy - ja pokazuję najlepiej, a inni pokazują! Uwzględnij to w artykule, a warto, nie wszyscy są zainteresowani czytaniem tej potyczki.

Jedną z opcji wymiany danych między bazami 1C jest wymiana poprzez połączenie COM.

Korzystając z połączenia COM, możesz łączyć się z inną z jednej bazy danych 1C i odczytywać lub zapisywać dane. Tej metody można używać zarówno w wersjach baz danych klient-serwer, jak i plikowych bazach danych. W tym artykule przeanalizujemy przykłady tego rodzaju połączeń. W przykładach wykorzystano platformę 8.2.

Możesz utworzyć dwa typy obiektów COM dla aplikacji 1C. to V82.Aplikacja i V82.COMConnector... W przypadku V82.Aplikacja zostaje uruchomiona prawie pełnoprawna instancja aplikacji 1C. w przypadku użycia V82.COMConnector uruchamia się niewielka część serwera.
W tym przypadku prędkość robocza jest wyższa, ale niektóre funkcje mogą być niedostępne. W szczególności pracuj z formularzami i typowymi modułami, dla których właściwość pracy ze złączeniami zewnętrznymi nie jest ustawiona. Przeważnie powinieneś używać V82.COMConnector i tylko w przypadku braku funkcjonalności V82.Aplikacja... Różnica w szybkości działania może być szczególnie zauważalna w przypadku dużych baz danych.

Więc zacznijmy

  1. Stwórzmy obiekt COM
    • dla V82.Aplikacja Connection \u003d New COMObject ("V82.Application");
    • dla V82.COMConnector Connection \u003d New COMObject ("V82.COMConnector");
  2. Utwórzmy ciąg połączenia
    • dla wersji serwerowej bazy danych ConnectionString \u003d "Srvr \u003d" "ServerName" "; Ref \u003d" "BaseName";
    • dla wersji pliku bazy danych ConnectionString \u003d "File \u003d" "Path to Base" "; Usr \u003d nazwa użytkownika; Pwd \u003d hasło";
  3. Łączymy się z bazą Attempt to Connect \u003d Connect. Connect (ConnectionString); Komunikat o wyjątku \u003d Nowa wiadomość do użytkownika; Wiadomość. Text \u003d + DescriptionErrors (); Wiadomość. Zgłosić() ; Koniec prób;
  4. Zrywamy połączenie z bazą Połączenie \u003d niezdefiniowane;

    Do obiektu V82.Aplikacja konieczne jest zakończenie połączenia, w przeciwnym razie niezakończona sesja pozostanie zawieszona, co będzie musiało zostać usunięte ręcznie. W przypadku V82.COMConnector połączenie jest przerywane automatycznie po zakończeniu procedury, w której zostało utworzone. Jest jeszcze jeden mały punkt.

    W przypadku użytkownika, z którym następuje połączenie, w jego ustawieniach należy wyłączyć opcję „Pytaj o potwierdzenie przy zamykaniu programu”.

Teraz złóżmy razem cały kod.

Connection \u003d New COMObject ("V82.Application"); // Connection \u003d New COMObject ("V82.COMConnector"); ConnectionString \u003d "Srvr \u003d" "Server1C" "; Ref \u003d" "MyBase" "; Usr \u003d Petya; Pwd \u003d 123"; // ConnectionString \u003d "File \u003d" "С: \\ MyBase" "; Usr \u003d Petya; Pwd \u003d 123"; Attempt to Connect \u003d Connect. Connect (ConnectionString); Komunikat o wyjątku \u003d Nowa wiadomość do użytkownika; Wiadomość. Tekst \u003d „Nie udało się połączyć z bazą danych” + DescriptionErrors (); Wiadomość. Zgłosić() ; Koniec prób; Połączenie \u003d niezdefiniowane;

Dla typu połączenia V82.Aplikacja metoda jest używana dla obiektu COM, który został pierwotnie utworzony, i dla V82.COMConnector metoda jest stosowana do połączenia. dalsza praca z żądaniem odbywa się za pomocą standardowych narzędzi 1C. w kodzie wygląda to tak:

Żądanie \u003d połączenie. NewObject ("Żądanie"); // dla V82.COMConnector Żądanie \u003d połączenie. NewObject ("Żądanie"); // dla V82.Aplikacja Żądanie. Tekst \u003d „WYBIERZ | Pozycje organizacji. Kod, | Stanowiska organizacji. | OD | Katalog. Pozycje organizacji AS Stanowiska organizacji "; Wynik \u003d żądanie. Biegać (); Próbka \u003d wynik. Wybierz (); Podczas próbkowania. Next () Loop End of Loop;

W przypadku wersji 1C: Enterprise 8.3 wszystko pozostaje niezmienione, z wyjątkiem tego, że podczas tworzenia obiektów COM należy użyć „V83.COMConnector” lub „V83.Application”.

DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu