1c obísť tabuľku dynamického zoznamu.

Okrem primitívnych dátových typov, ktoré možno nájsť v akomkoľvek programovacom jazyku, existujú v 1C aj jedinečné typy. Každý z nich má svoje vlastné vlastnosti, metódy, funkcie, účel a nuansy použitia v systéme. Jedným z týchto typov je dynamický zoznam, ktorý výrazne zjednodušuje mnohé aplikované úlohy. Preto by vývojári mali poznať a vedieť zvládnuť tento všestranný nástroj.

Vlastnosti dynamických zoznamov v 1C

účel tohto typu je zobrazovať informácie z ľubovoľných databázových tabuliek bez ohľadu na ich typ. Mechanizmus bol vytvorený na základe SKD a má podobné schopnosti. To však neznamená, že určite budete musieť napísať dotaz v jazyku 1C, aj keď táto možnosť existuje a musíte ju použiť. Môžete jednoducho zadať tabuľku, informácie, z ktorých máte záujem, a 1C nezávisle vygeneruje jednoduchý dotaz.

Ak chcete vidieť, ako sa dynamický zoznam tvorí a aké údaje zobrazuje, musíte v konfigurátore otvoriť spravované formuláre, kde sa nachádza: v zozname detailov cez obsahové menu otvorte jeho vlastnosti a venujte pozornosť položke „Arbitrary Request“. Ak nie je začiarkavacie políčko, potom parameter "Hlavná tabuľka" odráža databázovú tabuľku, z ktorej sú prevzaté údaje. V opačnom prípade dynamický zoznam odzrkadľuje údaje vlastného dopytu, ktoré je možné zobraziť otvorením nastavenia zoznamu.

Oveľa bežnejšie sa používa ľubovoľná schéma dotazu, pretože poskytuje skvelú príležitosť na kombinovanie a zobrazenie širokej škály údajov. Najčastejšie sa tento mechanizmus používa na vyjadrenie stavov zásob, cien položiek, príjmov, výdavkov alebo nákupov. Musíte ho používať opatrne, pretože pri zložitých dopytoch môže výkon klesnúť.

Ďalšia užitočná funkcia dynamický zoznam otvorí sa po kliknutí na nápis „Nastavenia zoznamu“. Toto menu umožňuje, aj keď používate štandardnú sadu polí, aby boli informácie prístupnejšie a zrozumiteľnejšie pre koncových používateľov. Či už ide o svojvoľnú požiadavku alebo nie, zobrazí sa karta „Nastavenia“, kde môžete určiť:

  • Výber dynamického zoznamu;
  • zoskupenia;
  • triedenie;
  • Dekor.

Vďaka použitiu parametrov sú dynamické zoznamy dostatočne univerzálne a flexibilné. Môžete ich tiež naviazať na rekvizity na spravovanom formulári a údaje sa budú meniť v závislosti od možností vybratých používateľom. Použitie týchto mechanizmov možno pochopiť a oceniť pohľadom na príklady problémov v reálnom svete.

Ako príklad si uveďme problém premietnutia zvyškov nomenklatúry do riadeného formulára. V reálnej praxi sú takéto objednávky v rôznych konfiguráciách úplne bežné a ako pomôcka je ideálny dynamický zoznam. Pre túto úlohu budeme musieť použiť ľubovoľný dotaz, parametre dynamického zoznamu a jeho nastavenia.

Pre väčšiu prehľadnosť vytvoríme samostatný externé spracovanie a umiestnite naň dynamický zoznam. Na realizáciu našich plánov bude k dispozícii niekoľko tabuliek s nomenklatúrou, takže musíme povoliť ľubovoľnú požiadavku. V nej popíšeme ľavé prepojenie príručky so zoznamom nomenklatúry a registra rezíduí a príručnú knihu nastavíme ako hlavnú tabuľku. Takáto schéma umožní používateľom pri práci s dynamickým zoznamom pridávať alebo meniť nomenklatúru.



Vyberte si nomenklatúru Názov Názov ako názov, tovarové a predajné náklady Sklad ako sklad, tovarové a predajné náklady Sociálne - návrhy ako počet inštalácií z adresára Nomenklatúra ako nomenklatúra ľavého spojenia registra. Kontinuita. Výstup (iv auhitsaydata,)

Keďže v našej požiadavke bol použitý parameter CurrentDate, musíme pred použitím spracovania nastaviť jeho hodnotu. Ak to chcete urobiť, vo formulárovom module v procedúre "On CreationOnServer" mu štandardným príkazom priraďte funkciu "CurrentSessionDate" štandardným príkazom. Musíme tiež zobraziť dynamický zoznam na kontrolnom formulári a zmeniť poradie polí kvôli prehľadnosti. Potiahnite rekvizity „Nomenclature Remains“ do prvkov formulára (vľavo hore) a pomocou modrých šípok zmeňte poradie polí v tabuľke vo formulári.

&Na serveri Procedúra Pri vytváraníNa serveri(Failure, StandardProcessing) Nomenklatúra Remains.Parameters.SetParameterValue("CurrentDate",CurrentSessionDate()) EndProcedure


Už v tejto fáze môžeme otvoriť naše externé spracovanie v 1C a vidieť, že dynamický zoznam funguje. Môžeme sa pozerať na zostatky, vytvárať nomenklatúru a skupiny a hľadať. Zákazníci často žiadajú pridať možnosť vybrať si dátum, ku ktorému uvidia zostatok. V prípade formulára s dynamickým zoznamom to zabezpečuje doplnkové pole a s ním nastavovať parametre.

Pridáme atribút „Zostáva dátum“ typu „Dátum“ a prenesieme ho do prvkov formulára. V poli udalosti vytvoríme udalosť „OnChange“ a napíšeme kód pre nastavenie parametra „CurrentDate“ použitého v dynamickom dotaze. Aby používateľ pri otvorení formulára okamžite pochopil, ku ktorému dátumu vidí zostatky, vykonáme malé zmeny v postupe OnCreateOnServer.



&OnServerProcedureOnCreateOnServer(Failure, StandardProcessing)RemainsDate = CurrentSessionDate(); Item Remains.Parameters.SetParameterValue("CurrentDate", RemainsDate); Koniec procedúry &U klienta Procedúra RemainsDateOnChange(Element) Položka Remains.Parameters.SetParameterValue("CurrentDate",RemainsDate); EndProcedure

Výsledkom je, že náš formulár Dynamický zoznam môže zobraziť zostatky pre akýkoľvek dátum.

Pokryli sme len malú časť možností tejto sady nástrojov, ale to už stačí na pochopenie pohodlia tohto typu dynamického zoznamu. Podobný mechanizmus sa používa na rôzne úlohy, ale najčastejšie sa vyskytuje v typické konfigurácie V riadené formuláre:

  1. výber;
  2. zoznamy.

Na získanie dynamického zoznamu a jeho požiadavky v typických spravovaných formulároch musí vývojár otvoriť požadovaný formulár v konfigurátore. V sekcii atribúty nájdite atribút s dátovým typom "DynamicList" (najčastejšie je zvýraznený tučným písmom). Jeho vlastnosti obsahujú text požiadavky, výbery a ďalšie nastavenia.

Platforma 1C:Enterprise 8.2 dokáže pracovať s viacerými záznamami v databázovej tabuľke dynamickým spôsobom, to znamená, že dokáže čítať údaje po častiach. Skôr v článkoch sme sa zaoberali mechanizmom dynamických zoznamov a metódami na optimalizáciu práce s nimi.

Dnes budeme riešiť neštandardný problém pre dynamické zoznamy. Budeme musieť vypočítať súčet pre atribút dokladu "Suma" a zobraziť ho v päte zoznamu. Podobne vypočítajte priemernú hodnotu pre pole „Hodnotenie“ a tiež ju zobrazte v päte dynamického zoznamu. Výpočet celkových polí musí zohľadňovať výber nastavený používateľom v nastaveniach zoznamu dokladov.

Celý problém spočíva v tom, že dynamický zoznam neprijíma všetky záznamy naraz, ale prijíma ich po častiach. Preto nemôžeme okamžite získať súčet pre všetky dokumenty zodpovedajúce aktuálnemu výberu. Ako vypočítať súčet?

Implementácia

A tak prejdime k riešeniu problému. Začnime zmenou formy, potom si popíšeme algoritmus na získanie konečných hodnôt.

Forma a rozhranie

Najprv si pripravme formulár dokumentu na zobrazenie finálnych polí. Aby sme to urobili, pridajme dva reťazcové atribúty v tvare "Hodnotenie" a "Suma".

Tieto podrobnosti budú obsahovať celkové hodnoty pre dokumenty.

Ak chcete zobraziť hodnoty atribútov v päte dynamického zoznamu, musíte povoliť zodpovedajúcu možnosť priradeného prvku formulára zoznamu (pozrite si nasledujúcu snímku obrazovky).

Teraz sa musíte rozhodnúť, pri ktorej udalosti sa budú výsledky aktualizovať v päte zoznamu. Pre pohodlie vývoja pridajte príkaz "Aktualizovať" a zodpovedajúci prvok formulára na panel príkazov. Po vykonaní tohto príkazu sa aktualizujú súčty.

V testovacej konfigurácii, ktorú si môžete stiahnuť z odkazu na konci článku, som pridal aj udalosť aktualizácie súčtu pri písaní dokumentu. Toto využíva mechanizmus oznamovania formulárov. Nebudeme sa tým podrobnejšie zaoberať.

Algoritmus

Najproblematickejšia časť zostáva - musíte získať hodnoty súčtu. Postupujeme takto: vytvoríme databázový dotaz, aby sme získali hodnoty konečných polí v súlade s výberom nastaveným v dynamickom zozname. Treba mať na pamäti, že pri výbere môže byť zo skupín zložitý stav.

Poznámka: Nastavenia dynamického zoznamu (pozri snímku obrazovky vyššie) sú založené na mechanizmoch systému zostavovania údajov (ACS). Podľa toho s nimi môžete pracovať podobným spôsobom (programovo pridávať, meniť, čítať atď.).

Kroky na vygenerovanie dotazu na získanie výsledkov sú nasledovné:

1. Získajte počiatočnú požiadavku na dynamický zoznam.

Ako vidíme, žiadosť vyberá všetky podrobnosti dokumentu. Pre malú komplikáciu som pridal vlastné pole „LevelRating“, tvorené konštruktom „CHOICE“.

2. Spracujeme text podmienok žiadosti (časť „KDE“) a nahradíme ho do pôvodnej žiadosti.

Do prijatého zdrojového textu požiadavky musíme pridať podmienky v súlade s nakonfigurovaným výberom dynamického zoznamu.

Postup v závislosti od typu odovzdaného prvku filtra (skupina alebo prvok filtra) vygeneruje príslušný text podmienky. Všetky podmienky v skupine sú orámované zátvorkami, členovia skupiny sú orámovaní aj zátvorkami. Podmienky medzi výrazmi závisia od nadradenej skupiny (podmienka „AND“ je umiestnená medzi najvyššie prvky v hierarchii).

Ak má prvok príznak použitia (vlastnosť "Usage"), prvok sa spracuje. Vygenerovaný text závisí aj od podmienky porovnania (rovná sa, nerovná sa, v zozname atď.). Závislosť vygenerovaného textu podmienky od typu porovnania je vidieť na nasledujúcej funkcii.

Ďalšou zaujímavou funkciou je podľa mňa „GetFieldTextOnView“. Je potrebný na nahradenie polí do podmienok dopytu, ktoré sú tvorené výrazmi dopytovacieho jazyka. Vyššie som do pôvodnej požiadavky pridal pole „Hodnotenie úrovne“. Ak ho používateľ použije pri výbere, potom musí byť do podmienky dopytu dosadený celý výraz. Táto funkcia získa text poľa z požiadavky jeho reprezentáciou. Pre takéto zložité polia vráti celý text výrazu.

Ďalšie podrobnosti o algoritme nájdete v konfigurácii testu pripojenej k článku. Nižšie je snímka obrazovky s nastaveniami výberu a podmienkami dotazu, ktoré sú pre ne vygenerované.

Vygenerovaný text podmienky je pripojený k pôvodnej žiadosti o dynamický zoznam. Výsledok dotazu sa umiestni do dočasnej tabuľky.

3. Prvý dotaz umiestnime do dočasnej tabuľky a vykonáme zoskupenie podľa súhrnných polí s potrebnými agregačnými funkciami.

Pripomínam, že potrebujeme získať priemernú hodnotu pre pole „Hodnotenie“ a celkovú sumu pre pole „Suma“. Už sme vytvorili dotaz berúc do úvahy výbery, zostáva vypočítať celkové hodnoty. To sa vykonáva pomocou nasledujúceho dotazu:

Po vykonaní požiadavky spracujeme výsledok, vrátime ho klientovi a zapíšeme do údajov formulára, ktoré sme predtým vytvorili. Nakoniec sme sa dočkali zobrazenia súčtov v päte dynamického zoznamu (pozri prvú snímku obrazovky k článku).

Optimálnosť riešenia

Vo všeobecnosti môže tento prístup nepriaznivo ovplyvniť výkon. Napríklad, ak program vypočíta súčet bez zavedeného výberu v dynamickom zozname, potom môže byť počet vybraných záznamov obrovský (napríklad na niekoľko rokov). Výsledkom je, že každá aktualizácia výsledkov môže trvať desiatky (!!!) sekúnd. Preto má zmysel vypočítať súčty iba vtedy, ak bol stanovený výber. Táto podmienka dať do testovacej konfigurácie.

Navyše, výpočet výsledkov, môžeme urobiť požiadavku iba na strane servera. Preto musíte vážne pristupovať k požiadavke na server, pretože postup aktualizácie súčtu sa môže vykonávať veľmi často. Predstavte si register šekov KKM v obchodnej organizácii, kde je možné zadať až 5 šekov za minútu a až 300 šekov za hodinu. Zakaždým po napísaní dokumentu sa zavolá aktualizácia súčtu. Preto by bolo rozumné znížiť prenášanú prevádzku použitím postupov vytrhnutých z kontextu.

Nasledujúca snímka obrazovky ukazuje programovací kód volanie funkcie servera mimo kontextu, ktorá vracia súčty.

Prvým parametrom je výber dynamického zoznamu, druhým je štruktúra typu „FilterFieldNameFilterFieldValueType“. Všimnite si, že prvý parameter vo funkcii sa prijíma ako samostatná hodnota. Neviem presne povedať prečo, ale ak odošlete výber ako odkaz, platforma zobrazí chybu, že výber nemožno zmeniť. Chyba sa dala obísť len takto.->

Poznámka: použitie procedúr mimo kontextu vám umožňuje niekoľkonásobne znížiť množstvo prenášanej prevádzky, pretože údaje formulára sa na server neprenášajú na rozdiel od procedúr kontextového servera (direktíva „&AtServer“).

Záver

Na záver poviem, že takýto postup výpočtu súčtov v dynamickom zozname je z hľadiska metodiky vývoja nesprávny. Bolo by správne dostávať súčet v registroch. Napríklad v denníku šekov opäť môžeme získať sumu peňazí v aktuálnej pokladnici buď podľa dokladov, alebo podľa zodpovedajúcej evidencie akumulácie.

Navyše, použitie akumulačných registrov vám umožní vypočítať súčty bez zohľadnenia výberu, pretože systém pracuje optimálne s už vypočítanými súčtami za posledné mesiace.

Metóda opísaná v článku sa však uskutočňuje pri riešení problémov.

K stiahnutiu:

Domáce poznámky zo zrkadla

21.04.2014 Získavanie údajov dynamického zoznamu

Realizované vo verzii 8.3.6.1977.

Implementovali sme možnosť jednoduchého a pohodlného získavania údajov zobrazovaných pomocou dynamického zoznamu.

Možno budete potrebovať údaje dynamického zoznamu, aby ste ich mohli vytlačiť v neštandardnej, „špecifickej“ forme. Alebo aby ste s nimi vykonali určité akcie. Napríklad pošlite list všetkým protistranám, ktoré ste vybrali v zozname podľa určitých kritérií.

Okrem toho existuje množstvo úloh, v ktorých chce používateľ okrem zoznamu prvkov vidieť aj súhrnné údaje spojené s týmto zoznamom. Napríklad po výbere tovaru určitej skupiny výrobkov a určitého dodávateľa chce okamžite vidieť celkový počet takýchto tovarov v databáze.

Samotný dynamický zoznam vám tieto informácie nemôže poskytnúť. Účelom dynamického zoznamu je poskytnúť Rýchle zobrazenie veľké množstvo údajov. Preto číta údaje v kúskoch potrebných na zobrazenie na jednej alebo dvoch obrazovkách. A „nevie nič“ napríklad o celkovom množstve údajov, ktoré musí prečítať.

Vo všeobecnosti, aby sa dostali Ďalšie informácieže používateľ chce, musíte dopytovať databázu. Presne rovnaký ako ten, ktorý sa používa v dynamickom zozname.

Mohli ste to urobiť predtým. Ale nebolo to vždy jednoduché. Veď okrem textu pôvodného dotazu, podľa ktorého dynamický zoznam funguje, ste potrebovali poznať všetky výbery, zoradenia a ďalšie parametre, ktoré používateľ interaktívne nastavuje v tabuľke zobrazujúcej údaje.

Teraz je táto úloha ľahko vyriešená. Tabuľka dynamického zoznamu má dve nové metódy:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

Získate tak samotnú schému zloženia údajov a hlavne všetky jej nastavenia, vďaka ktorým používateľ vidí zoznam presne taký, aký je. Všetko, čo musíte urobiť, je programovo rozložiť rozloženie a vypísať ho do kolekcie hodnôt (napr softvérové ​​spracovanie) alebo v tabuľkový dokument(zobraziť):

V dôsledku toho získate štruktúru (alebo zostavu) obsahujúcu stĺpce a riadky, ktoré sa zobrazujú v tabuľke dynamického zoznamu.

Dôležité je, že rozloženie a nastavenia, ktoré získate z tabuľky dynamického zoznamu, zohľadňujú okrem iného viditeľnosť stĺpcov a použité vyhľadávanie. Keďže nastavenia sa získavajú samostatne, môžete zmeniť zloženie polí pre vlastné účely a získať tak napríklad všetky stĺpce zoznamu, nielen tie, ktoré sú viditeľné pre používateľa.

Pri výstupe do tabuľkového dokumentu je tu ďalší pekný moment. Vo všeobecnosti bude vzhľad správy zodpovedať vzhľad dynamických zoznamov v čase prijatia schémy a nastavení. Vrátane podmieneného dizajnu tabuľky. Niektoré ďalšie akcie budete potrebovať iba vtedy, ak chcete preniesť podmienený návrh formulára aj do zostavy.

V procese dokončovania konfigurácií sa každý programátor 1C stretáva s dynamickými zoznamami.
Dynamický zoznam je objekt rozhrania, ktorý slúži na zobrazenie rôznych zoznamov databázových objektov alebo neobjektových údajov – záznamov registra.
Napríklad dynamický zoznam sa používa na zobrazenie zoznamu položiek:

Aby sme demonštrovali možnosti dynamického zoznamu, vytvorte externé spracovanie, pridajte hlavný formulár. Pridajme do formulára nový atribút s typom „Dynamický zoznam“. Poďme k jeho vlastnostiam a uvidíme, čo tam je.
Máme záujem o nehnuteľnosť "Vlastná požiadavka". Jeho aktivácia nám ukáže všetky možnosti dynamického zoznamu. Budeme môcť napísať dotaz pomocou takmer všetkých funkcií dotazovacieho jazyka systému 1C: Enterprise. Začiarknite políčko a kliknite na odkaz „Otvoriť“:

Náš zoznam štandardne zobrazí zoznam položiek s celkovým zostatkom za všetky sklady. Ak chcete implementovať takýto zoznam, pridajte nasledujúci dotaz:


Ako hlavnú tabuľku zvolíme "Adresár. Nomenklatúra", to nám umožní pracovať s dynamickým zoznamom, ako so zoznamom nomenklatúry - pridať, zmeniť, označiť na vymazanie prvkov adresára. Nastavenie hlavnej tabuľky sprístupňuje aj možnosť dynamického čítania údajov - to znamená, že výber sa bude vykonávať po častiach, podľa potreby.
Ďalej musíme vytvoriť prvky formulára pre náš zoznam:

Ak sa pokúsime spustiť spracovanie v tomto formulári, zobrazí sa chyba:


Aby ste to odstránili, musíte nastaviť hodnotu parametra "Obdobie". Na tento účel môžete použiť metódu "SetParameterValue" kolekcie "Parameters" dynamického zoznamu. Metóda má dva parametre:
. "Parameter" - Typ: Reťazec; DataCompositionParameter. Názov parametra alebo parametra zloženia údajov, ktorého hodnota sa má nastaviť;
. "Hodnota" - Typ: Ľubovoľné. Hodnota, ktorá sa má nastaviť.
Dá sa zavolať v obslužnom programe „OnCreateOnServer“ formulára:

Máte otázku, potrebujete pomoc konzultanta?


Dajme používateľovi možnosť zmeniť obdobie prijímania zostatkov. Ak to chcete urobiť, pridajte atribút a k nemu priradený prvok formulára „Dátum“:


V obslužnom programe "OnChange" prvku formulára "Date" zavolajte metódu "SetParameterValue" a ako hodnotu odovzdajte hodnotu priradeného atribútu. Podobne zmeníme postup formulára „On CreationAtServer“. Keďže metóda je dostupná na klientovi, nie je potrebné volať server:


Teraz, keď sa dátum zmení, zostatky sa automaticky aktualizujú:




Predpokladajme, že používatelia chcú vidieť aktuálne zostatky alebo plánované príjmy. Zvážme jednu z možností implementácie. Pridajme boolovský atribút formulára a príslušný prepínač:


Pri zmene hodnoty prepínača zmeníme text požiadavky. Na tento účel použijeme obslužnú rutinu udalosti „OnChange“ formulárového prvku „DisplayQuantityToReceipt“. Musíme zmeniť vlastnosť "QueryText" dynamického zoznamu v závislosti od hodnoty atribútu. Keďže táto vlastnosť nie je na klientovi dostupná, vyžaduje sa volanie procedúry servera:


Výsledok vykonaných zmien:



Konečne sa splnil sen každého „sedmičkára“. Ako často používatelia programu 7.7 požadovali normálny výber položiek. Aby ste videli zostatky, ceny a nastavené filtre. Musel som vymýšľať rôzne triky, až po písanie externých komponentov. V 1C 8.2 sa objavili dynamické zoznamy. Navrhujem zvážiť, čo to je a čo nám môžu dať v 1C 8.3.

Zoberme si ako základ niektoré testovacia konfigurácia 1C: "Podnikové účtovníctvo 3.0". Teraz nebudeme robiť výber, stačí pridať ďalší formulár výberu do referenčnej knihy "Nomenklatúra" a dočasne ho urobiť hlavným:

Po vytvorení systém štandardne pridá do formulára pole tabuľky s typom "Dynamický zoznam".

Poďme k jeho vlastnostiam a uvidíme, čo tam je.

V prvom rade nás zaujíma zaškrtávacie políčko „Arbitrary request“. Práve on nám odhalí všetky výhody dynamického zoznamu. Budeme mať možnosť napísať vlastný dotaz aj s parametrami. Začiarknite políčko a kliknite na odkaz „Otvoriť“:

Otvorí sa okno s pripraveným kódom pre . Zatiaľ sú tam jednoducho uvedené všetky polia adresára "Nomenklatúra".

Získajte bezplatné video lekcie 267 1C:

Ako vidíte, existuje tlačidlo volania "" a začiarkavacie políčko, ktoré vám umožňuje dynamicky meniť obsah zoznamu. To znamená, že keď iný používateľ zmení niečo v adresári, zmení sa to aj v našom zozname. Okrem toho je tu karta Nastavenia, ale tej sa dotkneme neskôr.

Vlastný dopyt v dynamickom zozname

Najprv vytvorte požadovaný dopyt so zostatkami a cenami. Ako to:

Karta Nastavenia

A teraz to najchutnejšie! Prejdite na kartu „Nastavenia“. A hneď vidíme, že na prvej karte môžeme urobiť ľubovoľný výber pre ľubovoľné pole v požiadavke:

Programové nastavenie parametrov dotazu v dynamickom zozname 1C 8.3

Nezabudnite, že v požiadavke máme dva parametre: „Obdobie“ a „Typ ceny“. Musíme ich odovzdať do žiadosti, inak dôjde k chybe.

Zapíšme tieto parametre do parametrov formulára a do modulu formulára pridajte nasledujúce riadky:

&OnServerProcedure OnCreateOnServer(Failure, StandardProcessing) List. Možnosti. SetParameterValue("Obdobie", Parametre. Dátum) ; Zoznam. Možnosti. SetParameterValue("PriceType" , Parameters.PriceType) ; EndProcedure

Načítava...
Hore