Chyba při výpočtu zůstatků v systému úložiště a jeho softwarové opravy na příkladu univerzálního výkazu. Chyba ve výpočtu zůstatků v úložném systému a jeho softwarová oprava na příkladu univerzální sestavy Máte dotaz, potřebujete pomoc od poradce

41
Nedávno jsem vytvořil sestavu s neurčitým počtem sloupců. Nechtěl jsem se vrtat s kódem, tak jsem se rozhodl to udělat v systému kontroly přístupu. Nebyl s tím žádný problém, výsledek bylo nutné natáhnout na libovolné rozložení (vlastní hlavička +... 27
I když na to studenti CDS narazí první nebo druhý den, mělo by to být v sekci FAQ. Jednoduchý příklad programového výstupu sestavy v rozvržení s použitím výchozího nastavení. //Získejte diagram z... 18
Při generování sestav v systému řízení přístupu jsou standardně všechna seskupení rozbalena, ale někdy je nutné zobrazit sestavu se sbalenými seskupeními ihned po vygenerování! Tento kód v modulu sestav umožňuje sbalit... 10
Na této záložce můžete určit, jaká spojení jsou vytvořena mezi dvěma nebo více datovými sadami, podle jakých parametrů a podmínek..png 1. „Zdroj připojení“ - označuje první datovou sadu, z... 9
Při vytváření sestav je vyžadováno, aby pro uživatele s omezenými právy byla sestava generována zcela bez kontroly práv! Zejména pokud je nakonfigurováno RLS Existuje několik způsobů, jak to provést: 1. Instalovat...

Nevím, kolik lidí se již setkalo s chybou při výpočtu počátečních a konečných zůstatků podle seskupení. Osobně jsem měl „štěstí“ více než jednou. Důvod, jak se mi podařilo zjistit, tkví v nesprávném nastavení datových polí ACS, jehož důležitost si mnoho začínajících (a ne tak začínajících) programátorů ještě plně neuvědomuje.

Když je datová sada ACS vytvořena automaticky na základě dotazu, problémy obvykle nevznikají, protože platforma sama správně vyplní nastavení pole na základě textu požadavku. Existují však situace, kdy nastavení datového pole není automaticky vyplněno (například používáte externí zdroj dat) a zdrojová data obsahují pohyby se zůstatky a obraty.

Pokud jste se s tímto problémem dosud nesetkali, pak pro lepší pochopení jeho podstaty navrhuji, abyste si jej sami reprodukovali pomocí univerzální zprávy (na základě metadat). Spustíme sestavu, vybereme libovolný neprázdný akumulační registr se zůstatky a obratem, zaškrtneme políčko „Podrobné záznamy“ v nastavení sestavy (), označíme některá seskupení a do výstupních polí přidáme Záznamník. Voila - počáteční a konečný zůstatek se sečtou pro každé seskupení. Výsledkem je sestava s absolutně nesprávnými čísly, kterou nelze uživatelům zobrazit.

Pro vyřešení tohoto problému je nutné správně vyplnit nastavení polí datové sady ACS - zejména pole "Role", které má klíčový význam.

ŘEŠENÍ interaktivní ( není vhodný pro univerzální zprávu):

Otevřete diagram rozložení dat pro vaši sestavu a podívejte se na nastavení pole datové sady.

Pro pole počátečních a konečných zůstatků pro každý zdroj musíte vyplnit roli: vyberte skupinu rolí „Zbytek“ a v ní zadejte hodnotu „Počáteční zůstatek“ nebo „Konečný zůstatek“. Tak ( ) to se provádí v konstruktoru ACS.

Podobně je potřeba přiřadit roli „Dimenze“ všem dimenzím v sadě dat.

Ke správnému fungování sestav to však nestačí. Pro správný výpočet zbytkových polí potřebujete znát periodu každého pohybu, abyste je umístili do správného chronologického pořadí. Pokud váš původní zdroj dat nemá pole období, musíte ho tam přidat. Pokud již pole období v sadě dat existuje, musí být specifikováno rolí „Období“ a odpovídajícím číslem období (více o číslování období se dočtete v nápovědě).

Takové nastavení datových polí ACS ve většině případů umožňuje dosáhnout správného výpočtu zůstatků seskupením kdy s výchozím nastavením jsou špatně vypočítány.

Softwarové ŘEŠENÍ (na příkladu Universal Metadata Report):

Nyní se podíváme na to, jak opravit stejnou chybu v Universal Metadata Report. Univerzální sestava se od většiny ostatních sestav liší tím, že schéma rozvržení dat se v ní generuje zcela programově, takže také musíte programově nakonfigurovat role pro datová pole ACS.

Pro role počáteční a koncové zůstatky pro každý zdroj Nejjednodušší je nevynalézat znovu kolo (vše už bylo napsáno před námi) a použít standardní postup Vyplňte DataSetFieldRemainder() z obecný modul StandardReports. Tam předáte pole datové sady a název zdroje jako parametry a v důsledku toho se v datové sadě vytvoří pole zbytku se správně vyplněnou rolí.

Podobně při vytváření polí datové sady pro dimenze jim musíte přiřadit roli Dimenze. Kód bude něco takového:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = True;

Výše popsané manipulace s poli zdrojů a dimenzí jsou nezbytné, ale k vyřešení problému nestačí - hlavním problémem univerzální zprávy je chybějící číslování období. Pole období jsou v sadě dat přítomna, ale jejich role nejsou vyplněny.

Pole období se do sestavy přidávají procedurou obecného modulu StandardReports.AddPeriodFieldsToDataSet(), která je volána z procedury objektového modulu AddDataSetFields(). Tento postup bohužel nepřiděluje čísla období.

Pole „Číslo řádku“ a „Registrátor“ nejsou navíc programově nikde do sestavy přidána. Přišlo mi to divné, protože... jsou přítomny v konečném souboru dat.

Jak se ukázalo, pole "Číslo linky" a "Registrátor"(Recorder) je přidán samotnou platformou automaticky při inicializaci nástroje pro tvorbu nastavení. Platforma navíc nevyplňuje role pro pole, která vytváří, a není možné je plnit programově, což vytváří problémy při další práci s nimi. Pokud ale tato pole vytvoříte „ručně“ a programově jim přiřadíte správné role, platforma se je již nepokouší znovu vytvořit.

Níže nabízím recept, který mi pomohl téměř úplně vyřešit tento problém platformy a Universal Metadata Report:

Zde je tento fragment kódu modulu objektu:

// Přidání polí období If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); endIf; je třeba nahradit následujícím: // Přidat pole období If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Vyplňte pole služby a zadejte období ručně, protože platforma je nevyplňuje Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrator", "Registrar"); Field.Role.PeriodNumber = 2; сч = 3; Pro každé FieldPeriod Ze seznamu období Cycle FieldPeriod.Value.Role.PeriodNumber = počet; If count > 3 Then FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; endIf; sch = sch+1; EndCycle; endIf;

Podařilo se mi najít jedno omezení spojené s tímto řešením. Pro správný výpočet začátku. a kon. zůstatků, je nutné, aby při použití jakýchkoliv detailů matričního dokumentu ve zprávě byla vybrána i samotná podatelna. Jinak univerzální zpráva po takových úpravách již nezpůsobuje alergie mezi uživateli.

AKTUALIZACE: V komentářích mi bylo řečeno, že na ITS disku kdysi vyšel článek na toto téma. Tento článek mě bohužel minul, ale při řešení problémů s univerzálním reportem mi mohl pomoci jen částečně. Bohužel zde také nejsou popsány problémy platformy s poli služeb ACS, jako je „Recorder“.

V každém případě doufám, že můj článek pomůže všem, kteří mají podobné problémy. Strávil jsem spoustu času hledáním tohoto řešení...

Další častou chybou při vytváření sestav o systémech řízení přístupu pro podnik 1C je, že počáteční a konečné zůstatky ve virtuálních tabulkách akumulačních registrů jsou vypočítány nesprávně. Vytvořme si například jednoduchou sestavu, která bude zobrazovat zůstatky a pohyby v evidenci Zboží na skladech. Jeho žádost bude vypadat takto:

Vytvoříme také jednoduchá nastavení variant:

Výsledkem je následující zpráva:

Máte dotaz nebo potřebujete pomoc od konzultanta?

Protože Nikde jsme neuváděli začátek a konec období, report by měl uvádět data od začátku údržby databáze. Ale v našem skladu a seskupení položek jsou počáteční stavy nenulové. Je snadné pochopit, že data se zobrazují nesprávně, protože... Na začátku údržby databáze by neměly být žádné zůstatky. I když samotná žádost je správná.

Faktem je, že ACS má svůj vlastní mechanismus pro výpočet zůstatků. Pro jeho správnou funkci je nutné jednoznačně určit umístění záznamníků na časové ose. V tomto případě je ve výběru přítomen pouze odkaz, takže systém rozložení toto nemůže udělat. Chcete-li se tomuto chování systému řízení přístupu vyhnout, musíte v požadavku vybrat pole PeriodSecond. V tomto případě systém správně vypočítá zůstatky:

Pamatujte, že pole s rolí „Období“ mají zaškrtávací políčko „Další“. A pokud je z nějakého důvodu odstraněn z pole PeriodSecond, zpráva se vrátí na nesprávnou verzi. Pro správný výpočet zůstatků musíte mít buď zaškrtnuté políčko "Další" v roli, nebo přítomnost pole ve vybraných polích sestavy na úrovni varianty.

Dobrý den, milí čtenáři tohoto blogu! Minule jsme se již dotkli tématu, které hovořilo o použití funkce. A dnes, v prvním ze série článků, se to dozvíme K čemu se používají role pole složení dat? a také zvážit příklady plnění těchto rolí.

Role pole ACS označuje co je toto pole. Každá role pole může obsahovat svou vlastní vlastnost. Má například číselnou hodnotu a obsahuje číslo období, pokud je pole tečka. Pokud je hodnota vlastnosti „Period“ 0 (nula), znamená to, že toto pole není období. Nebo vlastnost „Dimension“ – obsahuje označení, že pole je dimenze. Pokud je pole dimenze, pak se tato informace použije při výpočtu součtů pro pole zůstatku.

Pro každé pole ve schématu složení dat můžete zadat roli. Role ovlivnit správnost bilančních výpočtů. Zejména počáteční a konečná bilance podle nějaké tabulky. Pokud je v dotazu vybrána virtuální tabulka „Zůstatky a obraty“, pak se počáteční a konečné zůstatky počítají pomocí složitého algoritmu, zvláště pokud použijeme dodatečné rozpětí podle období.

Ale pokud to vše funguje správně v dotazech na základě sady výstupních polí, pak v kompozici dat jsou věci poněkud horší. Koneckonců, nevíme, jaká pole uživatel skutečně vybere. Vše bude záviset na nastavení jeho verze přehledu, které může kdykoli změnit. Systém skládání dat má proto vlastní mechanismus pro výpočet počátečních a konečných zůstatků pro určitý soubor dat a podle toho se k tomu používají role. Pojďme to otevřít a uvidíme, že můžete nastavit role pro každé pole.

Pojďme přidat sadu dat dotazu. K tomu potřebujeme aktivovat kořenový prvek „Query Builder“. Vraťme se k virtuální tabulce „Zůstatky a obraty“ registru akumulace. co vidíme?

Jak můžete vidět na obrázku výše, vidíme, že pro některá pole byla role obsazena. Stalo se to proto, že máme nastaven příznak Automatické dokončování. To ale není vždy možné, takže někdy musíte roli zadat ručně. Podívejme se na pár příkladů.

Předpokládejme, že v dotazu používáme například operátor dotazovacího jazyka „SELECT“. Popišme následující stav:

SELECTION WHEN Product RemainingRemainingsAndTurnover.Nomenclature = Value(Directory.Nomenclature.EmptyLink) THEN Value(Directory.Nomenclature.Shampoo) ELSE Product RemainingRemainingAndTurnover.Nomenclature END

Tento záznam znamená, že pokud položka odpovídá prázdnému odkazu (odkazujeme na adresář funkčních hodnot „Nomenklatura“, prázdný odkaz), bude vrácena hodnota předdefinovaného prvku. Předpokládejme, že v naší konfiguraci je takový předdefinovaný prvek a nazývá se „Šampón“. V opačném případě vracíme hodnotu samotné položky. Získáme následující:

Jak vidíte, role nebyla vyplněna pro pole „Nomenklatura“. Jak ale můžete vidět na obrázku, ve skutečnosti nemáme pro pole „Pole1“ zadanou roli a v tomto případě se zbytek nevypočítá správně.

Existují další příklady, kdy roli nelze přiřadit samostatně. Jedná se například o použití , to znamená, že určitá tabulka hodnot je dodávána jako vstup, řekněme, načtena z jiné databáze a z ní je třeba vypočítat zůstatky. V tomto případě si musíme role přidělit sami. Podíváme se, jak se to dělá v.

Na konci článku vám chci doporučit jeden zdarma od Anatolije Sotnikova. Jedná se o kurz od zkušeného programátora. Na samostatném základě vám ukáže, jak vytvářet sestavy v systému řízení přístupu. Stačí jen pozorně naslouchat a pamatovat si! Obdržíte odpovědi na následující otázky:
  • Jak vytvořit jednoduchou sestavu seznamu?
  • K čemu slouží sloupce Pole, Cesta a Název na kartě Pole?
  • Jaká jsou omezení pro pole rozložení?
  • Jak správně nakonfigurovat role?
  • Jaké jsou role pro pole rozložení?
  • Kde najdu kartu složení dat v dotazu?
  • Jak nakonfigurovat parametry v systému kontroly přístupu?
  • Stává se to ještě zajímavější...
Možná byste se neměli snažit sami brouzdat po internetu a hledat potřebné informace? Navíc je vše připraveno k použití. Jen začněte! Všechny podrobnosti o tom, co je v bezplatných videolekcích

Nevím, kolik lidí se již setkalo s chybou při výpočtu počátečních a konečných zůstatků podle seskupení. Osobně jsem měl „štěstí“ více než jednou. Důvod, jak se mi podařilo zjistit, tkví v nesprávném nastavení datových polí ACS, jehož důležitost si mnoho začínajících (a ne tak začínajících) programátorů ještě plně neuvědomuje.

Když je datová sada ACS vytvořena automaticky na základě dotazu, problémy obvykle nevznikají, protože platforma sama správně vyplní nastavení pole na základě textu požadavku. Existují však situace, kdy nastavení datového pole není automaticky vyplněno (například používáte externí zdroj dat) a zdrojová data obsahují pohyby se zůstatky a obraty.

Pokud jste se s tímto problémem dosud nesetkali, pak pro lepší pochopení jeho podstaty navrhuji, abyste si jej sami reprodukovali pomocí univerzální zprávy (na základě metadat). Spustíme sestavu, vybereme libovolný neprázdný akumulační registr se zůstatky a obratem, zaškrtneme políčko „Podrobné záznamy“ v nastavení sestavy (), označíme některá seskupení a do výstupních polí přidáme Záznamník. Voila - počáteční a konečný zůstatek se sečtou pro každé seskupení. Výsledkem je sestava s absolutně nesprávnými čísly, kterou nelze uživatelům zobrazit.

Pro vyřešení tohoto problému je nutné správně vyplnit nastavení polí datové sady ACS - zejména pole "Role", které má klíčový význam.

ŘEŠENÍ interaktivní ( není vhodný pro univerzální zprávu):

Otevřete diagram rozložení dat pro vaši sestavu a podívejte se na nastavení pole datové sady.

Pro pole počátečních a konečných zůstatků pro každý zdroj musíte vyplnit roli: vyberte skupinu rolí „Zbytek“ a v ní zadejte hodnotu „Počáteční zůstatek“ nebo „Konečný zůstatek“. Tak ( ) to se provádí v konstruktoru ACS.

Podobně je potřeba přiřadit roli „Dimenze“ všem dimenzím v sadě dat.

Ke správnému fungování sestav to však nestačí. Pro správný výpočet zbytkových polí potřebujete znát periodu každého pohybu, abyste je umístili do správného chronologického pořadí. Pokud váš původní zdroj dat nemá pole období, musíte ho tam přidat. Pokud již pole období v sadě dat existuje, musí být specifikováno rolí „Období“ a odpovídajícím číslem období (více o číslování období se dočtete v nápovědě).

Takové nastavení datových polí ACS ve většině případů umožňuje dosáhnout správného výpočtu zůstatků seskupením kdy s výchozím nastavením jsou špatně vypočítány.

Softwarové ŘEŠENÍ (na příkladu Universal Metadata Report):

Nyní se podíváme na to, jak opravit stejnou chybu v Universal Metadata Report. Univerzální sestava se od většiny ostatních sestav liší tím, že schéma rozvržení dat se v ní generuje zcela programově, takže také musíte programově nakonfigurovat role pro datová pole ACS.

Pro role počáteční a koncové zůstatky pro každý zdroj Nejjednodušší je nevynalézat znovu kolo (vše už bylo napsáno před námi) a použít standardní postup Vyplňte DataSetFieldRemainder() z obecný modul StandardReports. Tam předáte pole datové sady a název zdroje jako parametry a v důsledku toho se v datové sadě vytvoří pole zbytku se správně vyplněnou rolí.

Podobně při vytváření polí datové sady pro dimenze jim musíte přiřadit roli Dimenze. Kód bude něco takového:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = True;

Výše popsané manipulace s poli zdrojů a dimenzí jsou nezbytné, ale k vyřešení problému nestačí - hlavním problémem univerzální zprávy je chybějící číslování období. Pole období jsou v sadě dat přítomna, ale jejich role nejsou vyplněny.

Pole období se do sestavy přidávají procedurou obecného modulu StandardReports.AddPeriodFieldsToDataSet(), která je volána z procedury objektového modulu AddDataSetFields(). Tento postup bohužel nepřiděluje čísla období.

Pole „Číslo řádku“ a „Registrátor“ nejsou navíc programově nikde do sestavy přidána. Přišlo mi to divné, protože... jsou přítomny v konečném souboru dat.

Jak se ukázalo, pole "Číslo linky" a "Registrátor"(Recorder) je přidán samotnou platformou automaticky při inicializaci nástroje pro tvorbu nastavení. Platforma navíc nevyplňuje role pro pole, která vytváří, a není možné je plnit programově, což vytváří problémy při další práci s nimi. Pokud ale tato pole vytvoříte „ručně“ a programově jim přiřadíte správné role, platforma se je již nepokouší znovu vytvořit.

Níže nabízím recept, který mi pomohl téměř úplně vyřešit tento problém platformy a Universal Metadata Report:

Zde je tento fragment kódu modulu objektu:

// Přidání polí období If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); endIf; je třeba nahradit následujícím: // Přidat pole období If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Vyplňte pole služby a zadejte období ručně, protože platforma je nevyplňuje Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrator", "Registrar"); Field.Role.PeriodNumber = 2; сч = 3; Pro každé FieldPeriod Ze seznamu období Cycle FieldPeriod.Value.Role.PeriodNumber = počet; If count > 3 Then FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; endIf; sch = sch+1; EndCycle; endIf;

Podařilo se mi najít jedno omezení spojené s tímto řešením. Pro správný výpočet začátku. a kon. zůstatků, je nutné, aby při použití jakýchkoliv detailů matričního dokumentu ve zprávě byla vybrána i samotná podatelna. Jinak univerzální zpráva po takových úpravách již nezpůsobuje alergie mezi uživateli.

AKTUALIZACE: V komentářích mi bylo řečeno, že na ITS disku kdysi vyšel článek na toto téma. Tento článek mě bohužel minul, ale při řešení problémů s univerzálním reportem mi mohl pomoci jen částečně. Bohužel zde také nejsou popsány problémy platformy s poli služeb ACS, jako je „Recorder“.

V každém případě doufám, že můj článek pomůže všem, kteří mají podobné problémy. Strávil jsem spoustu času hledáním tohoto řešení...