1c a gestionat formulare pentru a adresa o întrebare utilizatorului. Cum să utilizați showquestion în gestionarea formularelor înainte de postare

Introducere

De ce merită să renunți la modalitate și, de exemplu, să înlocuiești Question cu ShowQuestion? Chestia este că acum mai bine de un an poreclele 1C au declarat „război” pe ferestrele modale. Singurele excepții sunt cei care au o configurație autoscrisă, care nu va funcționa pe un iPad, în modul service sau folosind un client web. Și dacă aveți obișnuit Contabilitate 3.0 și nu veți oferi unui contabil acces la baza de date prin intermediul unui iPad, va trebui totuși să înlocuiți toate metodele modale cu unele non-modale, deoarece mai devreme sau mai târziu, „Modul de utilizare a modalității” va deveni „Nu folosiți”!

Ce părere au specialiștii 1C despre această problemă propusă? Pentru a începe, puteți consulta subiectul „Întrebare în handlerul de formulare BeforeClose”:

Particularitatea dialogului cu utilizatorul în acest (și în mulți alți) handler este că, în funcție de reacția utilizatorului, se ia o decizie: continuarea acțiunilor ulterioare sau abandonarea acestora. Pentru a face acest lucru, utilizați parametrul Procedura de respingere. Cu un răspuns din partea utilizatorului, refuzăm să continuăm (Reject = True). Dacă utilizatorul răspunde diferit, continuăm acțiunile suplimentare.

În acest caz, dificultatea constă în faptul că vom afla răspunsul utilizatorului după ce părăsim contextul acestui handler. În procedura care prelucrează alerta. Și parametrul Respingere trebuie setat în acest handler special.

Prin urmare, acționăm în doi pași:

Pentru prima dată, anulăm necondiționat alte acțiuni (Reject = True) și afișăm întrebarea utilizatorului;

În handlerul de notificare, în funcție de reacția utilizatorului, fie închidem din nou formularul în mod programatic, fie nu facem nimic.

Problema este că handlerul BeforeClose va fi executat de două ori. Și pentru a distinge prima execuție de a doua (când răspunsul utilizatorului este deja cunoscut), folosim variabila client In ProgressClose ca flag.

La prima trecere, valoarea sa este False, ceea ce înseamnă că trebuie să renunți la închidere și să pui o întrebare. În a doua trecere, valoarea sa este True, ceea ce înseamnă că întrebarea nu trebuie pusă:

&OnClient Variation In ProgressClosing; &OnClient Procedure BeforeClose(Eșec, StandardProcessing) Dacă închiderea nu este efectuată, atunci eșec=True; ShowQuestion(New AlertDescription("BeforeClosingCompletion", ThisObject), "Ar trebui să închid formularul?", DialogModeQuestion.YesNo); endIf; Sfârșitul procedurii și la procedura clientului înainte de finalizarea închiderii (rezultatul întrebării, parametrii de înregistrare) Export dacă rezultatul întrebării = cod de returnare dialog Da, apoi executați închiderea = adevărat; Închide(); endIf; Sfârșitul procedurii

Acest exemplu este similar cu subiectul nostru și este adesea menționat în subiectul „Afișați întrebarea în manipulatorul de formulare înainte de postare”:

De asemenea, poate fi necesar să puneți o întrebare în handlerul de evenimente al formularului BeforeRecord. Ca și în exemplul anterior. Cu toate acestea, problema de aici nu este atât de ușor de rezolvat. Diferența este aceasta.

În exemplul anterior, odată ce am fost în handler-ul BeforeClose, știam clar acțiunea care trebuia efectuată. Aceasta înseamnă închiderea formularului. Prin urmare, atunci când procesăm alerta, am scris cu îndrăzneală Close().

Dar în handlerul BeforeRecord nu avem informații atât de clare. Putem ajunge în acest handler din două motive: dacă utilizatorul a făcut clic pe Înregistrare sau dacă a făcut clic pe Înregistrare și închidere. Adică, scenariul ulterior al acțiunilor ne este necunoscut. Nu putem să-l definim folosind metode standard în timpul acestui handler.

Prin urmare, aici putem oferi trei variante, dar, din păcate, toate au dezavantaje:

* Schimbați logica soluției aplicației astfel încât să nu existe dialog cu utilizatorul în acest handler. Acest lucru nu este întotdeauna posibil;

* Când procesați o alertă folosind propriul formular de blocare, adresați utilizatorului o întrebare detaliată care oferă o descriere precisă a acțiunilor ulterioare: Refuzați?, Înregistrați numai?, Înregistrați și închideți? Acest lucru poate să nu arate foarte frumos, deoarece utilizatorul a făcut deja clic pe „Salvați și închideți” și este întrebat din nou despre asta;

* Nu utilizați comenzile standard ale formularului Scriere, „Salvare și închidere”. În schimb, creați propriile comenzi în care să executați algoritmii necesari. Crearea propriilor echipe va necesita costuri suplimentare cu forța de muncă.

Sarcina este complexă, așa că dezvoltatorii, atunci când pun o întrebare înainte de înregistrare, recomandă în primul rând renunțarea la această idee...

Apoi îți cer să pui o întrebare cu multe opțiuni: „Refuză, înregistrează doar, înregistrează și închide”. Pe lângă dezavantajul descris (utilizatorul selectează deja o opțiune în prealabil și apoi este întrebat din nou), mai există și un lucru: programul poate fi accesat și din Înainte de înregistrare din „Anulare”. Acestea. Trebuie să mai adaug un buton? Cred că această opțiune este urâtă.

Rămâne doar a treia opțiune folosind comenzi de formular non-standard. O vom implementa. Și singura comandă non-standard pe care o vom avea este „Postează și închide”. La fel ca în exemplul de la subiectul „Întrebare în manipulatorul de formulare BeforeClose”, va trebui să dăm Refuz = Adevărat la primul apel și doar la al doilea apel să facem înregistrarea efectivă. Și undeva va trebui să ne amintim că aceasta este a doua intrare în procedura „Înainte de înregistrare”. 1C a sugerat să faceți acest lucru printr-o variabilă client comună; în exemplul luat în considerare, acest lucru se poate face prin parametrii de înregistrare.

Exemplu de utilizare ShowQuestion în handlerul de formular BeforeRecord

1. Mai întâi, trebuie să eliminăm comanda standard „Swipe and close” din formular și să creăm propria noastră comandă și buton.

1.A. Dacă aveți deja un buton nestandard „Glisați și închideți”, aveți noroc, puteți trece în siguranță la pasul 2.

1.B. Comanda standard este eliminată prin Proprietăți formular - Compoziție comandă - Eliminați comanda inutilă. Nu voi descrie cum să adăugați o comandă și un buton în formular, vă voi aminti doar că butonul „Trimiteți și închideți” trebuie făcut ca butonul implicit.

1.V. Acum opțiunea este mai dificil de implementat, dar mai ușor de întreținut cu o configurație standard. În aproape fiecare actualizare de Contabilitate, programatorii reușesc să modifice 10-50% din formularele documentelor, astfel încât într-o configurație tipică pentru întreținere este mai ușor să eliminați butonul standard cu cod și să adăugați propria comandă și buton.

Pentru început, în gestionarea formularului „La deschidere”, trebuie să eliminați butonul standard „Continuare și închidere”.

Elements.FormSwipeIClose.Visibility = False;

Notă: pentru un utilizator cu restricții mari asupra unui document în platforma 8.3.7, butonul „Postează și închide” nu apare deloc. Prin urmare, pentru platforma 8.3.7 este mai corect să scrieți codul:

Dacă Elements.Find ("FormProductIClose")<>Nedefinit Apoi Elements.FormSwipeIClose.Visibility = False; endIf;

NewCommand1 = ThisForm.Commands.Add("SwipeANDClose2"); NewCommand1.Action = "SwipeIClose"; NewElement = Elements.Add("FormAddAndClose2" , Type("FormButton"), Elements.FormCommandBar); NewElement.Title = „Glisează și închide”; NewElement.CommandName = NewCommand1.Name; NewElement.DefaultButton = Adevărat; Elements.Move(NewElement, NewElement.Parent, Elements.CommandBarButtonGroup);

În consecință, acest cod conține nume tipice pentru Formularul de document general al documentului „Chitanță (acte, facturi)” (de exemplu, Elements.GroupButtons din CommandBar), care, în fiecare caz specific, va trebui schimbat în al dvs.

&OnClient Procedura RunIClose(Comandă) Parametrii de înregistrare = New Structure(); Parametri de înregistrare.Insert(„Modul de înregistrare”, Valoare Predefinită(„Modul de înregistrare document.Post”)); Record Parameters.Insert("Închidere", True); If Write(Record Parameters) Then Close(); endIf; Sfârșitul procedurii

După cum am scris mai sus, vom face schimb de informații între procedurile noastre prin intermediul parametrilor de înregistrare. În Înainte de înregistrare, nu știm dacă am făcut clic pe „Înregistrare”, „Postează” sau „Postează și închide”, pentru aceasta trecem parametrul Închidere în parametri. Dacă există acest parametru în parametrii de intrare, atunci trebuie să închideți formularul după o intrare cu succes.

3. Să presupunem că nu trebuie întotdeauna să punem întrebarea, ci doar atunci când documentul a fost procesat. Acum adăugăm (dacă această procedură nu a existat, creați) un nou cod la procedura „BeforeRecording”:

If Not RecordParameters.Property("QuestionAsked") AND Object.Passed Then Failure = True; Alertă = New AlertDescription("ShowQuestionComplete", ThisForm, PostOptions); Textul întrebării = "Acest document a fost deja postat. Chiar doriți să repostați sau să anulați postarea documentului?"; ShowQuestion(Alert, QuestionText, DialogModeQuestion.YesNo, 20,DialogReturnCode.Nu, DialogReturnCode.Nu); endIf;

Vom completa proprietatea „Întrebare solicitată” din notificare pentru a afla când am intrat pentru a doua oară în procedura „Înainte de Înregistrare” (în exemplul 1C din procedura Înainte de Închidere acest lucru s-a făcut prin variabila „Închidere în curs”). Cu alte cuvinte: în structura „Opțiuni de înregistrare” există o proprietate „Întrebare adresată”, ceea ce înseamnă că întrebarea a fost deja pusă, iar utilizatorul a răspuns deja afirmativ, dar dacă nu există nicio proprietate, atunci aceasta este prima dată în procedura „Înainte de înregistrare”.

După metoda ShowQuestion, puteți scrie și „Return” dacă aveți alt cod în procedura „BeforeWrite” care este executată după întrebare.

4. Creați o procedură „Show QuestionComplete”, pe care programul o va introduce atunci când utilizatorul răspunde la întrebare (sau are loc un timeout).

&În procedura client ShowQuestionCompletion(Result, Record Parameters) Export If Result = DialogReturnCode.Yes Then Record Parameters.Insert("QuestionAsked", True); Dacă Write(RecordParameters) ANDRecordParameters.Property("Close") Then Close(); endIf; endIf; Sfârșitul procedurii

În această procedură folosim proprietatea „Închidere” trecută mai devreme. Dacă nu există nicio proprietate, atunci nu este nevoie să o închideți.

5. Acum trebuie să procesăm utilizatorul apăsând „cruce”. Pentru a face acest lucru, avem nevoie de un handler de formular „BeforeClose”. Dacă nu există, atunci poate fi creat pe formular manual sau programatic în handlerul „When CreatedOnServer”:

ThisForm.SetAction("BeforeClose","BeforeClose");

&OnClient Procedure BeforeClose(Eșec, Procesare standard) Dacă este modificat, atunci Eroare = Adevărat; QuestionText = НStr("ru = "Datele au fost modificate. Doriți să salvați modificările?"); Alertă = New AlertDescription ("Întrebare Înainte de Închidere Finalizare", ThisObject); ShowQuestion(Alert, QuestionText, DialogModeQuestion.YesNoCancel); endIf; Sfârșitul procedurii &La întrebarea privind procedura clientBeforeClosingCompletion(Rezultat, parametri suplimentari) Exportă dacă rezultat = DialogReturnCode.Yes ThenRecordParameters = New Structure(); Record Parameters.Insert("Închidere", True); If Write(Record Parameters) Then Close(); endIf; ElseIf Result = DialogReturnCode.No Then Modification = False; Închide(); endIf; Sfârșitul procedurii

Se pare că atunci când utilizatorul face clic pe cruce, va răspunde mai întâi la întrebarea „Salvați modificările?” și apoi se va pune o altă întrebare, pe care ați scris-o „Înainte de înregistrare”. Dacă nu sunteți mulțumit de acest lucru, puteți trece parametrul „QuestionAsked” la „QuestionBeforeCloseCompletion” și apoi nu va mai exista o a doua întrebare.

Întrebare vs ShowQuestion

Cum am rezolva problema dacă am putea folosi apeluri modale? Și foarte simplu, am scrie următorul cod în procedura „BeforeWrite”:

If Object.Posted Then Question Text = "Acest document a fost deja postat. Chiar doriți să repostați sau să anulați postarea documentului?"; Răspuns = Întrebare(Text Întrebare,ModDialogÎntrebare.DaNu,20,CodReturDialog.Nu,CodReturDialog.Nu); Dacă nu Răspuns = Dialog Return Code. Da, atunci Refuz = Adevărat; Întoarcere; endIf; endIf;

Asta e tot! Fără „probleme” precum „Pe ce a făcut clic utilizatorul: glisați sau glisați și închideți?” Și va trebui, de asemenea, să exersați apăsarea crucii în „Înainte de închidere”.

Inițial, am implementat cod similar în Enterprise Accounting 3.0. Sarcina a fost după cum urmează: într-un anumit set de condiții (aceasta nu este doar o condiție Object.Performed, așa cum este indicat în exemplul din această publicație) din Formularul Document Document general Recepție Bunuri și Servicii, solicită confirmarea suplimentară a acțiunilor sale. Mai jos sunt enumerate nuanțele pe care nu a trebuit să le ocol, pentru că... nu erau la înălțime.

Programul nu intră în procesorul de formulare „Înainte de intrare” dacă: 1) utilizatorul a făcut clic pe butonul „Marcare pentru ștergere / demarcare”; 2) dacă utilizatorul a apăsat butonul „DT/CT” pe un document neverificat. Și asta nu este tot: dacă ați creat totul pe formularul de document așa cum am scris, iar utilizatorul reintroduce documentul din formularul de listă, atunci programul nu îi va pune întrebări. Trebuie să înlocuiți toate butoanele care vă interesează din formularul de listă cu propriile dvs. și să urmăriți acțiunile utilizatorului. Un document poate avea, de asemenea, mai multe forme de document, dar mai multe (de exemplu, documentul Recepție de bunuri și servicii în BP 3.0, unde există 3 forme: general, bunuri și servicii). În fiecare formular de document trebuie să scrieți mult cod...

Datorită o grămadă de nuanțe, primul sfat de la 1C rămâne relevant (care la început, fără a aprofunda sarcina în detaliu, te poate face să zâmbești): „Schimbă logica soluției aplicației astfel încât să nu existe dialog cu utilizatorul în acest handler.”

Să definim ce este dialogul? Apelarea unei comenzi A raporta este un dialog? Și echipa sună Introdu numarul! O provocare OpenValue?

Deci, dialogul este în primul rând un element al interfata grafica. fereastră. Și deci provocarea A raporta nu este un dialog, deoarece nu are propria sa fereastră separată.

Dialogul nu este doar o fereastră. Aceasta este o fereastră care se deschide utilizatorului pentru a afișa informații și (sau) a primi un răspuns.

Exemple de dialoguri:

1 C: Enterprise X

Departamentul de Informatică Aplicată

iignichchіїїїїїїїїзініїїїїїїїїїїїїїїїї

Pentru a afișa un dialog, trebuie să apelați comanda corespunzătoare acestui dialog și să îi transmiteți parametrii necesari. Această comandă este o procedură sau o funcție obișnuită, scrisă doar nu de noi, ci de programatorii 1C. Nu putem schimba aceste comenzi, le putem doar apela. Să ne uităm la unele dintre ele.

Avertizare

Un exemplu excelent de dialog este afișarea unui avertisment pentru utilizator:

Avertisment ("Atenție!");

Ce vedem? Apelarea unei comenzi Avertizare, căruia i se trece șirul „Atenție” ca parametru.

Când computerul ajunge la linia în care este apelată această comandă, utilizatorului va fi afișat un dialog de avertizare. Și până când utilizatorul închide acest dialog, computerul va aștepta pe aceeași linie. Doar după închiderea dialogului va continua execuția programului și va începe execuția liniei care urmează apelului dialogului.

De exemplu, să presupunem că avem acest cod:

Avertisment ("1");

Avertisment ("2");

Avertisment ("3");

Cum va fi implementat?

Mai întâi, computerul va ajunge la linia nr. 1 și va executa comanda Avertizare cu parametrul „1”. În acest moment, utilizatorul va vedea o casetă de dialog cu textul „1”, iar computerul se va bloca pe această linie și va aștepta ca utilizatorul să închidă dialogul.

După închiderea dialogului, computerul va trece la linia nr. 2 și va executa comanda Avertizare deja cu un alt parametru „2”. Utilizatorul va vedea din nou caseta de dialog, dar cu textul „2”, iar computerul se va bloca pe a doua linie și va aștepta ca utilizatorul să închidă dialogul.

Computerul va trece apoi la a treia linie. Ei bine, și așa mai departe.

Echipa Avertizare parametrul responsabil pentru textul afisat nu este singurul. Există două opțiuni suplimentare:

Avertizare(,, )

Pauză- înseamnă numărul de secunde după care dialogul se va închide singur dacă utilizatorul nu face acest lucru.

Titlu- înlocuiește titlul standard „1 C: Enterprise” cu linia utilizatorului.

De exemplu, acest cod:

Avertisment(„Atenție.”, 5, „Atenție!”);

va afișa un dialog cu textul „Atenție”. și titlul „Atenție!” și, de asemenea, se va închide în 5 secunde dacă utilizatorul nu face acest lucru mai devreme:

Atenţie!

Cu grija.

Dar dacă vrem să setăm doar textul și titlul ferestrei și nu setăm timeout-ul?

În primul rând, putem trece zero ca timeout:

Avertisment ("Atenție.", Oh, "Atenție!");

Și în al doilea rând, putem lăsa pur și simplu un spațiu gol în loc de parametru, iar sistemul însuși va înțelege că trebuie să lăsăm valoarea implicită:

Avertisment ("Atenție.", "Atenție!");

Pentru a afla despre toți parametrii posibili ai comenzilor 1C încorporate, utilizați asistentul de sintaxă așa cum este descris în una dintre unitățile anterioare.

Introducerea unui număr

Unele dialoguri nu numai că afișează anumite informații de la noi către utilizator, ci, dimpotrivă, returnează un rezultat al interacțiunii cu utilizatorul. Un exemplu de astfel de dialog este introducerea unui număr.

De exemplu, să scriem:

Introduceți Număr(Număr);

Introduceți numărul

De ce trecem un parametru la comandă? Număr? În primul rând, pentru a afișa valoarea inițială a intrării în dialog. Și, în al doilea rând, să returneze valoarea introdusă de utilizator acestei variabile.

Dar ce se întâmplă dacă utilizatorul a abandonat intrarea și a făcut clic pe butonul Anulare? Cum să afli despre asta? Se pare că funcția Introdu numarul nu numai că afișează dialogul de introducere a numărului, dar se întoarce și la noi Adevărat dacă utilizatorul a făcut clic pe butonul „OK” și Minciună, dacă a anulat introducerea făcând clic pe butonul „Anulare”.

Astfel, următorul cod ar fi mai corect:

Rezultat = EnterNumber(Number);

If Result = True Then OpenValue ("Ați introdus " + String(Number));

OpenValue("V-ați anulat intrarea");

endIf;

La o variabilă Rezultat(numele ar putea fi orice) returnează Adevărat sau Fals, în funcție de butonul apăsat de utilizator ("OK" sau "Anulează").

La o variabilă Număr returnează numărul introdus de utilizator.

Întrebare

Ultimul dialog pe care îl vom analiza este dialogul Întrebați utilizatorul.

Știm numele comenzii care provoacă acest dialog - Întrebare.

Acum să ne uităm în asistentul de sintaxă pentru a vedea ce parametri acceptă această comandă:

Întrebare(, >)

Textul întrebării- aceasta este întrebarea însăși sub formă de text pe care utilizatorul o va vedea.

Butoane- aceasta este una dintre valorile predefinite, care poate fi vizualizată și în asistentul de sintaxă. De exemplu, dacă treceți la acest parametru:

  • Modul dialogÎntrebare.DaNu - dialogul va avea doar două butoane Da și Nu.
  • Modul dialogÎntrebare.DaNuAnulare - trei butoane Da, Nu și Anulare.
  • Dialogue ModeQuestion.OkCancel - două butoane Ok și Cancel.
  • Și alte opțiuni de buton.

Pauză- Acest parametru ne este deja familiar.

ButtonDefault- acesta este butonul care va avea focus atunci când fereastra este afișată. Semnificațiile sale ar putea fi:

  • Cod de retur dialog.Nr
  • Cod de returnare dialog.Da
  • Dialog Return Code.Anulare
  • Și alte butoane.

Titlu- acest parametru ne este deja familiar.

Butonul Timeout- dacă setați valoarea acestui buton și parametrul Pauză, apoi va afișa numărul de secunde rămase până la închiderea casetei de dialog. Poate avea aceleași valori ca și parametrul ButtonDefault.

După cum puteți vedea, există mulți parametri. Dar nu trebuie să le folosești pe toate. După cum urmează de la asistentul de sintaxă, sunt necesare doar primele două:

Întrebare („Înțelegeți materialul?”,

Modul dialog Întrebare.Da Nu);

Am pus o întrebare. Ar fi bine să primim acum un răspuns dacă materialul este clar sau nu. Din același ajutor de sintaxă aflăm că butonul pe care a fost apăsat este returnat ca rezultat al apelului de comandă Întrebare.

Rezultat = Întrebare(„Înțelegeți materialul?”, DialogModeQuestion.YesNo);

If Result = DialogReturnCode.Yes Then OpenValue("Ce tip grozav esti!");

OpenValue(„Fă sarcinile din nou!”);

endIf;

Modalitate

Toate exemplele de dialog pe care le-am analizat sunt modale, deoarece computerul, când afișează dialogul, se blochează pe aceeași linie și nu merge mai departe până când dialogul se închide.

Un alt mod de a spune este că atunci când afișăm un dialog modal, utilizatorul poate interacționa doar cu acel dialog. Operarea cu restul sistemului este blocată până când dialogul este închis.

Versiunile non-modale ale dialogurilor nu au acest dezavantaj, dar este prea devreme să trecem la ele.

Pentru a exersa și consolida materialul acestei unități, se recomandă finalizarea următoarei sarcini.

Scrie un program careîntreabă utilizatorul „Apăsați Da pentru a afișa numerele de la 1 la 10, Nu pentru a afișa numerele de la 10 la 100, nu apăsați butonul Anulare în niciun caz”. Dialogul ar trebui să aibă trei butoane Da, Nu și Anulare.

Dacă utilizatorul a făcut clic pe Da, afișăm numere de la 1 la 10, Nu, de la 10 la 100, Anulare, afișăm un dialog de avertizare cu textul „V-am avertizat să nu apăsați Anulare!”

Soluţie

Rezultat = Întrebare(

„Faceți clic pe Da pentru a afișa numerele de la 1 la 10” +

", Nu - pentru a afișa numerele de la 10 la 100, în niciun caz" +

„În acest caz, nu apăsați butonul Anulare”, Modul de dialog Întrebare. DaNuAnulează);

Dacă Rezultat = DialogReturnCode.Da Atunci Pentru Pas = Raport de ciclu 1 până la 10 (pas);

EndCycle;

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

EndCycle;

OtherwiseIf Result = DialogReturnCode.Cancel Then OpenValue ("V-am avertizat să nu apăsați Cancel!");

Pune o întrebare despre contabilitate și în termen de șapte zile lucrătoare vei primi un răspuns de la un auditor sau un metodolog de la 1C.
Puteți pune o întrebare la: [email protected] sau folosind un formular web.

Termeni de utilizare

Sunt acceptate întrebări pe următoarele subiecte:

  • procedura de recunoaștere a veniturilor și cheltuielilor organizației;
  • impozitarea și înregistrarea tranzacțiilor comerciale specifice;
  • completarea documentelor contabile (inclusiv primare);
  • determinarea bazei impozabile pentru impozite și contribuții;
  • procedura de plata impozitelor si contributiilor;
  • completarea și depunerea raportărilor contabile și fiscale, precum și raportarea contribuțiilor;
  • procedura de angajare, recompensare, aplicarea penalităților și concedierea salariaților;
  • procedura de atribuire a diverselor plăți către personal (plata concediului de odihnă, beneficii, compensații);
  • completarea diferitelor documente de personal.

Excepțiile includ întrebări

  • privind organizarea și optimizarea afacerilor;
  • privind optimizarea fiscalității și alegerea formei organizatorice și juridice și a regimului de impozitare;
  • legate de evaluarea riscurilor;
  • referitoare la raporturile juridice care sunt reglementate de legislația străină, regională și locală;
  • privind întocmirea și evaluarea documentelor semnificative din punct de vedere juridic (acorduri, acte, pretenții, procese, ordine, instrucțiuni etc.);
  • privind evaluarea tranzacțiilor comerciale efectuate într-un anumit mod;
  • referitoare la reglementarea valutară;
  • formulată incorect (conținutul întrebării nu permite să se răspundă corect);
  • probleme legate de impozitarea persoanelor fizice.

Este acceptată o singură întrebare de la un utilizator la un moment dat. Utilizatorul poate trimite următoarea întrebare după ce a primit răspunsul la întrebarea anterioară.

Preț

    Serviciul „Răspunsuri auditor” este inclus în pachetele de suport pentru tehnologia informației la nivel 1C:ITS PROF.

În plus

Cum să pui o întrebare corect

  • Indicați denumirea și forma juridică a organizației.
  • Indicați numărul de înregistrare al programului pentru care este emis Acordul 1C:ITS.
  • Descrieți situația de afaceri care a determinat întrebarea:
    • să formuleze condițiile în care a apărut;
    • indicați acțiunile care au fost efectuate;
    • indicați caracteristicile care afectează răspunsul (regimul fiscal, perioada tranzacției etc.).
  • Formulează-ți gândurile în mod clar și competent.
  • Fiecare întrebare trebuie trimisă într-o scrisoare separată. Dacă primiți o scrisoare care conține mai multe întrebări fără legătură, se va răspunde doar la prima întrebare.

Forma și condițiile de utilizare a răspunsului

  • Răspunsurile sunt oferite numai la întrebările referitoare la activitățile economice ale persoanei juridice sau ale antreprenorului individual care le adresează.
  • Răspunsul la fiecare întrebare este dat în scris și nu implică o opinie detaliată de audit.
  • Fiecare răspuns la o întrebare este rezultatul activității intelectuale a angajaților 1C. Drepturile la replică sunt protejate de legea civilă. Dreptul exclusiv asupra fiecărui răspuns aparține 1C LLC. O organizație sau un antreprenor individual are dreptul de a utiliza răspunsul primit pentru a rezolva situațiile care apar în cursul activităților lor de afaceri. Utilizatorul care a pus întrebarea nu are dreptul de a furniza răspunsul primit de la 1C (sau orice parte a acestuia) unor terți sau de a-l utiliza în activitățile lor în orice alt mod, cu excepția rezolvării problemelor controversate ale acestora. Compania 1C își rezervă dreptul de a opri consultarea unei organizații (sau antreprenor individual) care a încălcat aceste condiții.
  • Răspunsurile reflectă opinia specialiștilor 1C și sunt de natură consultativă. Utilizatorul ia decizia de a le folosi în practică în mod independent.
  • Compania 1C își rezervă dreptul de a utiliza întrebări și răspunsuri în materiale de consultanță fără acordul persoanei care pune întrebarea.
  • Informațiile despre întrebările adresate (cantitate și conținut) pot fi transferate unei organizații partenere a companiei 1C, cu care persoana care pune întrebarea are un acord de asistență.

Articolul va discuta principalele motive pentru abandonarea modalității în platforma 1C:Enterprise și principalele metode de conversie a secțiunilor de cod într-un nou model asincron.

Aplicabilitate

Articolul discută modelul asincron pentru construirea logicii de afaceri, platforma adăugată „1C:Enterprise” ediția 8.3. Informațiile prezentate sunt relevante pentru versiunile actuale ale platformei.

Refuzul utilizării ferestrelor modale în platforma 1C:Enterprise 8.3

La dezvoltarea unei configurații pe platforma 1C:Enterprise 8, apare necesitatea de a întrerupe periodic programul până când utilizatorul ia o decizie sau efectuează o acțiune.

De exemplu, când faceți clic pe butonul de completare a secțiunii tabulare, utilizatorul ar trebui să fie întrebat dacă secțiunea tabulară trebuie să fie șters, astfel încât datele introduse anterior să nu se piardă.

Acest comportament poate fi realizat, de exemplu, prin următorul cod:

&OnClient
Procedură Completați Produse(Echipa)
Răspuns = Întrebare („Partea tabelului va fi ștearsă. Continuați?”, Modul dialogÎntrebare.DaNu);
Dacă Răspuns = Cod de returnare dialog.Da Apoi
//algoritm de umplere
EndIf ;
Sfârșitul procedurii

Ca urmare a acestui fragment de cod, execuția codului programului va fi suspendată, o întrebare va fi afișată pe ecran, interfața aplicației cu excepția dialogului cu întrebarea va deveni indisponibilă, sistemul așteaptă ca utilizatorul să facă un decizie, iar execuția codului va continua numai după ce se răspunde la întrebare.

Deschiderea ferestrelor modale prin apelarea metodei OpenModal() provoacă, de asemenea, pauze în execuția codului și blocarea interfeței.

Când lucrați cu configurația în modul client web printr-un browser, în acest caz se va deschide o nouă fereastră - o fereastră pop-up care va bloca nu numai fila curentă, ci și întreaga interfață a browserului, inclusiv alte ferestre și file deschise.

Ferestrele pop-up de pe Internet sunt adesea folosite pentru a distribui cu răutate reclame nedorite, motiv pentru care browserele conțin funcții de blocare a ferestrelor pop-up.

În acest caz, pentru a lucra cu configurațiile 1C:Enterprise 8 printr-un browser, trebuie să dezactivați blocarea ferestrelor pop-up.

Probleme apar și atunci când lucrați pe dispozitive mobile. De exemplu, ferestrele modale nu sunt acceptate pe iPad.

Pentru a rezolva aceste probleme, ar trebui să utilizați blocarea ferestrelor în loc de cele modale. Pentru utilizator, vizual totul arată la fel: fereastra blochează interfața clientului web.

Cu toate acestea, fereastra de blocare este „desenată” deasupra ferestrei principale și numai fila curentă a browserului în care este deschisă configurația este blocată, permițându-vă să comutați la alte file, deoarece ferestrele de browser modale nu sunt utilizate.

Astfel, ferestrele pop-up nu se deschid în browser și este asigurată funcționarea prin clientul web pe dispozitivele mobile.

Elementul rădăcină al configurației are o proprietate „Modality mode”, care determină dacă ferestrele modale pot fi deschise în configurație.

Dacă este selectată opțiunea „Utilizați”, atunci pot fi deschise ferestre modale. Dacă este selectată opțiunea „Nu utilizați”, atunci ferestrele modale nu sunt permise. Când încercați să apelați o metodă care deschide o fereastră modală, sistemul afișează un mesaj de eroare:

Cu această valoare a proprietății „Modality usage mode”, este permisă doar blocarea ferestrelor.

Dacă este selectată opțiunea „Utilizați cu avertismente”, atunci când ferestrele modale sunt deschise, în fereastra de mesaj este afișat următorul text:

Această opțiune de lucru poate fi folosită ca una intermediară la relucrarea configurației pentru a renunța la utilizarea ferestrelor modale.

Principala diferență dintre ferestrele de blocare și ferestrele modale este că deschiderea unei ferestre de blocare nu întrerupe execuția codului.

Prin urmare, dezvoltatorii vor trebui să rescrie codul programului care utilizează ferestre modale pentru a lua în considerare această caracteristică.

Codul trebuie împărțit în două părți:

  • deschiderea unei ferestre de blocare;
  • procesarea selecției utilizatorului.

Fragmentul de cod dat la începutul articolului trebuie rescris după cum urmează:

&OnClient
Procedură Completați Produse(Echipa)
Alertă = Nou DescriereAlerte(, ThisObject );

Modul dialogÎntrebare.DaNu);
Sfârșitul procedurii
&OnClient
Procedura (rezultat, Opțiuni suplimentare) Export
Dacă Rezultatul = Cod de returnare dialog.Da Apoi
//algoritm de umplere
EndIf ;
Sfârșitul procedurii

După executarea procedurii ShowQuestion(), sistemul nu se oprește, așteptând răspunsul utilizatorului, execuția codului continuă.

Utilizatorul va putea face o alegere numai după finalizarea întregii proceduri. În acest caz, va fi apelată procedura de export FillItemsQuestionComplete(). Am transmis numele acestuia constructorului obiectului DescriptionAlerts.

Procedura care va fi apelată după efectuarea unei selecții poate fi localizată într-un modul de formular, un modul de comandă sau un modul general non-global.

În exemplul luat în considerare, procedura apelată este localizată într-un modul de formular gestionat, așa că am trecut în parametrul ThisObject.

Să luăm în considerare apelarea unei proceduri situate într-un modul comun. Pentru a face acest lucru, adăugați un nou modul comun Procesare notificări, setați indicatorul „Client (aplicație gestionată)” pentru acesta și nu setați indicatorul „Global”. Să plasăm procedura Fill in Products Question Completare () în acest modul.

Apoi, handlerul de comandă de umplere va arăta astfel:

&OnClient
Procedură Completați Produse(Echipa)
Alertă = Nou DescriereAlerte(„Completați completarea întrebării despre produse”,
Procesarea alertelor);
Textul întrebării = „Partea tabelară va fi ștearsă. Continua?" ;
Afișați întrebare (alertă, text întrebare, Modul dialogÎntrebare.DaNu);
Sfârșitul procedurii

După apelarea oricărei metode care deschide o fereastră de blocare, procedura trebuie să iasă, iar codul care rulează în continuare ar trebui plasat într-o procedură care va fi apelată după ce fereastra este închisă.

Pentru a transfera context (date auxiliare, anumiți parametri, valori variabile) de la procedura care deschide fereastra modală la procedura apelată când aceasta este închisă, este furnizat un al treilea parametru opțional al constructorului de obiect: DescriptionAlerts – Additional Parameters.

Acest obiect (de orice tip) va fi trecut la procedura descrisă în Descrierea alertei ca ultimul parametru.

Folosind exemplul secțiunii de cod discutat mai sus, acest lucru se poate face astfel:

&OnClient
Procedură Completați Produse(Echipa)
Parametrul1 = 0 ;
Parametrul2 = 0 ;
Lista parametrilor= Structură nouă („Parametrul1, Parametrul2″, Parametrul1, Parametrul2);
Alertă = Nou DescriereAlerte(„Completați completarea întrebării despre produse”, ThisObject ,
Lista parametrilor);
ShowQuestion (Alerta, „Partea tabelului va fi ștearsă. Continuați?”,
Modul dialogÎntrebare.DaNu);
Sfârșitul procedurii
&OnClient
Procedură Completați Produse Întrebarea Finalizare(Rezultat, Opțiuni suplimentare) Export
Dacă Rezultatul = Cod de returnare dialog.Da Apoi
//analiza parametri suplimentari.Parametru1
//analizează parametri suplimentari.Parametru2
EndIf ;
Sfârșitul procedurii

Dacă trebuie să treceți o singură valoare, atunci nu puteți utiliza structura, ci puteți atribui această valoare parametrului Parametri suplimentari al constructorului obiectului DescriptionAlerts.

Să ne uităm la câteva exemple de lucru cu blocarea ferestrelor.

Sarcina 1: Deschideți un alt formular

Din formularul de document, făcând clic pe butonul „Deschideți parametri”, trebuie să deschideți un formular pe care există două casete de selectare Parametrul1 și Parametrul2, pe care utilizatorul trebuie să le seteze. După închiderea formularului, afișați valorile parametrilor în linia de mesaje.

Creăm un formular general „ParametersForm”, pe care plasăm detaliile Parameter1 și Parameter2, precum și comanda CloseForm:

Managerul de comandă arată astfel:

Managerul de comandă arată astfel: &OnClient
Procedura CloseForm (comandă)
Lista parametrilor= Structură nouă ( „Parametrul 1, Parametrul 2”, Parametrul 1 , Parametrul 2 );
Închide ( Lista parametrilor); Sfârșitul procedurii

Pentru formular, setați proprietatea WindowOpenMode la „Blocați întreaga interfață”:

Pe formularul de document plasăm comanda OpenParameters, al cărei handler este descris după cum urmează:

&OnClient
Procedură OpenOptions(Echipa)
Alertă = Nou DescriereAlerte(„Opțiuni deschise Terminare”, ThisObject );
OpenForm ( „GeneralForm.FormParameters”, , , , , , Notificare);
Sfârșitul procedurii
&OnClient
Procedură OpenOptionsComplete(Rezultat, Opțiuni suplimentare) Export
Dacă TypeValue (Rezultat) = Type („Structură”), atunci
Pentru fiecare KeyValue From Result Loop
Mesaj = Nou Mesaj pentru utilizator;
Message.Text = „Cheie: „” ” + KeyValue.Key + “””, valoare = ”
+ KeyValue.Value;
Mesaj.Raport();
EndCycle ;
EndIf ;
Sfârșitul procedurii

În modul utilizator, rulând configurația sub clientul web, obținem următoarele rezultate:

Pentru marire, click pe imagine.

Modul de deschidere a ferestrei poate fi specificat și în ultimul parametru al procedurii OpenForm.

&OnClient
Procedură OpenOptions(Echipa)
Alertă = Nou DescriereAlerte(„Opțiuni deschise Terminare”, ThisObject );
OpenForm ( „GeneralForm.FormParameters”, , , , , , Alerta
FormWindowOpenMode.LockEntireInterface
);
Sfârșitul procedurii

Sarcina 2. Întrebare la închiderea formularului

Când închideți o fereastră de procesare, întrebați utilizatorul dacă dorește cu adevărat să închidă fereastra.

Această problemă poate fi rezolvată folosind următorul cod aflat în modulul formular de procesare:

&OnClient
Perem Trebuie să închideți formularul;
&OnClient
Procedura înainte de închidere (Eșec, Procesare standard)
Dacă nu Trebuie să închideți formularul= Adevărat Atunci
Eșec = Adevărat;
Alertă = Nou DescriereAlerte(„Înainte de Închidere Finalizare”, ThisObject );
ShowQuestion (Alerta, „Sunteți sigur că doriți să închideți fereastra?”,
Modul dialogÎntrebare.DaNu
);
EndIf ;
Sfârșitul procedurii
&OnClient
Procedură Înainte de Închidere Finalizare(Rezultat, Opțiuni suplimentare) Export
Dacă Rezultatul = Cod de returnare dialog.Da Apoi
Trebuie să închideți formularul= Adevărat;
Închide();
In caz contrar
Trebuie să închideți formularul= nedefinit ;
EndIf ;
Sfârșitul procedurii

În procedura de formular BeforeClosing, utilizatorului i se pune o întrebare, indicatorul Refuz este setat la True și închiderea formularului este anulată.

După un răspuns afirmativ la întrebare, variabila Need toCloseForm este setată la True, iar formularul este închis din nou.

Sarcina 3: Introducerea unei valori numerice

Când faceți clic pe butonul de pe formularul de procesare, deschideți un dialog standard de introducere a numărului.

Pentru a face acest lucru, trebuie să utilizați metoda ShowNumberInput() în loc de EnterNumber(), care deschide o fereastră de blocare în loc de una modală.

&OnClient
Procedura de introducere a numerelor (comandă)
Alertă = Nou DescriereAlerte(„EnterNumberComplete”, ThisObject );
Afișați EnterNumbers(Alerta, 0, „Introduceți cantitatea”, 15, 3);
Sfârșitul procedurii
&OnClient
Procedură Introducerea numerelor În curs de finalizare(Rezultat, Opțiuni suplimentare) Export

Mesaj = Nou Mesaj pentru utilizator;
Message.Text = „Ați introdus o cantitate” + Rezultat;
Mesaj.Raport();
EndIf ;
Sfârșitul procedurii

După închiderea ferestrei de introducere a numărului, va fi apelată o procedură, primul parametru al căruia va fi numărul introdus sau valoarea Nedefinită dacă utilizatorul a refuzat să intre.

Sarcina 4. Alegerea unei culori

Când faceți clic pe butonul de pe formularul de procesare, folosind dialogul standard de selecție a culorii, utilizatorul specifică culoarea necesară. Setați această culoare pentru fundalul butonului apăsat.

Adăugați comanda SelectColor la formular cu următorul handler:

&OnClient
Procedura de selectare a culorii (comandă)
Dialog de selectare a culorii= Nou Dialog de selectare a culorii;
Alertă = Nou DescriereAlerte(„Selectarea culorilor finalizată”, ThisObject );
Dialog de selectare a culorii. Afișează (Alerta);
Sfârșitul procedurii
&OnClient
Procedură ChoiceColorsCompletion(Rezultat, Opțiuni suplimentare) Export
Dacă NU Rezultat = Nedefinit, atunci
Elemente.Selectarea culorii.Culoare de fundal= Rezultat ;
EndIf ;
Sfârșitul procedurii

Pentru obiectele Dialog de selecție a culorii (precum și Dialogul de editare a perioadei standard, Constructorul de linie de format, Dialogul de programare a sarcinilor obișnuite, Dialogul de selecție a fontului), metoda Show() deschide o fereastră de blocare.

După închiderea ferestrei, va fi apelată o procedură, primului parametru căruia i se va trece valoarea selectată (culoare, font etc.) sau valoarea Nedefinită dacă utilizatorul a refuzat alegerea.

Trebuie remarcat faptul că obiectul FileSelectionDialog nu are o metodă Show(), spre deosebire de casetele de dialog de selecție a culorilor sau a fontului, deoarece implementarea acestor dialoguri este semnificativ diferită.

Pentru a utiliza dialogul de selectare a fișierelor pe clientul web, trebuie mai întâi să activați extensia fișierului.

Dialogurile implementate prin extensia de fișier nu creează aceleași probleme operaționale ca ferestrele de browser modale, astfel încât deschiderea ferestrelor de blocare pentru obiectul FileSelectionDialog nu a fost implementată.

În concluzie, observăm că, începând cu versiunea 8.3.10, suportul pentru ferestrele modale a fost întrerupt în clientul web. În acest caz, dacă în configurație este apelată o metodă modală, se generează o excepție. De asemenea, suportul pentru modul de interfață a fost întrerupt în clientul web În ferestre separate. În plus, atât în ​​clientul subțire, cât și în cel web, nu mai este posibilă deschiderea unui formular într-o fereastră separată (când se lucrează în modul de interfață Bookmarks). Astfel de pași drastici au făcut posibilă abandonarea modului de interfață, care nu mai este acceptat de toate browserele moderne.

Ce concluzie practică se poate trage din aceste informații? Și concluzia este destul de simplă - dacă din anumite motive există încă apeluri modale în configurația dvs., atunci în aceste locuri din clientul web va fi afișată o fereastră cu un mesaj de eroare. Aș dori să avertizez împotriva încercării de a „Google” o soluție rapidă la această problemă, deoarece... Cele mai multe sfaturi se rezumă la această rețetă: în configurator la nivelul de configurare, setați proprietatea „Modality usage mode” la „Utilizare”. Desigur, în acest moment, acest lucru nu va funcționa doar pentru că browserele moderne nu mai acceptă apeluri modale.

Și aveți doar două moduri de a rezolva problema descrisă mai sus:

  1. Actualizați platforma pentru lansarea 8.3.10+ (8.3.11), setați proprietatea de configurare „Mod de compatibilitate” la „Nu utilizați” și rescrieți fragmente de cod care utilizează metode modale într-un model logic de afaceri asincron
  2. Recomandați clienților dvs. să folosească browsere mai vechi care încă acceptau apeluri modale (Mozilla Firefox versiunile 37 și mai mici, versiunile Chrome sub 37 etc.).

Apropo, începând cu versiunea 8.3.11, browserele web Microsoft Internet Explorer versiunile 8 și 9 nu mai sunt acceptate.

Ne-am ocupat de browsere web în lumina modalității, acum este timpul să clarificăm situația cu alți clienți.

Începând cu versiunea 8.3.5, proprietatea Modality Usage Mode în clienții thin și thick este respectată numai dacă este specificată opțiunea de linie de comandă /EnableCheckModal. Acest parametru este inserat automat în linia de comandă numai atunci când aplicația este lansată din configurator. Dacă acest parametru nu este specificat, atunci nu sunt generate excepții și nu sunt afișate avertismentele corespunzătoare. Acestea. în practică, atunci când se folosește un client gros și subțire, nu se observă o schimbare fundamentală în funcționare atunci când se utilizează modul modal - apelurile modale vor funcționa la fel ca înainte, fără a produce avertismente, ca în clientul web.

Pentru a puncta toate „i-urile”, observăm că, începând cu ediția 8.3.9, proprietatea de configurare „Modul de utilizare a apelurilor sincrone ale extensiilor platformei și componentelor externe” este ignorată în clientul gros, în timp ce metodele sincrone corespunzătoare funcționează fără generare. excepții și afișarea avertismentelor. Proprietatea ignorată specificată a fost adăugată în versiunea 8.3.5 pentru a sprijini lucrul asincron cu componente externe, criptografia și extensiile pentru lucrul cu fișierele din browserul web Google Chrome. Este clar că acest lucru nu are nimic de-a face cu clientul gros și, prin urmare, ignorarea „liniștită” a acestei proprietăți a eliminat pur și simplu verificările inutile pentru utilizarea metodelor sincrone atunci când se folosește configurația.

Apropo! Datorită faptului că platforma se îndreaptă cu încredere spre web, cu versiunea 8.3.8 dezvoltatorii au introdus anumite restricții asupra codului programului care este asociat cu logica de închidere a unui formular sau a unei aplicații, executată în clienți gros și subțiri. Asigurați-vă că citiți articolul nostru care acoperă această nuanță în detaliu. În plus, în cursul „Dezvoltarea profesională a interfețelor și formularelor în 1C: Enterprise 8.3”, există un capitol dedicat abandonării modalității și puteți aduna o mulțime de informații utile și relevante pe această temă.

Colegii, există două lucruri pe care le puteți citi la nesfârșit: feedul VKontakte și lista modificărilor din următoarea ediție a platformei, așa că să rezumam rezultatele finale;)

În procesul de luare în considerare a exemplelor care vă permit să treceți de la elementele unui model sincron la unul asincron, probabil ați observat deja că în cazul general există mai mult cod de program. Cu cât există mai mult cod, cu atât crește complexitatea întreținerii și depanării sale ulterioare.

În plus, cantitatea de cod va crește și mai mult dacă folosim mai multe dialoguri în timpul procesului de dezvoltare. Prin urmare, în procesul de dezvoltare a soluțiilor de aplicație axate pe lucrul într-un client web, trebuie să vă amintiți paradigma de lucru care este utilizată în prezent în aplicațiile web moderne. Prin urmare, dacă configurația dvs. are o mulțime de dialoguri interactive cu utilizatorul și avertismente, atunci este logic să reconsiderați această funcționalitate în favoarea unor alte abordări de organizare a interacțiunii cu utilizatorul.

În loc de concluzie

Ciclul nostru „Primii pași în dezvoltarea 1C” s-a încheiat. Dacă l-ați citit în întregime, atunci cel mai probabil ați observat deja modul în care platforma s-a dezvoltat treptat în ultimul timp. Materialul din această serie a fost scris relativ recent, dar am fost nevoiți să-l actualizăm serios, pentru că... Chiar și într-o perioadă atât de scurtă, au apărut o mulțime de noi funcționalități și schimbări importante. Astfel de schimbări majore pot fi oarecum nedumeritoare pentru un programator 1C dacă nu a crescut și s-a dezvoltat profesional cu platforma în tot acest timp.

Pe resursele de internet specializate puteți citi adesea solicitări de la programatori începători și de la colegii lor mai maturi de a recomanda materiale care să-i ajute să înțeleagă capabilitățile extinse și uneori aparent nesfârșite ale platformei 1C. În mod tradițional, vă recomandăm să acordați atenție cursurilor noastre de programare