1c upravljani obrasci za postavljanje pitanja korisniku. Kako koristiti showquestion u rukovatelju obrascima prije objave

Uvod

Zašto se uopće isplati napustiti modalnost i, na primjer, zamijeniti Question s ShowQuestion? Stvar je u tome što su prije više od godinu dana nadimci 1C objavili "rat" modalnim prozorima. Jedina iznimka su oni koji imaju samostalno napisanu konfiguraciju, koja neće raditi na iPadu, u servisnom načinu rada ili korištenjem web klijenta. A ako imate obično računovodstvo 3.0 i nećete računovođi omogućiti pristup bazi podataka putem iPada, svejedno ćete morati zamijeniti sve modalne metode nemodalnima, jer prije ili kasnije "Modality Use Mode" će postati "Do Not Use"!

Što stručnjaci 1C misle o ovom predloženom problemu? Za početak možete pogledati temu “Pitanje u rukovatelju obrascima BeforeClose”:

Osobitost dijaloga s korisnikom u ovom (i mnogim drugim) rukovateljima je da se, ovisno o reakciji korisnika, donosi odluka: nastaviti s daljnjim radnjama ili ih odustati. Da biste to učinili, upotrijebite parametar Odbaci postupak. S jednim odgovorom korisnika odbijamo nastavak (Odbijanje = Istina). Ukoliko korisnik odgovori drugačije, nastavljamo dalje radnje.

U ovom slučaju, poteškoća leži u činjenici da ćemo odgovor korisnika saznati nakon što izađemo iz konteksta ovog rukovatelja. U postupku koji obrađuje dojavu. Parametar odbijanja mora biti postavljen u ovom određenom rukovatelju.

Stoga djelujemo u dva koraka:

Prvi put bezuvjetno otkazujemo daljnje radnje (Odbijanje = Istina) i prikazujemo pitanje korisniku;

U rukovatelju obavijestima, ovisno o reakciji korisnika, ponovno programski zatvaramo obrazac ili ne činimo ništa.

Problem je u tome što će se rukovatelj BeforeClose dvaput izvršiti. A kako bismo razlikovali prvo izvršenje od drugog (kada je korisnikov odgovor već poznat), koristimo klijentsku varijablu In ProgressClose kao oznaku.

Prilikom prvog prolaza, njegova vrijednost je False, što znači da morate odustati od zatvaranja i postaviti pitanje. U drugom prolazu njegova vrijednost je True, što znači da ne treba postavljati pitanje:

&OnClient Variation In ProgressClosing; &OnClient Procedure BeforeClose(Failure, StandardProcessing) Ako se zatvaranje ne izvrši, tada Failure=True; ShowQuestion(New AlertDescription("BeforeClosingCompletion", ThisObject), "Trebam li zatvoriti obrazac?", DialogModeQuestion.YesNo); završi ako; Kraj postupka &na klijentovom postupku Prije zatvaranja Završetak (Rezultat pitanja, parametri snimanja) Eksport Ako Rezultat pitanja = Dijalog Povratni kod Da, zatim Izvrši Zatvaranje = Istina; Zatvoriti(); završi ako; Kraj postupka

Ovaj je primjer sličan našoj temi i često se spominje u temi “Prikaži pitanje u obrascu prije objave”:

Također može postojati potreba za postavljanjem pitanja u obrascu za obradu događaja BeforeRecord. Kao u prethodnom primjeru. Međutim, ovdje se problem ne može tako lako riješiti. Razlika je u ovome.

U prethodnom primjeru, nakon što smo bili u rukovatelju BeforeClose, jasno smo znali radnju koju treba izvesti. Ovo je zatvaranje obrasca. Stoga smo prilikom obrade upozorenja hrabro napisali Close().

Ali u rukovatelju BeforeRecord nemamo takve jednoznačne informacije. Možemo završiti u ovom rukovatelju iz dva razloga: ako je korisnik kliknuo Snimi ili ako je kliknuo Snimi i zatvori. Odnosno, daljnji scenarij djelovanja nije nam poznat. Ne možemo ga definirati pomoću standardnih metoda dok smo unutar ovog rukovatelja.

Stoga, ovdje možemo ponuditi tri opcije, ali, nažalost, sve imaju nedostatke:

* Promijenite logiku aplikacijskog rješenja tako da u ovom rukovatelju nema dijaloga s korisnikom. To nije uvijek moguće;

* Prilikom obrade upozorenja koristeći vlastiti obrazac za blokiranje, postavite korisniku detaljno pitanje koje daje točan opis daljnjih radnji: Odbiti?, Samo snimiti?, Snimiti i zatvoriti? Ovo možda neće izgledati baš lijepo, jer je korisnik već kliknuo “Spremi i zatvori” i ponovno ga se pita o tome;

* Nemojte koristiti standardne naredbe forme Write, "Save and Close". Umjesto toga, kreirajte vlastite naredbe u kojima ćete izvršiti potrebne algoritme. Stvaranje vlastitih timova zahtijevat će dodatne troškove rada.

Zadatak je složen, pa programeri, kada postavljaju pitanje prije snimanja, prije svega preporučuju napuštanje ove ideje...

Zatim vas zamole da postavite pitanje s mnogo opcija: "Odbij, Samo snimi, Snimi i zatvori." Uz opisani nedostatak (korisnik već unaprijed odabere opciju, pa ga se ponovno pita), postoji još jedna stvar: programu se može pristupiti i iz Prije snimanja iz “Otkazivanja”. Oni. Trebam li dodati još jedan gumb? Mislim da je ova opcija ružna.

Ostaje samo treća opcija koja koristi nestandardne naredbe obrasca. Mi ćemo to provesti. A jedina nestandardna naredba koju ćemo imati je "Objavi i zatvori". Kao u primjeru na temu “Pitanje u obradi obrasca BeforeClose”, morat ćemo dati Refusal = True na prvom pozivu, a tek na drugom pozivu izvršiti stvarno snimanje. Negdje ćemo morati zapamtiti da je ovo drugi unos u proceduru "Prije snimanja". 1C je predložio da se to učini putem zajedničke varijable klijenta; u primjeru koji se razmatra, to se može učiniti putem parametara snimanja.

Primjer korištenja ShowQuestion u rukovatelju obrascima BeforeRecord

1. Prvo, moramo ukloniti standardnu ​​naredbu “Prevucite prstom i zatvori” iz obrasca i izraditi vlastitu naredbu i gumb.

1.A. Ako već imate nestandardni gumb "Prevucite i zatvorite", imate sreće, možete sigurno prijeći na korak 2.

1.B. Standardna naredba uklanja se putem Svojstva obrasca - Sastav naredbe - Ukloni nepotrebnu naredbu. Neću opisivati ​​kako dodati naredbu i gumb u obrazac, samo ću vas podsjetiti da gumb "Pošalji i zatvori" mora biti postavljen kao zadani gumb.

1.V. Sada je opciju teže implementirati, ali je lakše održavati sa standardnom konfiguracijom. U gotovo svakom ažuriranju Računovodstva, programeri uspiju promijeniti 10-50% obrazaca dokumenata, tako da je u tipičnoj konfiguraciji za održavanje lakše ukloniti standardni gumb kodom i dodati vlastitu naredbu i gumb.

Za početak, u rukovatelju obrascima "Pri otvaranju" morate ukloniti standardni gumb "Nastavi i zatvori".

Elements.FormSwipeIClose.Visibility = False;

Napomena: za korisnika s velikim ograničenjima za dokument na platformi 8.3.7, gumb "Objavi i zatvori" uopće se ne pojavljuje. Stoga je za platformu 8.3.7 ispravnije napisati kod:

If Elements.Find("FormProductIClose")<>Undefined Then Elements.FormSwipeIClose.Visibility = False; završi ako;

NewCommand1 = ThisForm.Commands.Add("SwipeANDClose2"); NewCommand1.Action = "SwipeIClose"; NewElement = Elements.Add("FormAddAndClose2" , Type("FormButton"), Elements.FormCommandBar); NewElement.Title = "Prevucite i zatvorite"; NewElement.CommandName = NewCommand1.Name; NewElement.DefaultButton = True; Elementi.Move(NoviElement, NoviElement.Parent, Elementi.CommandBarButtonGroup);

Sukladno tome, ovaj kod sadrži tipične nazive za Opći obrazac dokumenta dokumenta „Potvrda (akti, fakture)” (npr. Elements.GroupButtons CommandBar-a), koje će u svakom konkretnom slučaju morati promijeniti u svoje.

&OnClient procedura RunIClose(Command) Parametri zapisa = Nova struktura(); Parametri snimanja.Insert("Način snimanja", PredefinedValue("DocumentRecordingMode.Post")); Parametri zapisa.Insert("Zatvori", True); If Write(Record Parameters) Then Close(); završi ako; Kraj postupka

Kao što sam gore napisao, razmjenjivat ćemo informacije između naših procedura putem parametara zapisa. U Prije snimanja ne znamo jesmo li kliknuli na "Snimi", "Objavi" ili "Objavi i zatvori", za to prosljeđujemo parametar Zatvori u parametrima. Ako postoji ovaj parametar u parametrima unosa, onda je potrebno zatvoriti obrazac nakon uspješnog unosa.

3. Recimo da ne trebamo uvijek postavljati pitanje, već samo kada je dokument obrađen. Sada dodajemo (ako ovaj postupak nije postojao, kreirajte) novi kod u postupak “Prije snimanja”:

If Not RecordParameters.Property("QuestionAsked") AND Object.Passed Then Failure = True; Alert = New AlertDescription("ShowQuestionComplete", ThisForm, PostOptions); Question Text = "Ovaj dokument je već objavljen. Želite li stvarno ponovno objaviti ili otkazati objavljivanje dokumenta?"; ShowQuestion(Alert, QuestionText, DialogModeQuestion.YesNo, 20,DialogReturnCode.No,DialogReturnCode.No); završi ako;

Ispunit ćemo svojstvo “Question Asked” u obavijesti kako bismo saznali kada smo drugi put ušli u proceduru “BeforeRecording” (u primjeru 1C u proceduri BeforeClosing to je učinjeno putem varijable “Closing in Progress”). Drugim riječima: u strukturi “Record Options” postoji svojstvo “Question Asked”, što znači da je pitanje već postavljeno, a korisnik je već odgovorio potvrdno, ali ako nema svojstva, onda je ovo naš prvi put u proceduri “Prije snimanja”.

Nakon metode ShowQuestion možete napisati i “Return” ako imate neki drugi kod u proceduri “BeforeWrite” koja se izvršava nakon pitanja.

4. Napravite proceduru “Show QuestionComplete” u koju će program ući kada korisnik odgovori na pitanje (ili kada istekne vrijeme).

&Na klijentskom postupku ShowQuestionCompletion(Result, Record Parameters) Export If Result = DialogReturnCode.Yes Then Record Parameters.Insert("QuestionAsked", True); If Write(RecordParameters) ANDRecordParameters.Property("Close") Then Close(); završi ako; završi ako; Kraj postupka

U ovoj proceduri koristimo svojstvo "Zatvori" koje je prethodno preneseno. Ako nema imovine, onda je nema potrebe zatvarati.

5. Sada moramo obraditi korisnikov pritisak na "križ". Da bismo to učinili, potreban nam je rukovatelj obrascem “BeforeClose”. Ako ne postoji, može se kreirati na obrascu ručno ili programski u rukovatelju "When CreatedOnServer":

ThisForm.SetAction("Prije zatvaranja","Prije zatvaranja");

&OnClient Procedure BeforeClose(Failure, StandardProcessing) If Modified Then Failure = True; QuestionText = NStr("ru = "Podaci su promijenjeni. Želite li spremiti promjene?""); Upozorenje = Novi opis upozorenja ("Pitanje prije završetka zatvaranja", Ovaj objekt); ShowQuestion(Alert, QuestionText, DialogModeQuestion.YesNoCancel); završi ako; Kraj procedure &Na klijentskoj proceduri QuestionBeforeClosingCompletion(Result, AdditionalParameters) Export If Result = DialogReturnCode.Yes ThenRecordParameters = New Structure(); Parametri zapisa.Insert("Zatvori", True); If Write(Record Parameters) Then Close(); završi ako; ElseIf Result = DialogReturnCode.No Then Modification = False; Zatvoriti(); završi ako; Kraj postupka

Ispada da kada korisnik klikne križić, prvo će odgovoriti na pitanje "Spremi promjene?" a zatim će se postaviti još jedno pitanje koje ste napisali "Prije snimanja". Ako niste zadovoljni s ovim, možete proslijediti parametar “QuestionAsked” u “QuestionBeforeCloseCompletion” i tada neće biti drugog pitanja.

Pitanje protiv ShowQuestion

Kako bismo riješili problem da možemo koristiti modalne pozive? I vrlo jednostavno, napisali bismo sljedeći kod u proceduri “BeforeWrite”:

If Object.Posted Then Question Text = "Ovaj dokument je već objavljen. Želite li stvarno ponovno objaviti ili otkazati objavljivanje dokumenta?"; Odgovor = Pitanje(Tekst pitanja,DialogModeQuestion.YesNo,20,DialogReturnCode.No,DialogReturnCode.No); Ako nije Odgovor = Povratni kod dijaloga Da Onda Odbijanje = Istina; Povratak; završi ako; završi ako;

To je sve! Nema "problema" poput "Što je korisnik kliknuo: Prevucite ili Prevucite i zatvorite?" Također ćete morati vježbati pritiskanje križića u "Prije zatvaranja".

U početku sam implementirao sličan kôd u svoje Enterprise Accounting 3.0. Zadatak je bio sljedeći: pod određenim skupom uvjeta (ovo nije samo jedan uvjet Object.Performed, kao što je navedeno u primjeru u ovoj publikaciji) iz obrasca dokumenta Opći dokument o primitku robe i usluga, zatražite dodatnu potvrdu svojih radnji. Dolje su navedene nijanse koje nisam morao zaobići, jer... nisu bili na visini zadatka.

Program ne ulazi u procesor obrasca “Prije unosa” ako: 1) je korisnik kliknuo na gumb “Označi za brisanje / odznači”; 2) ako je korisnik pritisnuo tipku “DT/CT” na neprovjerenom dokumentu. I to nije sve: ako ste sve kreirali na obrascu dokumenta kao što sam napisao, a korisnik ponovno unese dokument iz obrasca popisa, tada mu program neće postavljati nikakva pitanja. Morate zamijeniti sve gumbe koji vas zanimaju na obrascu s popisom vlastitim i pratiti radnje korisnika. Dokument također može imati više od jednog oblika dokumenta, ali nekoliko (na primjer, dokument Potvrda o primitku robe i usluga u BP 3.0, gdje postoje 3 oblika: opći, roba i usluge). U svakom obrascu dokumenta morate napisati puno koda...

Zbog hrpe nijansi, prvi savjet iz 1C ostaje relevantan (koji vam se u početku, bez detaljnog ulaženja u zadatak, može nasmiješiti): „Promijenite logiku aplikacijskog rješenja tako da nema dijaloga s korisnikom u ovom rukovatelju.”

Definirajmo što je dijalog? Pozivanje naredbe Prijaviti je dijalog? I poziv ekipe Unesite broj! Izazov OpenValue?

Dakle, dijalog je prije svega element grafičko sučelje. prozor. I stoga izazov Prijaviti nije dijaloški okvir jer nema vlastiti zasebni prozor.

Dijalog nije samo prozor. Ovo je prozor koji se otvara korisniku za prikaz informacija i (ili) primanje odgovora.

Primjeri dijaloga:

1 C: Poduzeće X

Zavod za primijenjenu informatiku

iignichchí̈íí̈í̈í̈íí̈zinííí̈í̈í̈í̈í̈í̈í̈íí̈íí̈

Da biste prikazali dijaloški okvir, morate pozvati naredbu koja odgovara tom dijaloškom okviru i proslijediti mu potrebne parametre. Ova naredba je redovita procedura ili funkcija, koju nismo napisali mi, već 1C programeri. Ove naredbe ne možemo promijeniti, možemo ih samo pozvati. Pogledajmo neke od njih.

Upozorenje

Izvrstan primjer dijaloga je prikazati upozorenje korisniku:

Upozorenje ("Oprez!");

Što vidimo? Pozivanje naredbe Upozorenje, kojemu se string “Oprez” prosljeđuje kao parametar.

Kada računalo dođe do retka u kojem se poziva ova naredba, korisniku će se prikazati dijaloški okvir upozorenja. I dok korisnik ne zatvori ovaj dijaloški okvir, računalo će čekati na istoj liniji. Tek nakon zatvaranja dijaloga nastavlja se izvršavanje programa i počinje izvršavanje retka koji slijedi nakon poziva dijaloga.

Na primjer, recimo da imamo ovaj kod:

Upozorenje (" 1");

Upozorenje ("2");

Upozorenje ("3");

Kako će se provoditi?

Prvo će računalo doći do linije br. 1 i izvršiti naredbu Upozorenje s parametrom "1". U tom trenutku korisnik će vidjeti dijaloški okvir s tekstom “1”, a računalo će se zaustaviti na ovom retku i čekati da korisnik zatvori dijalog.

Nakon zatvaranja dijaloga računalo će prijeći na red br. 2 i izvršiti naredbu Upozorenje već s drugim parametrom "2". Korisnik će ponovno vidjeti dijaloški okvir, ali s tekstom “2”, a računalo će se zaustaviti u drugom retku i čekati da korisnik zatvori dijalog.

Računalo će tada prijeći na treću liniju. Pa, i tako dalje.

Tim Upozorenje parametar odgovoran za tekst koji se prikazuje nije jedini. Postoje dvije dodatne opcije:

Upozorenje(,, )

Pauza- znači broj sekundi nakon kojih će se dijaloški okvir zatvoriti ako to korisnik ne učini.

Naslov- zamjenjuje standardni naslov "1 C: Enterprise" linijom korisnika.

Na primjer, ovaj kôd:

Upozorenje ("Oprez.", 5, "Pažnja!");

prikazat će dijaloški okvir s tekstom "Oprez." i naslov "Pažnja!", te će se također zatvoriti za 5 sekundi ako korisnik to ne učini ranije:

Pažnja!

Pažljivo.

Ali što ako želimo postaviti samo tekst i naslov prozora, a ne postaviti timeout?

Prvo, možemo proslijediti nulu kao timeout:

Upozorenje ("Oprez.", Oh, "Pažnja!");

I drugo, možemo jednostavno ostaviti prazan prostor umjesto parametra, a sustav će sam shvatiti da moramo ostaviti njegovu zadanu vrijednost:

Upozorenje ("Oprez.", "Pažnja!");

Kako biste saznali sve moguće parametre ugrađenih 1C naredbi, upotrijebite pomoćnika za sintaksu kao što je opisano u jednoj od prethodnih cjelina.

Upisivanje broja

Neki dijalozi ne samo da prikazuju neke informacije od nas korisniku, već, naprotiv, vraćaju neki rezultat interakcije s korisnikom. Primjer takvog dijaloga je unos broja.

Na primjer, napišimo:

UnesiteBroj(Broj);

Unesite broj

Zašto prosljeđujemo parametar naredbi? Broj? Prvo, kako bi se prikazala početna vrijednost unosa u dijaloškom okviru. I, drugo, vratiti vrijednost koju je korisnik unio u ovu varijablu.

Ali što ako je korisnik odustao od unosa i kliknuo gumb Odustani? Kako saznati za ovo? Ispada da funkcija UnesiteBroj ne samo da prikazuje dijaloški okvir za unos broja, već se i vraća na nas Pravi ako je korisnik kliknuo gumb "OK", i Laž, ako je poništio unos klikom na gumb "Odustani".

Stoga bi sljedeći kod bio ispravniji:

Rezultat = UnesiteBroj(Broj);

If Result = True Then OpenValue("Unijeli ste " + String(Number));

OpenValue("Otkazali ste svoj unos");

završi ako;

Na varijablu Proizlaziti(naziv može biti bilo koji) vraća True ili False ovisno o tome koji je gumb korisnik pritisnuo ("OK" ili "Cancel").

Na varijablu Broj vraća broj koji je unio korisnik.

Pitanje

Posljednji dijalog koji ćemo pogledati je dijaloški okvir Pitaj korisnika.

Znamo ime naredbe koja uzrokuje ovaj dijalog - Pitanje.

Pogledajmo sada u pomoćniku za sintaksu da vidimo koje parametre ova naredba prihvaća:

Pitanje (, >)

Tekst pitanja- to je samo pitanje u tekstualnom obliku koje će korisnik vidjeti.

Gumbi- ovo je jedna od unaprijed definiranih vrijednosti, koja se također može vidjeti u pomoćniku za sintaksu. Na primjer, ako prijeđete na ovaj parametar:

  • Način dijalogaPitanje.DaNe - dijalog će imati samo dva gumba Da i Ne.
  • Dialogue ModeQuestion.YesNoCancel - tri gumba Da, Ne i Odustani.
  • Dialogue ModeQuestion.OkCancel - dva gumba OK i Cancel.
  • I druge opcije gumba.

Pauza- Ovaj parametar nam je već poznat.

ButtonDefault- ovo je gumb koji će imati fokus kada se prikaže prozor. Njegova značenja mogu biti:

  • Dijalog Povratni kod br
  • Povratni kod dijaloga. Da
  • Povratni kod dijaloga. Odustani
  • I druge tipke.

Naslov- ovaj parametar nam je već poznat.

Gumb za vremensko ograničenje- ako postavite vrijednost ovog gumba i parametra Pauza, tada će prikazati broj preostalih sekundi do zatvaranja dijaloškog okvira. Može imati iste vrijednosti kao i parametar ButtonDefault.

Kao što vidite, postoji mnogo parametara. Ali ne morate ih sve koristiti. Kao što slijedi iz pomoćnika za sintaksu, potrebna su samo prva dva:

Pitanje (“Razumijete li gradivo?”,

Dijaloški način Pitanje.Da Ne);

Postavili smo pitanje. Bilo bi lijepo da sada dobijemo odgovor da li je gradivo jasno ili nije. Iz istog pomoćnika sintakse saznajemo da se gumb na koji je kliknuto vraća kao rezultat poziva naredbe Pitanje.

Rezultat = Pitanje("Razumijete li gradivo?", DialogModeQuestion.YesNo);

If Result = DialogReturnCode.Yes Then OpenValue("Kakav si ti super dečko!");

OpenValue("Ponovo obavite zadatke!");

završi ako;

Modalitet

Svi primjeri dijaloškog okvira koje smo pogledali su modalni jer se računalo, kada prikazuje dijaloški okvir, zaustavlja na istom retku i ne nastavlja dalje dok se dijaloški okvir ne zatvori.

Drugi način da to kažemo je da kada prikažemo modalni dijalog, korisnik može komunicirati samo s tim dijalogom. Rad s ostatkom sustava je blokiran dok se dijaloški okvir ne zatvori.

Nemodalne verzije dijaloga nemaju taj nedostatak, ali je prerano da prijeđemo na njih.

Za uvježbavanje i učvršćivanje gradiva ove jedinice preporuča se izvršiti sljedeći zadatak.

Napišite program koji pita korisnika "Pritisnite Da za prikaz brojeva od 1 do 10, Ne za prikaz brojeva od 10 do 100, nemojte pritisnuti gumb Odustani ni pod kojim okolnostima." Dijalog bi trebao imati tri gumba Da, Ne i Odustani.

Ako je korisnik kliknuo Da, prikazujemo brojeve od 1 do 10, Ne, od 10 do 100, Odustani, prikazujemo dijaloški okvir upozorenja s tekstom "Upozorili smo vas da ne pritisnete Odustani!"

Riješenje

Rezultat = Pitanje(

"Kliknite Da za prikaz brojeva od 1 do 10" +

", Ne - za prikaz brojeva od 10 do 100, ni na koji način" +

"u ovom slučaju nemojte pritisnuti gumb Odustani", Dialogue ModeQuestion. DaNeOdustani);

If Result = DialogReturnCode.Yes Then For Step = 1 To 10 Cycle Report(Step);

EndCycle;

OtherwiseIf Result = DialogReturnCode.No Then For Step = 10 By 100 Cycle Report(Step);

EndCycle;

OtherwiseIf Result = DialogReturnCode.Cancel Then OpenValue("Upozorili smo vas da ne pritisnete odustani!");

Postavite pitanje o računovodstvu i u roku od sedam radnih dana dobit ćete odgovor od revizora ili metodologa iz 1C.
Možete postaviti pitanje na: [e-mail zaštićen] ili pomoću web obrasca.

Uvjeti korištenja

Primaju se pitanja o sljedećim temama:

  • postupak priznavanja prihoda i rashoda organizacije;
  • oporezivanje i evidentiranje pojedinih poslovnih transakcija;
  • ispunjavanje računovodstvenih (uključujući primarne) dokumenata;
  • utvrđivanje porezne osnovice za poreze i doprinose;
  • postupak plaćanja poreza i doprinosa;
  • popunjavanje i podnošenje računovodstvenih i poreznih izvješća te izvješća o doprinosima;
  • postupak zapošljavanja, nagrađivanja, kažnjavanja i otpuštanja radnika;
  • postupak dodjele različitih plaćanja osoblju (plaća za godišnji odmor, naknade, naknade);
  • ispunjavanje raznih kadrovskih dokumenata.

Iznimke uključuju pitanja

  • o organizaciji i optimizaciji poslovanja;
  • o optimizaciji oporezivanja i izboru organizacijsko-pravnog oblika i režima oporezivanja;
  • u vezi s procjenom rizika;
  • koji se odnose na pravne odnose koji su uređeni stranim, regionalnim i domaćim zakonodavstvom;
  • o izradi i ocjeni pravno značajnih dokumenata (ugovora, akata, zahtjeva, tužbi, naloga, uputa i sl.);
  • o procjeni poslovnih transakcija obavljenih na određeni način;
  • koji se odnosi na valutnu regulaciju;
  • netočno formuliran (sadržaj pitanja ne dopušta točan odgovor);
  • pitanja vezana uz oporezivanje pojedinaca.

Od jednog korisnika prihvaća se samo jedno pitanje. Korisnik može poslati sljedeće pitanje nakon što dobije odgovor na prethodno pitanje.

Cijena

    Usluga "Odgovori revizora" uključena je u pakete podrške informacijske tehnologije razine 1C:ITS PROF.

Dodatno

Kako ispravno postaviti pitanje

  • Navedite naziv i pravni oblik organizacije.
  • Navedite registarski broj programa za koji je izdan 1C:ITS ugovor.
  • Opišite poslovnu situaciju koja je potaknula pitanje:
    • formulirati uvjete pod kojima je nastao;
    • navesti radnje koje su izvršene;
    • navedite značajke koje utječu na odgovor (porezni režim, razdoblje transakcije itd.).
  • Formulirajte svoje misli jasno i kompetentno.
  • Svako pitanje mora biti poslano u zasebnom pismu. Ako primite pismo koje sadrži nekoliko nepovezanih pitanja, odgovorit će se samo na prvo pitanje.

Oblik i uvjeti korištenja odgovora

  • Odgovori se daju samo na pitanja koja se odnose na gospodarsku djelatnost pravne osobe ili samostalnog poduzetnika koji ih postavlja.
  • Odgovor na svako pitanje daje se u pisanom obliku i ne podrazumijeva detaljno revizorsko mišljenje.
  • Svaki odgovor na pitanje rezultat je intelektualne aktivnosti zaposlenika 1C. Pravo na odgovor zaštićeno je građanskim pravom. Ekskluzivno pravo na svaki odgovor pripada 1C LLC. Organizacija ili samostalni poduzetnik ima pravo koristiti dobiveni odgovor za rješavanje situacija nastalih u obavljanju svoje djelatnosti. Korisnik koji je postavio pitanje nema pravo dati odgovor dobiven od 1C (ili bilo koji njegov dio) trećim stranama ili ga koristiti u svojim aktivnostima na bilo koji drugi način, osim za rješavanje svojih spornih pitanja. Tvrtka 1C zadržava pravo prestanka savjetovanja s organizacijom (ili pojedinačnim poduzetnikom) koja je prekršila ove uvjete.
  • Odgovori odražavaju mišljenje stručnjaka 1C i savjetodavne su prirode. Odluku o njihovoj uporabi u praksi korisnik donosi samostalno.
  • Tvrtka 1C zadržava pravo korištenja pitanja i odgovora u savjetodavnim materijalima bez pristanka osobe koja postavlja pitanje.
  • Informacije o postavljenim pitanjima (količina i sadržaj) mogu se prenijeti partnerskoj organizaciji tvrtke 1C, s kojom osoba koja postavlja pitanje ima ugovor o podršci.

U članku će se raspravljati o glavnim razlozima napuštanja modaliteta u platformi 1C:Enterprise i glavnim metodama za pretvaranje dijelova koda u novi asinkroni model.

Primjenjivost

U članku se govori o asinkronom modelu za izgradnju poslovne logike, dodanoj platformi “1C:Enterprise” izdanje 8.3. Prikazane informacije relevantne su za trenutna izdanja platforme.

Odbijanje korištenja modalnih prozora u platformi 1C:Enterprise 8.3

Prilikom razvoja konfiguracije na platformi 1C:Enterprise 8 povremeno se javlja potreba za pauziranjem programa dok korisnik ne donese odluku ili ne izvrši neku radnju.

Na primjer, kada se klikne na gumb za popunjavanje tabličnog odjeljka, korisnik bi trebao biti upitan treba li obrisati tablični dio kako se prethodno uneseni podaci ne bi izgubili.

Ovo se ponašanje može postići, na primjer, pomoću sljedećeg koda:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Odgovor = Pitanje (“Dio tablice bit će izbrisan. Nastaviti?”, Način dijalogaPitanje.DaNe);
Ako je odgovor = Povratni kod dijaloga. Da Zatim
//algoritam punjenja
Završi ako ;
Kraj postupka

Kao rezultat ovog fragmenta koda, izvršenje programskog koda bit će obustavljeno, pitanje će se prikazati na ekranu, sučelje aplikacije osim dijaloga s pitanjem postat će nedostupno, sustav čeka da korisnik napravi odluku, a izvršavanje koda nastavit će se tek nakon odgovora na pitanje.

Otvaranje modalnih prozora pozivom metode OpenModal() također uzrokuje pauze u izvršavanju koda i blokiranje sučelja.

Kada radite s konfiguracijom u načinu web klijenta putem preglednika, u ovom slučaju otvorit će se novi prozor - skočni prozor koji će blokirati ne samo trenutnu karticu, već i cijelo sučelje preglednika, uključujući druge otvorene prozore i kartice.

Skočni prozori na internetu često se koriste za zlonamjernu distribuciju neželjenih reklama, zbog čega preglednici sadrže značajke blokiranja skočnih prozora.

U ovom slučaju, da biste radili s konfiguracijama 1C:Enterprise 8 putem preglednika, morate onemogućiti blokiranje skočnih prozora.

Problemi nastaju i pri radu na mobilnim uređajima. Na primjer, modalni prozori nisu podržani na iPadu.

Da biste riješili ove probleme, trebali biste koristiti blokirajuće prozore umjesto modalnih. Za korisnika, vizualno sve izgleda isto: prozor blokira sučelje web klijenta.

Međutim, prozor za blokiranje je "nacrtan" na vrhu glavnog prozora, a blokirana je samo trenutna kartica preglednika u kojoj je konfiguracija otvorena, što vam omogućuje prebacivanje na druge kartice, jer se modalni prozori preglednika ne koriste.

Tako se skočni prozori ne otvaraju u pregledniku i osiguran je rad putem web klijenta na mobilnim uređajima.

Korijenski element konfiguracije ima svojstvo "Modality mode", koje određuje mogu li se modalni prozori otvoriti u konfiguraciji.

Ako je odabrana opcija "Koristi", tada se mogu otvoriti modalni prozori. Ako je odabrana opcija "Ne koristi", tada modalni prozori nisu dopušteni. Kada pokušate pozvati metodu koja otvara modalni prozor, sustav prikazuje poruku o pogrešci:

S ovom vrijednošću svojstva "Modality usage mode" dopušteno je samo blokiranje prozora.

Ako je odabrana opcija "Koristi s upozorenjima", kada se otvore modalni prozori, u prozoru s porukom prikazuje se sljedeći tekst:

Ova radna opcija može se koristiti kao posredna prilikom prerade konfiguracije kako bi se napustila uporaba modalnih prozora.

Glavna razlika između prozora za blokiranje i modalnih prozora je u tome što otvaranje prozora za blokiranje ne pauzira izvršavanje koda.

Stoga će programeri morati ponovno napisati programski kod koji koristi modalne prozore kako bi uzeli u obzir ovu značajku.

Kod je potrebno podijeliti u dva dijela:

  • otvaranje prozora za blokiranje;
  • obrada odabira korisnika.

Fragment koda dat na početku članka potrebno je prepisati na sljedeći način:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Upozorenje = Novo Opis upozorenja(, OvajObjekt );

Način dijalogaPitanje.DaNe);
Kraj postupka
&NaKlijentu
Postupak (rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
//algoritam punjenja
Završi ako ;
Kraj postupka

Nakon izvršenja procedure ShowQuestion(), sustav se ne zaustavlja, čeka se odgovor korisnika, izvršavanje koda se nastavlja.

Korisnik će se moći odlučiti tek nakon što završi cijeli postupak. U ovom slučaju, bit će pozvana procedura izvoza FillItemsQuestionComplete(). Proslijedili smo njegovo ime konstruktoru objekta DescriptionAlerts.

Procedura koja će biti pozvana nakon odabira može se nalaziti u modulu obrasca, naredbenom modulu ili općem neglobalnom modulu.

U razmatranom primjeru, pozvana procedura nalazi se u modulu upravljanog obrasca, pa smo proslijedili parametar ThisObject.

Razmotrimo pozivanje procedure koja se nalazi u općem modulu. Da biste to učinili, dodajte novi zajednički modul Obrada obavijesti, postavite oznaku "Klijent (upravljana aplikacija)" za njega i nemojte postavljati oznaku "Globalno". Smjestimo proceduru Fill in Products Question Completion () u ovaj modul.

Tada će obrađivač naredbe fill izgledati ovako:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Upozorenje = Novo Opis upozorenja("Ispunite pitanje o proizvodima",
Obrada upozorenja);
Question Text = “Tabelarni dio će biti izbrisan. Nastaviti?" ;
ShowQuestion (Upozorenje, Tekst pitanja, Način dijalogaPitanje.DaNe);
Kraj postupka

Nakon poziva bilo koje metode koja otvara prozor za blokiranje, procedura mora izaći, a kod koji se sljedeći pokreće treba smjestiti u proceduru koja će biti pozvana nakon što se prozor zatvori.

Za prijenos konteksta (pomoćnih podataka, određenih parametara, vrijednosti varijable) iz procedure koja otvara modalni prozor u proceduru koja se poziva kada se zatvori, predviđen je treći izborni parametar konstruktora objekta: DescriptionAlerts – Dodatni parametri.

Ovaj objekt (bilo koje vrste) bit će proslijeđen proceduri opisanoj u Opisu upozorenja kao posljednji parametar.

Koristeći primjer odjeljka koda koji je gore razmotren, to se može učiniti ovako:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Parametar1 = 0;
Parametar2 = 0;
Popis parametara= Nova struktura (“Parametar1, Parametar2″, Parametar1, Parametar2);
Upozorenje = Novo Opis upozorenja("Ispunite pitanje o proizvodima", ovaj objekt ,
Popis parametara);
ShowQuestion (Upozorenje, "Dio tablice bit će izbrisan. Nastaviti?",
Način dijalogaPitanje.DaNe);
Kraj postupka
&NaKlijentu
Postupak IspuniteProductsQuestionCompletion(Rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
//analiziraj dodatne parametre.Parametar1
//analiziraj dodatne parametre.Parametar2
Završi ako ;
Kraj postupka

Ako trebate proslijediti samo jednu vrijednost, tada ne možete koristiti strukturu, već dodijeliti ovu vrijednost parametru Dodatni parametri konstruktora objekta DescriptionAlerts.

Pogledajmo nekoliko primjera rada s blokiranjem prozora.

Zadatak 1: Otvorite drugi obrazac

Iz obrasca dokumenta klikom na gumb “Otvori parametre” potrebno je otvoriti obrazac na kojem se nalaze dva checkboxa Parametar1 i Parametar2 koje korisnik mora postaviti. Nakon zatvaranja obrasca, prikazati vrijednosti parametara u retku poruke.

Kreiramo opći obrazac “ParameterForm”, na koji postavljamo detalje Parameter1 i Parameter2, kao i naredbu CloseForm:

Rukovatelj naredbom izgleda ovako:

Rukovatelj naredbom izgleda ovako: &OnClient
Procedura CloseForm (naredba)
Popis parametara= Nova struktura ( “Parametar1, Parametar2”, Parametar1, Parametar2);
Zatvoriti ( Popis parametara); Kraj postupka

Za obrazac postavite svojstvo WindowOpenMode na "Blokiraj cijelo sučelje":

Na formu dokumenta postavljamo naredbu OpenParameters čiji je rukovatelj opisan na sljedeći način:

&NaKlijentu
Postupak OpenOptions(Tim )
Upozorenje = Novo Opis upozorenja("Otvori opcije Završi", OvajObjekt );
OpenForm ( “Opći obrazac.Parametri obrasca”, , , , , , Obavijest);
Kraj postupka
&NaKlijentu
Postupak OpenOptionsComplete(Rezultat, Dodatne mogućnosti) Izvoz
Ako je TypeValue (Rezultat) = Type (“Structure”) Onda
Za svaki KeyValue iz petlje rezultata
Poruka = ​​Novo Poruka korisniku;
Message.Text = “Ključ: “” ” + KeyValue.Key + “””, vrijednost = ”
+ KeyValue.Value;
Poruka.Izvješće();
Kraj ciklusa ;
Završi ako ;
Kraj postupka

U korisničkom načinu rada, izvođenjem konfiguracije pod web klijentom, dobivamo sljedeće rezultate:

Kliknite na sliku za povećanje.

Način otvaranja prozora također se može odrediti u zadnjem parametru procedure OpenForm.

&NaKlijentu
Postupak OpenOptions(Tim )
Upozorenje = Novo Opis upozorenja("Otvori opcije Završi", OvajObjekt );
OpenForm ( “Opći obrazac.Parametri obrasca”, , , , , , Upozorenje
FormWindowOpenMode.LockEntireInterface
);
Kraj postupka

Zadatak 2. Pitanje pri zatvaranju forme

Prilikom zatvaranja prozora obrade pitajte korisnika želi li doista zatvoriti prozor.

Ovaj problem se može riješiti korištenjem sljedećeg koda koji se nalazi u modulu obrasca obrade:

&NaKlijentu
Perem Potrebno je zatvoriti obrazac;
&NaKlijentu
Postupak prije zatvaranja (neuspjeh, Standardna obrada)
Ako ne Potrebno je zatvoriti obrazac= Istina Onda
Neuspjeh = Istina ;
Upozorenje = Novo Opis upozorenja(“Prije završetka zatvaranja”, OvajObjekt );
ShowQuestion (Upozorenje, "Jeste li sigurni da želite zatvoriti prozor?",
Način dijalogaPitanje.DaNe
);
Završi ako ;
Kraj postupka
&NaKlijentu
Postupak Prije završetka zatvaranja(Rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
Potrebno je zatvoriti obrazac= Istina ;
Zatvoriti();
Inače
Potrebno je zatvoriti obrazac= Nedefinirano;
Završi ako ;
Kraj postupka

U proceduri obrasca Prije zatvaranja, korisniku se postavlja pitanje, zastavica odbijanja postavlja se na True i zatvaranje obrasca se poništava.

Nakon potvrdnog odgovora na pitanje, varijabla Need toCloseForm postavlja se na True i forma se ponovno zatvara.

Zadatak 3: Unos numeričke vrijednosti

Klikom na gumb na obrascu za obradu otvara se standardni dijalog za unos broja.

Da biste to učinili, trebate koristiti metodu ShowNumberInput() umjesto EnterNumber(), koja otvara blokirajući prozor umjesto modalnog.

&NaKlijentu
Postupak Unos brojeva (naredba)
Upozorenje = Novo Opis upozorenja(“EnterNumberComplete”, OvajObjekt );
ShowEnterNumbers(Upozorenje, 0, “Unesite količinu”, 15, 3);
Kraj postupka
&NaKlijentu
Postupak Dovršavanje unosa brojeva(Rezultat, Dodatne mogućnosti) Izvoz

Poruka = ​​Novo Poruka korisniku;
Message.Text = “Unijeli ste količinu” + Rezultat;
Poruka.Izvješće();
Završi ako ;
Kraj postupka

Nakon zatvaranja prozora za unos broja poziva se procedura čiji će prvi parametar biti uneseni broj ili Nedefinirana vrijednost ako je korisnik odbio unos.

Zadatak 4. Odabir boje

Kada kliknete na gumb na obrascu za obradu, koristeći standardni dijalog za odabir boje, korisnik određuje željenu boju. Postavite ovu boju za pozadinu kliknutog gumba.

Dodajte naredbu SelectColor u obrazac sa sljedećim rukovateljem:

&NaKlijentu
Odabir boje postupka (naredba)
Dijaloški okvir za odabir boje= Novo Dijaloški okvir za odabir boje;
Upozorenje = Novo Opis upozorenja(“Odabir boje završen”, OvajObjekt );
Dijaloški okvir za odabir boje. Prikaži (upozorenje);
Kraj postupka
&NaKlijentu
Postupak ChoiceColorsCompletion(Rezultat, Dodatne mogućnosti) Izvoz
Ako NIJE Rezultat = Nedefinirano Onda
Elementi. Odabir boja. Boja pozadine= Rezultat;
Završi ako ;
Kraj postupka

Za objekte dijaloškog okvira za odabir boje (kao i dijaloški okvir za uređivanje standardnog razdoblja, konstruktor retka formata, dijaloški okvir redovnog rasporeda zadataka, dijaloški okvir za odabir fonta), metoda Show() otvara prozor za blokiranje.

Nakon zatvaranja prozora poziva se procedura čijem prvom parametru se prosljeđuje odabrana vrijednost (boja, font itd.) ili vrijednost Nedefinirano ako je korisnik odbio izbor.

Treba napomenuti da objekt FileSelectionDialog nema Show() metodu, za razliku od dijaloga za odabir boje ili fonta, jer je implementacija ovih dijaloga značajno drugačija.

Da biste koristili dijaloški okvir za odabir datoteke na web klijentu, prvo morate omogućiti ekstenziju datoteke.

Dijalozi implementirani putem ekstenzije datoteke ne stvaraju iste operativne probleme kao modalni prozori preglednika, tako da otvaranje prozora za blokiranje za objekt FileSelectionDialog nije implementirano.

Zaključno, napominjemo da je počevši od izdanja 8.3.10 podrška za modalne prozore ukinuta u web klijentu. U ovom slučaju, ako se u konfiguraciji pozove modalna metoda, generira se iznimka. Također, podrška za način sučelja je ukinuta u web klijentu U odvojenim prozorima. Osim toga, ni u tankom ni u web klijentu više nije moguće otvoriti obrazac u zasebnom prozoru (kada se radi u načinu sučelja Bookmarks). Takvi drastični koraci omogućili su napuštanje načina sučelja, koje više ne podržavaju svi moderni preglednici.

Kakav se praktični zaključak može izvući iz ovih informacija? A zaključak je vrlo jednostavan - ako iz nekog razloga još uvijek postoje modalni pozivi u vašoj konfiguraciji, tada će se na tim mjestima u web klijentu prikazati prozor s porukom o pogrešci. Želio bih upozoriti da ne pokušavate "guglati" nekim brzim rješenjem za ovaj problem, jer... Većina savjeta svodi se na ovaj recept: u konfiguratoru na razini konfiguracije postavite svojstvo “Modality usage mode” na “Use”. Naravno, u ovom trenutku to neće funkcionirati samo zato što sami moderni preglednici više ne podržavaju modalne pozive.

I imate samo dva načina da riješite gore opisani problem:

  1. Ažurirajte platformu za izdanje 8.3.10+ (8.3.11), postavite svojstvo konfiguracije "Compatibility Mode" na "Do not use" i prepišite fragmente koda koji koriste modalne metode u model asinkrone poslovne logike
  2. Preporučite svojim klijentima da koriste starije preglednike koji još podržavaju modalne pozive (Mozilla Firefox verzije 37 i niže, Chrome verzije ispod 37 itd.).

Usput, počevši od izdanja 8.3.11, web preglednici Microsoft Internet Explorer verzije 8 i 9 više nisu podržani.

Bavili smo se web preglednicima u svjetlu modaliteta, sada je vrijeme da razjasnimo situaciju s drugim klijentima.

Počevši od verzije 8.3.5, svojstvo Modality Usage Mode u tankim i debelim klijentima poštuje se samo ako je navedena opcija naredbenog retka /EnableCheckModal. Ovaj parametar se automatski ubacuje u naredbeni redak samo kada se aplikacija pokrene iz konfiguratora. Ako ovaj parametar nije naveden, tada se ne generiraju iznimke i odgovarajuća upozorenja se ne prikazuju. Oni. u praksi, pri korištenju debelog i tankog klijenta, ne uočava se temeljna promjena u radu pri korištenju modalnog načina rada - modalni pozivi radit će isto kao što su radili prije, bez ikakvih upozorenja, kao u web klijentu.

Da stavimo točku na i, imajte na umu da počevši od verzije 8.3.9, debeli klijent zanemaruje svojstvo konfiguracije “Način korištenja sinkronih poziva proširenjima platforme i vanjskim komponentama”, dok odgovarajuće sinkrone metode rade bez generiranja iznimaka i prikazivanja upozorenja. Navedeno ignorirano svojstvo dodano je u verziji 8.3.5 za podršku asinkronog rada s vanjskim komponentama, kriptografijom i ekstenzijama za rad s datotekama u web pregledniku Google Chrome. Jasno je da to nema nikakve veze s debelim klijentom, pa je stoga "tiho" ignoriranje ovog svojstva jednostavno eliminiralo nepotrebne provjere za korištenje sinkronih metoda prilikom korištenja konfiguracije.

Usput! Zbog činjenice da platforma samouvjereno korača prema webu, s verzijom 8.3.8 programeri su uveli određena ograničenja na programski kod koji je povezan s logikom zatvaranja obrasca ili aplikacije, koja se izvršava u debelim i tankim klijentima. Obavezno pročitajte naš članak koji detaljno pokriva ovu nijansu. Osim toga, u tečaju "Profesionalni razvoj sučelja i obrazaca u 1C: Enterprise 8.3" postoji poglavlje posvećeno napuštanju modaliteta, a možete prikupiti mnogo korisnih i relevantnih informacija o ovoj temi.

Kolege, postoje dvije stvari koje možete beskonačno čitati: VKontakte feed i popis promjena u sljedećem izdanju platforme, pa sumiramo konačne rezultate;)

U procesu razmatranja primjera koji vam omogućuju prijelaz s elemenata sinkronog modela na asinkroni, vjerojatno ste već primijetili da u općem slučaju postoji više programskog koda. Što je više koda, to se više povećava složenost njegovog daljnjeg održavanja i otklanjanja pogrešaka.

Osim toga, količina koda će se još više povećati ako koristimo više dijaloga tijekom procesa razvoja. Stoga se u procesu razvoja aplikativnih rješenja usmjerenih na rad u web klijentu treba prisjetiti paradigme rada koja se trenutno koristi u modernim web aplikacijama. Stoga, ako vaša konfiguracija ima mnogo interaktivnih dijaloga s korisnikom i upozorenja, onda ima smisla ponovno razmotriti ovu funkcionalnost u korist nekih drugih pristupa organizaciji interakcije korisnika.

Umjesto zaključka

Naš ciklus “Prvi koraci u razvoju 1C” je došao kraju. Ako ga pročitate u cijelosti, onda ste najvjerojatnije već primijetili kako se platforma u posljednje vrijeme razvija velikom brzinom. Materijal u ovoj seriji napisan je relativno nedavno, ali bili smo prisiljeni ozbiljno ga ažurirati, jer... Čak iu tako kratkom vremenu pojavilo se puno novih važnih funkcionalnosti i promjena. Takve velike promjene mogu biti pomalo zbunjujuće za 1C programera ako sve ovo vrijeme nije rastao i profesionalno se razvijao s platformom.

Na specijaliziranim internetskim resursima često možete pročitati zahtjeve programera početnika i njihovih zrelijih kolega da preporuče materijale koji bi im pomogli da razumiju opsežne i ponekad naizgled beskrajne mogućnosti platforme 1C. Već tradicionalno preporučujemo da obratite pažnju na naše tečajeve programiranja