Šta je com veza? V8: COM veza

Jedan od načina za prijenos podataka iz jedne 1C konfiguracije u drugu je softverska veza koristeći COM. Mnoge kompanije koriste nekoliko različitih baza podataka, između kojih moraju postojati određene veze i zavisnosti. Ako je potrebno ne samo prenijeti podatke, već i izvršiti određenu obradu podataka, onda će COM veza biti optimalan mehanizam. Mogućnost analize podataka iz druge 1C baze podataka korisna je svakom programeru.

Povezujemo se preko COM-a na 1C bazu podataka

Za implementaciju COM veze u 1C koristi se poseban mehanizam nazvan COMConnector. Ovaj objekat se instalira zajedno sa platformom i koristi se za povezivanje infobaza. Treba napomenuti da se za verzije 8.2 i 8.3 koriste objekti s različitim imenima - “V82.COMConnector” i “V83.COMConnector”, respektivno.

Zapamtite da trajanje COM veze s bazom podataka košta licencu - nemojte se zanositi istovremenom izvršavanjem nekoliko veza. Ovo je posebno važno za organizacije koje imaju ograničen broj licenci. Ovaj problem se može riješiti korištenjem rutinskih zadataka izvršava se kada nema aktivnih korisničkih veza na infobazu.

Da biste se mogli povezati na drugu bazu podataka i zatražiti potrebne informacije trebali biste znati sljedeće informacije:

  1. Koji je to tip - fajl ili klijent-server;
  2. Gdje se nalazi;
  3. Koje ime i lozinku možete koristiti za prijavu?
  4. Koji podaci vas zanimaju?

Od prve tri tačke, da biste implementirali COM vezu, morate kreirati niz parametara. Ovisno o vrsti informacione sigurnosti, ona će se razlikovati izgled. Koristeći primljeni niz, uspostavlja se veza, uz pomoć koje možete prikupiti podatke iz druge baze podataka za analizu i obradu bilo kojim metodama.

Parametri vezeFileIB = "File=""Putanja_do_baze podataka""; Usr=""Korisničko_name"";Pwd=""Lozinka"""; Parametri vezeClientServerIB = "Srvr=""Server_Name""; Ref=""Name_baze_data""; Usr=""User_Name""; Pwd=""Lozinka""";

Funkcija povezivanja je jednostavna i ne bi trebala postavljati pitanja ako su svi parametri ispravno navedeni. Za ubrzanje otklanjanja grešaka i analize moguće greške bolje je spoj ugraditi u „Pokušaj“ konstrukciju. Funkcija će vratiti vrijednost tipa “COM objekat” s kojom ćete raditi na dobivanju potrebnih podataka.

&OnServer funkcija ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c baza podataka\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Novi COMObject("V83.COMConnector"); Pokušaj povratka V83COMCon.Connect(IB parametri veze); Izvještaj o izuzetku(ErrorDescription()); Return Undefined; EndAttempt; EndFunction

Preko COM veze ne možete samo odabrati podatke, već ih i dodati bazi podataka na koju se povezujete. Zapamtite da možemo prenijeti 4 primitivna tipa podataka preko COM objekta. Drugi tipovi će se morati specificirati korištenjem ugrađenih funkcija pretraživanja platforme. Imajte na umu da se funkcije globalne platforme također pozivaju putem COM veze.

Primamo podatke iz 1C baze podataka

Nakon što ste primili željeni objekt, potrebno je pročitati podatke iz druge baze podataka. Da bismo to učinili, koristimo zahtjev putem COM veze u 1C 8.3 koristeći primljenu vrijednost tipa "COM objekat" iz funkcije. Važno je prvo se povezati s bazom podataka, a zatim izvršiti zahtjev. Izvršenje se odvija putem NewObject metode, specificirajući tip objekta u obliku stringa kao parametar - “Zahtjev”.

&OnServer procedura TestCOMOnServer() Veza = ConnectToBase(); Ako TypeValue(Connection) Type("Undefined") Tada RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "IZABIR prvih 15 | Ime korisnika imenika KAO Ime |FROM | Direktorij.korisnici AS Korisnik imenika"; Odaberite = ZahtjevBPZO.Izvrši().select(); Dok Selection.next() petlja Izvještaj(Izbor.Broj); EndCycle; endIf; Kraj procedure >

Na primjer, da bismo dobili informacije o korisnicima određenog odjela, kroz parametre ćemo postaviti uvjet u zahtjevu. Jedan parametar će biti jednostavnog tipa– string, a podjela – veza do elementa direktorija „Struktura preduzeća“. Rezultat upita je tabela sa navedenim poljima tipa koji postoje u bazi podataka na koju je došlo do COM veze. Ako ih trebate pretvoriti u druge tipove, koristite standardne funkcije platforme:

  • Linija();
  • Broj();
  • Datum().
RequestBPZO = Connection.NewObject("Zahtjev"); RequestBPZO.Text = "IZABIR prvih 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | I DirectoryUser.Name kao ""%"" + &RequiredName+ ""%""" ; Zatražite BPZO.SetParameter("Potreban odjel", Veza. Imenici. Struktura poduzeća. Pronađi po kodu("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Odaberite = ZahtjevBPZO.Izvrši().select(); Dok Selection.next() petlja Report(Selection.Name); EndCycle;

Ako trebate prenijeti niz u bazu podataka radi odabira na osnovu nekoliko parametara, na primjer, odjela, također se koristi naredba NewObject. Slično, možete proslijediti listu ili tablicu vrijednosti, popunjavajući ih elementima druge baze podataka putem veze. Sve su dostupne za pretragu postojeće metode platformski objekti i mehanizmi.

RequestBPZO = Connection.NewObject.("Zahtjev"); RequestBPZO.Text = "SELECT prvih 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | I DirectoryUser.Name kao ""%"" + &NecessaryName+ ""%" " "; Niz odjela = Connection.NewObject("Niz"); Niz odjela.Dodavanje(Veza.Direktoriji.Struktura poduzeća.Pronađi po kodu("00-000023")); Niz odjela.Dodavanje(Veza.Direktoriji.Struktura poduzeća.Pronađi po kodu("00-000038")); Niz odjela.Dodavanje(Veza.Direktoriji.Struktura poduzeća.Pronađi po kodu("00-000046")); Zahtjev BPZO.SetParameter("Potreban odjel", Niz odjela); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Odaberite = ZahtjevBPZO.Izvrši().select(); Dok Selection.next() petlja Report(Selection.Name); EndCycle;

Prilikom prijenosa dokumenata ili elemenata imenika uvijek se postavlja pitanje kontrole prijenosa određenog objekta. Uz pomoć COM veza, takvi problemi se mogu riješiti kroz jedinstveni identifikator. Morate pronaći objekat u bazi podataka dodataka po identifikatoru iz trenutne sigurnosti informacija koristeći funkciju “GetLink”, koristeći identifikator kao string. Ako nije pronađen, možete ga kreirati pomoću COM veze.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Ako NIJE ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) onda NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Name; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); endIf;

Također, COM veza ima pravo da koristi procedure i funkcije iz uobičajenih 1C modula sa omogućenim svojstvom “Spoljna veza”. Pored ovog uvjeta, pozvana funkcija ili procedura mora biti eksportirana i ne uključuje interaktivne akcije koje se izvode na poslužitelju. U suprotnom, vidjet ćete grešku da je operacija nevažeća.

Compound..; VariableFunction = Veza...; poziv funkcije>opći naziv modula>poziv procedure>opći naziv modula>

Mogućnosti za eksterno povezivanje s drugom bazom podataka u 1C su prilično opsežne i mogu vam omogućiti obavljanje mnogih zadataka. Važno je biti u stanju ispravno procijeniti alate i odabrati optimalno rješenje. U većini slučajeva ova se vještina pojavljuje samo s iskustvom ili proučavanjem primjera rada iskusnih stručnjaka.


Ključne riječi: COM, veza, eksterno, OLE, Automatizacija, Connect, ComConnector, Srvr

Kada koristite 1C:Enterprise 8.0 COM veze za pristup podacima, postoje sljedeće prednosti u odnosu na korištenje Automation servera:

  1. Brže postavljanje veze jer nije potrebno kreirati poseban proces operativni sistem, a sve radnje se izvode unutar procesa pozivanja;

  2. Brži pristup svojstvima i metodama objekata 1C:Enterprise, budući da organiziranje pristupa ne zahtijeva međuprocesnu komunikaciju;
  3. Manja potrošnja resursa operativnog sistema.

Općenito, rad sa 1C:Enterprise 8.0 putem COM veze sličan je radu sa 1C:Enterprise u automatiziranom načinu rada servera. Glavne razlike su sljedeće:

  1. U slučaju Automation servera, pokreće se punopravna 1C:Enterprise 8.0 aplikacija, a u slučaju COM veze pokreće se relativno mali COM server u procesu.

  2. Nije dostupno kada se radi preko COM veze funkcionalnost nekako povezano sa organizacijom korisničkog interfejsa 1C:Enterprise 8.0;
  3. At rad COM- konekcije se ne koristi konfiguracijski aplikativni modul 1C:Enterprise 8.0. Njegovu ulogu pri radu sa COM vezom ima modul eksterne veze.

1.1 Procedura za uspostavljanje COM veze

Da biste organizirali pristup podacima 1C:Enterprise 8.0 putem COM veze, izvodi se sljedeći niz radnji:

  1. kreira se COM objekat sa identifikatorom V8.COMConnector, uz pomoć kojeg se uspostavlja veza;

  2. poziva se metoda Connect prethodno kreiranog objekta V8.COMConnector. Metoda Connect vraća referencu na COM objekt veze sa baza informacija 1C:Preduzeće 8.0;
  3. Preko primljenog objekta COM veze pristupa se važećim metodama, svojstvima i objektima infobaze sa kojom je veza uspostavljena.

Bitan! Zbog nedostatka korisničkog sučelja u COM vezi, ne mogu se svi objekti, svojstva i metode koristiti u COM vezi.

Objekti 1C:Enterprise dostupni eksterno preko COM veze:

  1. Izvezene varijable i procedure/funkcije vanjskog modula pridruživanja

  2. Izvezene varijable i procedure/funkcije zajedničkih modula
  3. Uključivanje i isključivanje cijelih modula postavljanjem svojstava zajedničkih modula

  4. Uključivanje i isključivanje fragmenata uobičajenih modula pomoću pretprocesora
  5. Globalni kontekst 1C:Enterprise 8.0, sa izuzetkom objekata usko povezanih sa klijentskom aplikacijom (TextDocument, TabularDocument, ...)

1.2 Eksterni priključni modul

Kao što je već napomenuto, odgovornosti aplikativnog modula pri radu preko COM veze obavlja vanjski modul veze. Ovaj modul može imati procedure rukovanja događajima When SystemStarts() i WhenSystemCompletes(), koje mogu sadržavati akcije koje se izvode nakon inicijalizacije i prekida veze, respektivno.

Procedure, funkcije i globalne varijable definirane u vanjskom modulu spajanja ključna riječ Izvozi postaju, kao u slučaju modula aplikacije, dio globalnog konteksta.

1.3 Zajednički moduli

Svojstva "Klijent", "Server" i "Spoljna veza" su uvedena za uobičajene module. Namijenjeni su da u konfiguraciji odrede upotrebu modula u verziji klijent - server iu COM načinu veze.

1.4 Objekt "V8.COMConnector"

Jedini zadatak koji rješava V8.COMConnector COM objekt je uspostavljanje COM veze sa informacijskom bazom 1C:Enterprise 8.0. Neograničen broj veza može se uspostaviti korištenjem jedne instance objekta V8.COMConnector. Objekt V8.COMConnector ima jednu metodu Connect, dizajniranu da uspostavi COM vezu sa 1C:Enterprise 8.0 info bazom.

<СтрокаСоединенияИБ>

Linija veze sa sistemom zaštite informacija je lanac fragmenata oblika Parametar=Vrijednost. Fragmenti su međusobno odvojeni znakom ";". Ako vrijednost sadrži razmaka znakova, onda se mora staviti u dvostruke navodnike (").

Uobičajeni parametri:

Usr - korisničko ime;
Pwd - lozinka.

Za verzija datoteke definiran parametar:

Fajl - direktorij infobaze.

Za opciju klijent-server definirani su sljedeći parametri:

Srvr - naziv servera 1C:Enterprise;
Ref - naziv infobaze na serveru.

Metoda Connect uspostavlja COM vezu sa 1C:Enterprise 8.0 infobazom i vraća vezu na objekt COM veze.

// Kreiran je objekt konektora
V8 = Novi COMObject("V8.COMConnector");
// kreiran je COM objekt veze
Connection = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 Objekt COM veze

COM veza sa 1C:Enterprise info bazom pruža potpuni pristup njegovom globalnom kontekstu (pogledajte „Izvršni kontekst softverski modul"). Stoga COM veza može imati kao svoje metode: sistemske konstante, vrijednosti specificirane u konfiguratoru objekata kojima se pristupa pomoću menadžera (na primjer, konstante, nabrajanja, direktorije, dokumenti, zapisnici dokumenata, izvještaji, obrada, planovi za tipove karakteristika, konta planova, planova tipova obračuna, registra), kao i promenljive deklarisane u modulu eksterne veze sa ključnom reči Export.

Osim toga, COM veza ima dodatna metoda NewObject, koji se može koristiti za kreiranje vrijednosti određenih tipova.

tz = Veza. NewObject("ValueTable");

String metoda Omogućava vam da dobijete string reprezentacije vrijednosti 1C:Enterprise.

Pogled = Connection.String(Data.UniqueIdentifier());

1.6. Karakteristike rada sa COM vezom

U automatizaciji iu COM vezi, TRUE i FALSE imaju sljedeće vrijednosti: -1 (minus jedan) i 0.

Moguće je organizirati skup COM veza. Istovremeno, nekoliko objekata COM veze se UNAPRET kreira na serveru primaoca 1C:Enterprise i potrebno je još manje vremena za uspostavljanje veze, jer nema potrebe za kreiranjem novog objekta.

Implementiran je novi objekat Query Builder, dizajniran da generiše tekstove upita na osnovu specificiranih postavki. Ovaj objekt podržava funkcionalnost graditelja izvještaja, koja nije povezana s izlaskom izvještaja u tabelarni dokument i drugim zadacima koji se odnose na korisnički interfejs. Ovaj objekt se može koristiti na 1C:Enterprise serveru iu COM konekciji.

Dostupan koristeći COM-objekti prilikom pokretanja ugrađenog jezika na serveru 1C:Enterprise.

COM greške se konvertuju u iznimke ugrađenog jezika.

Ako konfiguracija pokuša stvoriti nevažeći objekt, npr. tabelarni dokument, u modulu za eksternu vezu, u dijeljenom modulu ili u objektnom modulu, COM veza se ne može uspostaviti ili može biti prekinuta kao izuzetak.

Ispis (Ctrl+P)

Jedna od opcija za razmjenu podataka između 1C baza podataka je razmjena putem COM veze. Koristeći COM vezu, možete se povezati s jedne 1C baze podataka na drugu i čitati ili pisati podatke. Ova metoda se može koristiti i u klijent-server verzijama baza podataka iu bazama podataka datoteka. Ovaj članak govori o ovim tipovima veza na platformi 8.3

com veza

Možete kreirati dvije vrste COM objekata za 1C aplikaciju. Ovo su ole veze V83.Primjena i com veze V83.COMConnector . U slučaju da V83.Primjena Pokreće se gotovo potpuna kopija 1C aplikacije. U slučaju upotrebe V83.COMConnector Pokrenut je mali serverski dio. Brzina rada u ovom slučaju je veća, ali neke funkcije možda neće biti dostupne. Konkretno, rad sa obrascima i zajednički moduli za koje nije postavljeno svojstvo rada sa vanjskim vezama. Uglavnom biste trebali koristiti V83.COMConnector i to samo u slučaju nedostatka funkcionalnosti V83.Primjena. Razlika u brzini rada može biti posebno uočljiva na bazama podataka velikih količina. Za platformu 8.2 korišteno V82.Application ili V82.COMConnector

Uspostavite OLE vezu

Veza = Novi COMObject(“V83.Application”) ;

Uspostavite COM vezu

Veza = Novi COMObject(“V83.COMConnector”) ;

Connection string

//Za opciju klijent-server
Connection String= “Srvr = ““Ime servera” “;Ref = “ “Ime baze” ;
//Za opciju režima datoteke:
Connection String= “File = ““PathKBase” “; Usr = Korisničko ime; Pwd = Lozinka”;
Pokušaj
Veza = Veza . Povežite se(ConnectionString) ;
Izuzetak
Poruka = ​​New MessageToUser;
Poruka . Tekst = “Povezivanje na bazu podataka nije uspjelo” + DescriptionErrors(); Poruka . Prijaviti();
EndAttempt ;

Isključivanje

Veza = Nedefinirano ;
Za objekt V83.Primjena Neophodno je prekinuti vezu, inače će ostati nekompletna sesija, koja će se potom morati ručno izbrisati. U slučaju da V83.COMConnector veza se automatski prekida kada se završi procedura u kojoj je veza napravljena i postoji još jedna mala tačka. Za korisnika pod kojim se uspostavlja veza, polje za potvrdu „Zahtjev za potvrdu pri zatvaranju programa“ mora biti onemogućeno u njegovim postavkama.

Metoda NewObject().

Za kreiranje novog objekta možete koristiti metodu NewObject(), na primjer:

Za V83.COMConnector

RequestCOM = Veza. NewObject( "Zahtjev") ;
TableCOM = Veza. NewObject( “Tabela vrijednosti”) ;
ArrayCOM = Veza. NewObject(“Niz”) ;

ViewCOM =Connection.NewObject

Za V83.Primjena

RequestOLE = Veza. NewObject(“ Zatraži ") ;
TableOLE = Veza. NewObject(“Tabela vrijednosti”) ;
ArrayOLE = Connection.NewObject(“Niz” ) ;
ViewCOM =Connection.NewObject(“UniqueIdentifier”, StringUID);

RequestCOM . Tekst =„IZABIR
| Kodeks pozicija organizacija.
| Pozicije organizacija.Naziv
|OD | Imenik.Pozicije organizacija
KAKO NA POZICIJE ORGANIZACIJA”;

Rezultat = RequestCOM. Pokreni();
Uzorak = Rezultat. Odaberite () ;
Bye Selection. Sljedeći()Ciklus
EndCycle ;
Također možete koristiti upravitelje konfiguracijskih objekata:
DirektorijCOM = Veza. Imenici. Ime imenika;
DocumentCOM = Veza. Dokumentacija. DocumentName;
RegisterCOM = Veza. Informacijski registri. RegisterName ;

Primanje i upoređivanje nabrajanja preko COM veze

Za usporedbu vrijednosti elemenata nabrajanja definiranih u konfiguraciji, potrebno je ove elemente pretvoriti u jedan od primitivnih tipova, čije je poređenje lako. Takvi tipovi mogu biti ili numerički ili string tipovi. Možete pretvoriti vrijednost elementa nabrajanja u numerički tip ovako:

Enum Item = Connection.Directory.Directory1.FindByCode(1).Props1;

PossibleValues ​​= Enum Element.Metadata().Enum Values;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Ako je EnumerationItemNumber = 0, onda Report( “Enumer value1”);

ElseIfEnumerationItemNumber = 1 Onda Izvještaj("EnumerationValue2");

endIf;

Dohvaćanje objekta preko COM-a po identifikatoru

Kroz upravitelje konfiguracijskih objekata dobijamo com objekt, na primjer:
DocumentCOM = Veza. Dokumentacija. DocumentName;

Tada dobijamo jedinstveni niz identifikatora:

StringUID =Connection.string ( DocumentCOM.UniqueIdentifier())

Identifikator = Novo U jedinstveni identifikator (StringUID);
WITH linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Ako trebate pronaći com objekt po dokumentu po identifikatoru, onda trebate napisati ovako:

WidCOM = Connection.NewObject(“UniqueIdentifier”, StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

) Tako je

U isto vrijeme, vidio sam više puta kada su publikacije koje nisu dostigle ni 10 bodova jednostavno „uzletjele“.
Zašto se to dogodilo? Očigledno zato što su se nekome očigledno dopale.


To je ono što govorim, da bi bilo lijepo shvatiti koliko vam je to potrebno bez čitanja članka o ocjeni, ili da to ocijenite ne tako primitivno +/-. Što se tiče onoga što mi se svidjelo, ispravio bih to ovako: toliko je dobio zbog činjenice da su se zvijezde posložile i da se na stranici okupilo mnogo ljudi i da se mnogima dopalo, i sami razumijete da je ovo stvar slučaja jer čim članak izađe početna stranica onda se već može naći samo po zahtjevu, i tako svi prolaznici glasaju. I, koliko razumijem, stalni komentari = promocija članka omogućavaju vam da ga održite na glavnoj stranici.
Upravo zbog toga stavljaju prodavnice na javne ulice – uostalom, često nije važan kvalitet i relevantnost robe, već prometnost mesta koja ljudi često kupuju nešto što će sutradan baciti radi procesa. Ovo je bolest koja je svima odavno poznata - ovisnost o kupovini. Ili jednostavno povećanje protoka povećava vjerovatnoću pravog kupca.

A za i protiv... - ovo je samo neka vrsta „hvala“ za utrošeno vrijeme i rad


One. Da li se i minus računa kao "hvala"? Zanimalo me vaše mišljenje o tome da li ga treba koristiti u takvim slučajevima i koliko drugi misle zanimljivo? Da li ga staviti kada je članak štetan/loš ili kada je za tebe jednostavno beskoristan/prazan?
Po mom mišljenju, članak izgleda kao jednostavno povećanje rejtinga, jer:
1. Problem sa tipovima koji sam naveo autor je potpuno ignorisao, iako nije bio lijen da napiše gomilu komentara.
2. U članku je očigledna netačnost: kaže se da je to jedini način

V82 = Novi COMObject("V82.ComConnector"); Šifra = AccountCOM.Code;


ali to mogu lako učiniti koristeći obradu poput ove:

Izvještaj(Baza. Imenici. Ugovorne strane. Pronađi po imenu("LLC"). Šifra);


i sve je u redu! I biram vezu V82.ComConnector
Nekako je čudno da autora uopšte nije briga što njegov članak sadrži probleme na koje je ukazano, ali on nikako ne reaguje.
3. Ali i dalje postoji problem kada se pojavi greška “Klasa ne postoji”.
4. Postoji problem kada je instaliran 8.2, a zatim instaliran 8.1 - pokušajte zamijeniti putem OLE/COM tipična razmena UT-BP!
5. Možete li navesti glavnu obradu na stranici koja vam omogućava univerzalno povezivanje preko OLE/COM-a da početnici ne gube vrijeme, vi pišite za njih! Usput, iz nekog razloga njena slika je na vašem displeju, zašto? I kao rezultat, 2 riječi o meritumu i još 6 iza scene.

Generalno, ne bacam blato, već ukazujem na određene praznine, ali nema reakcije. Ako je ovo iskustvo koje dijelite, onda je ono na neki način pogrešno i nepotpuno.
Moja poenta je da ako je autor imao želju da sakupi sve propuste, mogao bi barem saslušati tuđa iskustva, a ne da se nabacuje komentarima. Odmah nastaje situacija kada onaj ko je pročitao zna više od autora, kažu mu (ponekad i pogrešno), a i on uzvrati. Kao rezultat toga, sve informacije nisu u članku, već u komentarima! Smiješno! To se često dešava, ali ne morate da se fokusirate na to da ste želeli najbolje - ja pokazujem šta je najbolje, a drugi to pokazuju! Uključite ovo u članak i neće svi biti zainteresirani za čitanje ovog okršaja.

Dijeli