Стандартен параметър & Период и проблеми при използване. Стандартен параметър & Период и проблеми при използване на баланси на виртуална маса 1s

Стандартен параметър & Период и проблеми при използване.  Стандартен параметър & Период и проблеми при използване на баланси на виртуална маса 1s
Стандартен параметър & Период и проблеми при използване. Стандартен параметър & Период и проблеми при използване на баланси на виртуална маса 1s

Платформата генерира виртуални таблици Салда, обороти и Салда и обороти; само за обороти по договаряне:
Виртуалните таблици не съществуват физически в базата данни, те се генерират на ниво платформа, за да се увеличи скоростта и удобството на достъпа на разработчика до данни.

Преди изграждането на виртуални таблици, данните могат да бъдат избрани чрез параметри. Наборът от параметри е различен за различните таблици. За таблицата с остатъци това е периодът на остатъците и произволно условие:

За Оборотната таблица периодът е разделен на два (начало и край) и е добавена настройка Периодичност:

За таблицата Салда и обороти се добавя настройката Метод на добавяне:

Нека разгледаме по-отблизо всички тези опции.

  • Параметър Период (начало на период, край на период)може да приема стойности от типа Дата:

както и типа Момент от време и Граница:

Важно е, че в случай на използване на типа дата или час (комбинации от дата и справка), втори път, посочени в полето за избор, не се вземат предвид при избора на данни! Вече е "извън" него, извадката се изгражда преди/след даден момент.

В случай на използване на типа Граница, този нюанс е конфигурируем, тъй като можете да посочите типа граница: показване на данни, включващи или изключващи определената секунда:

  • Параметър Периодичност- позволява ви да определите периода, към който ще бъдат донесени записите. Например, ако честотата е година, всички записи ще бъдат показани като 01 януари.

От особен интерес е опцията за автоматична периодичност, която ви позволява да пренасяте данни за няколко периода в една заявка. В конструктора на заявка всички опции за период стават достъпни, можете да изберете тези, от които се нуждаете:

Резултат:

  • Метод за подпълване на параметър- определя дали да изгради заявката само на база движения за периода (опция Движение), или да вземе предвид и начални салда(Вариант на движение и граници на периода). Отличен изход в следното: ако например в началото е имало салда по номенклатурата, но е нямало обороти за периода, то при Движения няма да попадне в извадката; в случай на движение и граница на периоди - ще удари с нулев оборот
  • Параметър Условие- позволява ви да наложите произволно условие върху измерването на регистъра:

Въпрос 07.46 от изпит 1C: Професионална платформа. При дефиниране на опцията за периодичност "Авто" във виртуална таблица "Салда и обороти":

  1. системата автоматично ще избере честотата на получаване на обороти въз основа на правилото: така че резултатът да е най-малко 3 стойности на периоди, но не повече от 12
  2. системата автоматично ще избере честотата на получаване на обороти въз основа на правилото: така че резултатът да е най-малко 5 стойности на периоди, но не повече от 10
  3. в полетата за избор на заявка разработчикът ще може да избира периодични полета с различна честота

Верният отговор е третият, анализът по-горе.

Регистри за натрупванев системата 1C:Enterprise са разделени на два вида: регистри за натрупване остатъции регистри за натрупване революции.

Типът регистър се избира при създаването му в конфигуратора

Както подсказва името, някои са предназначени да получават салда за определена дата, а вторите - да получават оборот за избран период. В зависимост от вида на регистъра за натрупване платформата 1C:Enterprise генерира различен набор от виртуални таблици. В тази статия ще разгледаме работата с виртуални таблици на регистрите за натрупване. За да направим това, ще създадем регистър за натрупване на баланси - Стоки Оставати регистъра за натрупване на оборот - Стокови обороти.

Сега нека да разгледаме какви виртуални таблици предоставя платформата за всеки от тези регистри.

Оборотен регистър

За по-голяма яснота нека отворим и видим кои таблици са налични за регистъра Стокови обороти. Това е таблицата на самия регистър − Стокови обороти, който съществува физически в базата данни, и един виртуална масаСтокообороти.Обороти

Всичко е ясно със стандартната таблица. Нека разгледаме по-отблизо виртуалната реалност.

Обороти на виртуална маса

Тази таблица ви позволява да получите оборота на ресурсите в контекста на измерванията. В нашия случай имаме две измерения: НаличностИ Продукт. И един ресурс Количество

Нека в нашия регистър има следните записи

Нека се върнем към създателя на заявки и да започнем просто с избиране от таблицата Стокообороти.Оборотивсички полета

Съответно заявката ще изглежда така:

ИЗБЕРЕТЕ СтокиОбороти.Склад, СтокиОбороти.Продукт, СтокиОбороти.КоличествоОбороти ОТ РегистърНатрупване.СтокиОбороти.Обороти(,) AS СтокиОборотиОбороти

Резултатът от заявката изглежда така:

Тоест получихме оборот в контекста на стоки и складове за цялото време. Да предположим, че не се интересуваме от складове и искаме да получим оборот само в контекста на стоките.

За да направите това, изключете измерението от заявката Наличност

ИЗБЕРЕТЕ СтокиОбороти.Продукт, СтокиОбороти.КоличествоОбороти ОТ RegisterAccumulation.СтокиОбороти.Обороти(,) AS СтокиОборотиОбороти

и в резултат ще имаме само два реда

Но като правило не се изисква да се получават обороти за цялото време на съществуване на регистъра. По принцип те са необходими за определен период: месец, тримесечие, година и др. Освен това обикновено се нуждаете от селекции по размери (продукт, склад). Това се постига с помощта на параметри на виртуална таблица. Удобно е да попълните параметрите от конструктора. С бутон Опции за виртуална масаотваря се диалогов прозорец, в който можете да регистрирате всичко, от което се нуждаем:

След това първоначалната ни заявка ще приеме следната форма

ИЗБЕРЕТЕ СтокиОбороти.Склад, СтокиОбороти.Продукт, СтокиОбороти.КоличествоОборот ОТ Регистър за натрупване.СтокиОбороти.Обороти(&Начало на периода, &Край на периода, Склад = &Склад) AS СтокиОборотиОбороти

Както можете да видите, разликата е, че параметрите се появяват в скоби след името на виртуалната таблица, което трябва да се попълни преди изпълнение на заявката.

За тези, които тепърва започват да работят с виртуални таблици, често е изкушаващо да зададат селекцията по обичайния начин, вместо да използват параметри:

FROM Регистър за натрупване.СтокиОбороти.Обороти(,) AS СтокиОборотиОбороти WHERE СтокиОборотиОбороти.Склад = &Склад

При попълване на параметрите сме пропуснали Периодичност. Нека отворим списъка и да изберем от масата възможни опции месец. Ще премахнем всички останали параметри, за да не се бъркаме.

След това наблюдаваме, че в полетата на таблицата се появи поле Период.

Добавяйки го към избраните полета, получаваме следния текст на заявката:

ИЗБЕРЕТЕ СтокиОбороти.Период, СтокиОбороти.Склад, СтокиОбороти.Продукт, СтокиОбороти.КоличествоОбороти ОТ Регистър за натрупване.СтокиОбороти.Обороти(, Месец,) КАТО СтокиОборотиОбороти

Изпълняваме заявката:

Така в рамките на избрания интервал от време можем да разделим оборота на по-малки интервали в съответствие с избраната честота.

Регистър за натрупване на баланс

Точно както при обратния регистър, нека да видим в конструктора на заявки кои виртуални таблици са налични за регистъра за натрупване на баланс

Както можете да видите, три виртуални таблици са налични за регистъра за натрупване на салдо: Обороти, останки, Остатъци и обороти. Нека разгледаме всеки от тях поотделно.

Обороти на виртуална маса

Въпреки че типът регистър е останки, все още можем да получаваме обороти от него. Освен това имаме два допълнителни ресурса тук: идвамИ Консумация

Напомням, че когато се прави запис в регистъра на балансите, се посочва вида на движението на натрупването (приход или разход), докато за оборотния регистър видът на движението не се посочва. Следователно тук имаме допълнителен бонус под формата на възможност да получим не само оборота за периода като цяло, но и приходи с разходи поотделно. Но разбира се, ако в метаданните има регистър на оборота с подобен набор от измервания, тогава е по-добре да го използвате, за да получите обороти. Като цяло работата с тази виртуална таблица е подобна на работата с виртуална маса Оборотиоборотен регистър, разгледан по-горе.

Баланси на виртуална маса

Тази таблица се използва за получаване на оставащите ресурси по отношение на измеренията. В параметрите на таблицата можем да посочим датата, за която получаваме салдата и да зададем филтрите:

Нека разгледаме малък пример. Имаме следните записи в регистъра:

Избираме всички налични полета и задаваме края на юни като дата за получаване на балансите. Няма да правим селекция чрез измервания. Тогава текстът на заявката ще изглежда така:

ИЗБЕРЕТЕ GoodsRemainsRemains.Warehouse, GoodsRemainsRemains.Product, GoodsRemainsRemains.QuantityBalance FROM Accumulation Register.ProductsRemains.Remains(&RemainsDate,) AS GoodsRemainsRemains

И след като го изпълним, получаваме следния резултат

Виртуална маса

Тази таблица комбинира двете разгледани по-горе и ви позволява да получите оборота за избрания период от време, както и салда в началото и края на периода. Можете също да зададете избор.

Използването на тази таблица може да бъде оправдано, когато е необходимо едновременно да се получат както обороти, така и салда в началото и края на периода в един отчет. В други случаи не трябва да се злоупотребява с употребата му.

Статията описва физическата реализация на виртуалната таблица на конфигурационните остатъци, работеща в режим на работа клиент-сървър, използвайки MS DBMS като пример. SQL сървър.

Приложимост

Статията се занимава с платформата 1C:Enterprise версия 8.3.5.1383. IN сегашна версияплатформи, възможни са някои промени в текста, описан в материала, T-SQL заявкаизпълнява се от страна на сървъра на СУБД.

Устройството на виртуалната таблица на остатъците

Нека разгледаме в какъв вид заявка към СУБД се трансформира заявката с помощта на виртуалната таблица на балансите на регистъра за натрупване. Например ще бъде разгледан следният текст на заявка:

ИЗБИРАМ
Стокови запасиОстатъци.Стоки,
Стокови запасиОстатъци. Склад,
Стокови запасиОстатъци.КоличествоОстатъци
ОТ
Набирателен регистър.Стокови запаси.Балда(&Дата, Склад = &Склад) КАК
CommodityStocksRemains

Първо с метода на глобалния контекст GetDatabaseStorageStructure()вземете списък с таблици на база данни, които съхраняват данните от регистъра за натрупване "Стокови запаси":

Съставът на полетата на основната таблица на регистъра за натрупване и таблицата с общите суми е даден по-долу:

Съхранението на суми за този регистър е конфигурирано в режим 1C:Enterprise 8, както следва:

Попълнете параметрите във въпросната заявка, както следва:


Платформата преобразува текста на заявката в следната заявка, която ще бъде изпълнена на СУБД сървъра:

ИЗБЕРЕТЕ
Q_000_T_001.Fld82,
Q_000_T_001.Fld83,
Q_000_T_001.Fld84Баланс
ОТ
(ИЗБЕРЕТЕ Fld82,
fld83,

ОТ
(ИЗБЕРЕТЕ Fld82,
fld83,
SUM (Fld84 ) AS Fld84Balance
ОТ AccumRgT85
WHERE Период = DATETIME (3999, 11, 1)
И ((Fld83 = ))
И (Fld84<>0 ) И (Fld84<> 0 )
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<> 0
СЪЮЗ ВСИЧКИ
ИЗБЕРЕТЕ Fld82,
fld83,
SUM (CASE WHEN RecordKind = 0 THEN - Fld84 ELSE Fld84 END ) AS Fld84Balance
ОТ AccumRg81
WHERE Период >= DATETIME (2012, 9, 1)
И Точка< DATETIME (3999 , 11 , 1 )
И активен
И ((Fld83 = 9:))
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<>0) Т
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<>0) Q_000_T_001

Нека анализираме получената заявка по-подробно.

Първо, като се използва първата заявка, включена в съединението, данните се избират от получената таблица AccumRgT85. Сумите се получават на датата на съхраняване на текущите суми (11/01/3999), на полето Склад се налага допълнително условие (тъй като такова условие е използвано в параметрите на виртуалната таблица). Допълнително се прави проверка за липса на редове с нулев остатък в резултата.

Моля, обърнете внимание, че групирането се извършва според измеренията, избрани в текста на заявката. Ето защо текстът на езика за заявки на 1C:Enterprise не изисква допълнително групиране по размери.

Втората заявка за присъединяване използва таблицата за движение на регистъра AccumRg81. В зависимост от вида на движението (ако RecordKind е равно на 0, това е Inflow, в противен случай - Outflow), в израза се поставя знак. Платформата избира данни за периода от датата, посочена като параметър на виртуална таблица, до датата на съхраняване на текущите суми (01.11.3999).

Освен това се избират само активни записи, полето Склад трябва да е равно на зададената стойност. Както при първата заявка за присъединяване, това също групира по избраните измерения и отхвърля записи с нулеви стойности на ресурса.

Ако се използва СУБД на MS SQL Server и е зададено отместване на датата 2000 за базата данни, тогава всички дати ще бъдат съхранени с указаното отместване, т.е. вместо 11/01/3999 ще видите 11/01/5999.

Ако деактивирате текущите общи суми за регистъра за натрупване, платформата първо ще получи последните общи суми, изчислени на дата, по-ранна от посочената в параметъра Period на виртуалната таблица.

След това по подобен начин тези данни ще бъдат допълнени от таблицата с движения, но само за периода от датата на последните суми до периода на виртуалната таблица.

ИЗБЕРЕТЕ
Q_000_T_001.Fld82,
Q_000_T_001.Fld83,
Q_000_T_001.Fld84Баланс
ОТ
(ИЗБЕРЕТЕ Fld82,
fld83,
SUM (Fld84Balance) КАТО Fld84Balance
ОТ
(ИЗБЕРЕТЕ Fld82,
fld83,
SUM (Fld84 ) AS Fld84Balance
ОТ AccumRgT85
WHERE Период = DATETIME(2012, 4, 1)
И ((Fld83 = 9:))
И (Fld84<> 0 )
И (Fld84<> 0 )
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<> 0
СЪЮЗ ВСИЧКИ
ИЗБЕРЕТЕ Fld82,
fld83,
SUM (CASE WHEN RecordKind = 0 THEN Fld84 ELSE - Fld84 END ) AS Fld84Balance
ОТ AccumRg81
WHERE Период >= DATETIME (2012, 4, 1)
И Точка< DATETIME (2012 , 9 , 1 )
И активен
И ((Fld83 = 9:))
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<>0) Т
ГРУПИРАНЕ ПО Fld82, Fld83
КАТО Fld84Balance<>0) Q_000_T_001

Забележете следното условие в тялото на заявката.

При организиране на извадки в реални проблеми в преобладаващата част от случаите изборът на данни се организира в съответствие с определени критерии.

В случай, че изборът е направен от истинска таблица, не възникват трудности. Данните се обработват абсолютно тривиално:

В случай, че източникът в заявката е виртуална таблица, ситуацията става малко по-сложна.

Езикът за заявки ви позволява да наложите условие върху селекция от виртуални таблици по два начина: в клаузата WHERE и чрез използване на параметри на виртуална таблица. И двата начина ще доведат до един и същ резултат (освен в някои специфични случаи), но далеч не са еквивалентни.

Вече знаем, че виртуалните таблици се наричат ​​виртуални, защото всъщност не са в базата данни. Те се формират само в момента, в който се отправи заявка към тях. Въпреки това за нас (т.е. тези, които съставят заявката) е удобно да считаме виртуалните таблици точно като реални. Какво ще се случи в системата 1C Enterprise 8, когато заявката, която сме съставили, все още се отнася до виртуалната таблица?

В първата стъпка системата ще изгради виртуална таблица. На втората стъпка ще бъдат избрани записи от получената таблица, които отговарят на условието, посочено в клаузата WHERE:


Ясно се вижда, че не всички записи от виртуалната таблица (и съответно от базата данни) ще попаднат в крайната селекция, а само тези, които удовлетворяват дадено състояние. А останалите записи просто ще бъдат изключени от резултата.

Така системата ще върши не просто безполезна, а двойно безполезна работа! Първо ще бъдат изразходвани ресурси за изграждане на виртуална таблица въз основа на допълнителни данни (на фигурата те са маркирани като „области с данни A и B“), а след това ще бъде извършена повече работа за филтриране на тези данни от крайния резултат.

Възможно ли е веднага, на етапа на изграждане на виртуална таблица, да откажете използването на ненужни данни? Оказва се, че можете. Ето за какво служат настройките на виртуалната маса:


Като параметризираме виртуалната таблица, ние незабавно ограничаваме количеството данни, които ще бъдат обработени от заявката.

Каква е разликата между стойностите на параметъра на виртуалната таблица „Метод на добавяне“?
Когато ComplementMethod е зададен на "движения", ще бъдат върнати само тези периоди, в които е имало движения. Когато е зададено „Движения И Ограничения на периода“, тогава към горните движения ще бъдат добавени 2 записа: движения в началото и края на периода, посочен в параметрите на BT. Полето "Регистратор" ще бъде празно за тези 2 записа.