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

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

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

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

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

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

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

както и типовете Moment in Time и Boundary:

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

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

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

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

Резултат:

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

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

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

Правилният отговор е третият анализ по-горе.

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

Приложимост

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

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

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

ИЗБИРАМ
CommodityInventoryRemains.Product,
Стокови запасиОстатъци. Склад,
CommodityInventoryRemaining.QuantityRemaining
ОТ
Регистрирайте Натрупвания.Запаси.Остатъци(&Дата, Склад = &Склад) КАК
Остатъци от стокови запаси

Първо, използвайки метода на глобалния контекст 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. Сумите се получават на датата на съхранение на текущите суми (01.11.3999), към полето Склад се прилага допълнително условие (тъй като такова условие е използвано в параметрите на виртуалната таблица). Освен това се извършва проверка, за да се гарантира, че резултатът не съдържа редове с нулеви остатъци.

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

Втората заявка за присъединяване използва таблицата за движение на регистъра AccumRg81. В зависимост от вида на движението (ако RecordKind е 0, тогава е Income, в противен случай е Expense), в израза се вмъква знак. Платформата избира данни за периода от датата, посочена като параметър на виртуалната таблица, до датата на съхраняване на текущите суми (11/01/3999).

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

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

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

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

ИЗБЕРЕТЕ
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

Моля, обърнете внимание на следното условие в тялото на заявката.

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

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

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

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

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

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

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

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

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

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

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

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

SELECT ProductsTurnoverTurnover.Warehouse, ProductsTurnoverTurnover.Product, ProductsTurnoverTurnover.QuantityTurnover FROM RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

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

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

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

SELECT ProductsTurnoverTurnover.Product, ProductTurnoverTurnover.QuantityTurnover FROM RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

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

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

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

ИЗБЕРЕТЕ GoodsTurnoverTurnover.Warehouse, GoodsTurnoverTurnover.Product, GoodsTurnoverTurnover.QuantityTurnover FROM RegisterAccumulation.GoodsTurnover.Turnover(&Начало на периода, &Край на периода, Склад = &Склад) AS СтокиОборот

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

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

FROM RegisterAccumulations.ProductsTurnover.Turnover(,) HOW ProductsTurnoverTurnover WHERE ProductsTurnoverTurnover.Warehouse = &Warehouse

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

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

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

ИЗБЕРЕТЕ ProductsTurnoverTurnover.Period, ProductsTurnoverTurnover.Warehouse, ProductsTurnoverTurnover.Product, ProductsTurnoverTurnover.QuantityTurnover FROM RegisterAccumulation.ProductsTurnover.Turnover(, Month,) AS ProductsTurnoverTurnover

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

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

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

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

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

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

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

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

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

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

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

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

ИЗБЕРЕТЕ ProductsRemainingsRemainings.Warehouse, ProductsRemainingsRemainings.Product, ProductsRemainingsRemainings.QuantityRemaining FROM RegisterAccumulations.ProductsRemainings.Remainings(&DateRemainings,) AS ProductsRemainingRemainings

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

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

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

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

Езикът за заявки в 1C 8 е опростен аналог на добре познатия „структуриран език за програмиране“ (както по-често се нарича SQL). Но в 1C се използва само за четене на данни; обектен модел на данни се използва за промяна на данни.

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

Примерна заявка:

ИЗБИРАМ
Банки. Име,
Банки.CorrAccount
ОТ
Справочник.Банки КАК Банки

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

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

Описание на конструкциите на езика за заявки

Структура на заявката

За да получите данни, е достатъчно да използвате конструкциите "SELECT" и "FROM". Най-простата заявка изглежда така:

ИЗБЕРЕТЕ * ОТ Директории.Номенклатура

Където “*” означава избиране на всички полета от таблицата, а Directories.Nomenclature – името на таблицата в базата данни.

Нека да разгледаме по-сложен и общ пример:

ИЗБИРАМ
<ИмяПоля1>КАК<ПредставлениеПоля1>,
Сума(<ИмяПоля2>) КАК<ПредставлениеПоля2>
ОТ
<ИмяТаблицы1>КАК<ПредставлениеТаблицы1>
<ТипСоединения>СЪЕДИНЕНИЕ<ИмяТаблицы2>КАК<ПредставлениеТаблицы2>
ОТ<УсловиеСоединениеТаблиц>

КЪДЕТО
<УсловиеОтбораДанных>

ГРУПИРАЙ ПО
<ИмяПоля1>

СОРТИРАНЕ ПО
<ИмяПоля1>

РЕЗУЛТАТИ
<ИмяПоля2>
ОТ
<ИмяПоля1>

В тази заявка избираме данните от полетата „FieldName1“ и „FieldName1“ от таблиците „TableName1“ и „TableName“, присвояваме синоними на полетата с помощта на оператора „HOW“ и ги свързваме с помощта на определено условие „TableConnectionCondition ”.

От получените данни избираме само данни, които отговарят на условието от “WHERE” “Условие за избор на данни”. След това групираме заявката по полето “Field Name1”, докато сумираме “Field Name2”. „Име на поле1“ и последното поле „Име на поле2“.

Последната стъпка е да сортирате заявката с помощта на конструкцията ORDER BY.

Общи проекти

Нека да разгледаме общите структури на езика за заявки 1C 8.2.

ПЪРВОн

Използвайки този оператор, можете да получите n броя на първите записи. Редът на записите се определя от реда в заявката.

ИЗБЕРЕТЕ ПЪРВИТЕ 100
Банки. Име,
Банки. Код AS BIC
ОТ
Справочник.Банки КАК Банки
СОРТИРАНЕ ПО
Банки. Име

Заявката ще получи първите 100 записа от директорията „Банки“, сортирани по азбучен ред.

ПОЗВОЛЕН

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

Ако потребител се опита да използва заявка за четене на записи, които са недостъпни за него, той ще получи съобщение за грешка. За да избегнете това, трябва да използвате конструкцията „ALLOWED“, т.е. заявката ще чете само записи, които са разрешени за нея.

ИЗБЕРЕТЕ РАЗРЕШЕНО
Хранилище на допълнителна информация
ОТ
Директория. Хранилище на допълнителна информация

РАЗЛИЧНИ

Използването на „DIFFERENT“ ще предотврати въвеждането на дублирани редове в резултата от заявката на 1C. Дублирането означава, че всички полета на заявката съвпадат.

ИЗБЕРЕТЕ ПЪРВИТЕ 100
Банки. Име,
Банки. Код AS BIC
ОТ
Справочник.Банки КАК Банки

EmptyTable

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

Пример от помощта на 1C 8:

ИЗБЕРЕТЕ Връзка.Номер, ПРАЗНА ТАБЛИЦА.(№, артикул, количество) КАТО състав
ОТ Документ. Разходна фактура
КОМБИНИРАЙТЕ ВСИЧКО
ИЗБЕРЕТЕ Link.Number, Contents.(LineNumber, Product, Quantity)
ОТ Документ.Фактура Документ.Фактура.Състав.*

ISNULL

Много полезна функция, която ви позволява да избегнете много грешки. YesNULL() ви позволява да замените NULL стойността с желаната. Много често се използва при проверка за наличие на стойност в обединени таблици, например:

ИЗБИРАМ
Връзка към номенклатурата,
IsNULL(Item Remaining.QuantityRemaining,0) AS QuantityRemaining
ОТ


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

ISNULL(InvoiceReceived.Date, InvoiceIssued.Date)

HOW е оператор, който ни позволява да присвоим име (синоним) на таблица или поле. Видяхме пример за използване по-горе.

Тези конструкции са много сходни - те ви позволяват да получите низово представяне на желаната стойност. Единствената разлика е, че REPRESENTATION преобразува всякакви стойности в тип низ, докато REPRESENTATIONREF преобразува само референтни стойности. РЕФЕРЕНТНО ПРЕДСТАВЯНЕ се препоръчва да се използва в заявки за система за композиране на данни за оптимизация, освен ако, разбира се, полето за референтни данни не е планирано да се използва в селекции.

ИЗБИРАМ
View(Link), //низ, например „Авансов отчет № 123 от 10.10.2015 г.
View(DeletionMark) AS DeleteMarkText, //низ, „Да“ или „Не“
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, True или False
ОТ
Документ. Предварителен отчет

ЕКСПРЕСНО

Express ви позволява да конвертирате стойности на полета в желания тип данни. Можете да конвертирате стойност или в примитивен тип, или в референтен тип.

Express за референтен тип се използва за ограничаване на исканите типове данни в полета от сложен тип, често използвани за оптимизиране на производителността на системата. Пример:

EXPRESS(TableCost.Subconto1 AS Directory.Cost Items).Тип на ActivityForTaxAccountingCosts

За примитивни типове тази функция често се използва за ограничаване на броя на знаците в полета с неограничена дължина (такива полета не могат да се сравняват). За да избегнете грешката " Невалидни параметри в операцията за сравнение. Не могат да се сравняват полета
неограничена дължина и полета от несъвместими типове
", трябва да изразите такива полета, както следва:

EXPRESS(Коментар AS ред(150))

ДАТА НА РАЗЛИКА

Вземете безплатно 267 видео урока за 1C:

Пример за използване на IS NULL в 1C заявка:

ИЗБИРАМ ОТ
Реф
ЛЯВА ВРЪЗКА RegisterAccumulations.ProductsInWarehouses.Remaining AS Product Remaining
Софтуерна номенклатураRef.Link = Продадени стокиCommitteesRemains.Номенклатура
WHERE NOT Remaining Products QuantityRemaining Е NULL

Типът данни в заявка може да се определи чрез използване на функциите TYPE() и VALUETYPE() или чрез използване на логическия оператор REFERENCE. Двете функции са сходни.

Предварително зададени стойности

В допълнение към използването на предадени параметри в заявки на езика за заявки 1C, можете да използвате предварително зададени стойности или . Например, трансфери, предварително дефинирани директории, сметкоплани и т.н. За това се използва конструкцията „Value()“.

Пример за употреба:

WHERE Номенклатура.Тип номенклатура = Стойност(Директория.Видове номенклатура.Продукт)

WHERE Контрагенти.Тип информация за контакт = Стойност(Изброяване.Типове информация за контакт.Телефон)

WHERE Салда по сметки. Счетоводна сметка = Стойност (Сметкоплан. Печалба. Печалба Загуба)

Връзки

Има 4 вида връзки: НАЛЯВО, ДЯСНО, ПЪЛЕН, ВЪТРЕШЕН.

ЛЯВО и ДЯСНО ВЪРЗВАНЕ

Съединенията се използват за свързване на две таблици въз основа на конкретно условие. Характеристика, когато ЛЯВО ПРИСЪЕДИНЯВАНЕе, че вземаме първата посочена таблица в нейната цялост и условно свързваме втората таблица. Полетата на втората таблица, които не могат да бъдат обвързани с условие, се попълват със стойността НУЛА.

Например:

Той ще върне цялата таблица с контрагенти и ще попълни полето „Банка“ само там, където ще бъде изпълнено условието „Име на контрагенти = Име на банки“. Ако условието не е изпълнено, полето Банка ще бъде настроено на НУЛА.

RIGHT JOIN на езика 1Cабсолютно подобни ЛЯВА връзка, с изключение на една разлика - в ПРАВО НА СВЪРЗВАНЕ„Основната“ маса е втората, а не първата.

ПЪЛНА СВЪРЗВАНЕ

ПЪЛНА СВЪРЗВАНЕсе различава от ляво и дясно по това, че показва всички записи от две таблици и свързва само тези, които може да свърже по условие.

Например:

ОТ

ПЪЛНА СВЪРЗВАНЕ
Справочник.Банки КАК Банки

ОТ

Езикът за заявки ще върне и двете таблици напълно само ако е изпълнено условието за обединяване на записите. За разлика от ляво/дясно свързване, възможно е NULL да се появи в две полета.

ВЪТРЕШНО СЪЕДИНЕНИЕ

ВЪТРЕШНО СЪЕДИНЕНИЕсе различава от пълния по това, че показва само онези записи, които могат да бъдат свързани според дадено условие.

Например:

ОТ
Указател Контрагенти AS Клиенти

ВЪТРЕШНО СЪЕДИНЕНИЕ
Справочник.Банки КАК Банки

ОТ
Клиенти.Име = Банки.Име

Тази заявка ще върне само редове, в които банката и контрагентът имат едно и също име.

Асоциации

Конструкциите JOIN и JOIN ALL комбинират два резултата в един. Тези. резултатът от извършването на две ще бъде „слят“ в един, общ.

Тоест системата работи точно както обикновените, само за временна маса.

Как да използвате INDEX BY

Има обаче един момент, който трябва да се вземе предвид. Изграждането на индекс върху временна таблица също отнема време за завършване. Ето защо е препоръчително да използвате конструкцията „ “ само ако е известно със сигурност, че във временната таблица ще има повече от 1-2 записа. В противен случай ефектът може да е обратен - производителността на индексираните полета не компенсира времето, необходимо за изграждане на индекса.

ИЗБИРАМ
Валутни курсове Последно напречно сечение Валута AS Валута,
Валутни курсове Последно напречно сечение.
PUT Валутни курсове
ОТ
Информационен регистър.Валутни курсове.Последен отрязък(&период,) AS Валутни курсовеПоследен отрязък
ИНДЕКС ПО
Валута
;
ИЗБИРАМ
ЦениНоменклатура.Номенклатура,
ЦениНоменклатури.Цена,
Цени Номенклатури. Валута,
Валутни курсове
ОТ
Информационен регистър. Номенклатурни цени. Последен отрязък (&период,
Номенклатура B (&номенклатура) И PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN Валутни курсове КАТО Валутни курсове
Номенклатури на цените на софтуера.Валута = Валутни курсове.Валута

Групиране

Езикът за заявки 1C ви позволява да използвате специални агрегатни функции, когато групирате резултатите от заявките. Групирането може да се използва и без агрегатни функции за „елиминиране“ на дубликати.

Съществуват следните функции:

Сума, Количество, Брой различни, Максимум, Минимум, Средно.

Пример #1:

ИЗБИРАМ
Продажби на стоки и услуги Номенклатура на стоките.
SUM(Продажби на СтокиУслугиСтоки.Количество) КАТО Количество,
SUM(Продажби на СтокиУслугиСтоки.Сума) КАТО Сума
ОТ

ГРУПИРАЙ ПО
Продажби на стоки и услуги Номенклатура на стоките

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

Пример №2

ИЗБИРАМ
Банки.Код,
QUANTITY(DIFFERENT Banks.Link) КАТО брой дубликати
ОТ
Справочник.Банки КАК Банки
ГРУПИРАЙ ПО
Банки.Код

Този пример ще покаже списък с BIC кодове в директорията „Банки“ и ще покаже колко дубликати съществуват за всеки от тях.

Резултати

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

Един от най-популярните начини за използване на резултатите на практика е груповото отписване на стоки.

ИЗБИРАМ




ОТ
Документ. Продажба на стоки и услуги. Стоки КАК да се продават стоки и услуги
СОРТИРАНЕ ПО

РЕЗУЛТАТИ
SUM (Количество),
SUM(сума)
ОТ
Номенклатура

Резултатът от заявката ще бъде следната йерархия:

Общи резултати

Ако трябва да получите общи суми за всички „общи суми“, използвайте оператора „ОБЩИ“.

ИЗБИРАМ
Продажби на стоки и услуги Стоки Номенклатура AS Номенклатура,.
Продажби на стоки и услуги Стоки Връзка AS Документ,
Продажби на стоки и услуги Стоки Количество КАТО Количество,.
Продажби на стоки и услуги Стоки Сума КАТО Сума
ОТ
Документ. Продажба на стоки и услуги. Стоки КАК да се продават стоки и услуги
СОРТИРАНЕ ПО
Дата на продажба на стоки и услуги
РЕЗУЛТАТИ
SUM (Количество),
SUM(сума)
ОТ
СА ЧЕСТИ,
Номенклатура

В резултат на изпълнение на заявката получаваме следния резултат:

В което 1 ниво на групиране е агрегирането на всички необходими полета.

Аранжиране

Операторът ORDER BY се използва за сортиране на резултата от заявка.

Сортирането за примитивни типове (низ, число, булев) следва обичайните правила. За полетата от референтен тип сортирането се извършва по вътрешното представяне на връзката (уникалния идентификатор), а не по код или по референтно представяне.

ИЗБИРАМ

ОТ
Справочник.Номенклатура AS Номенклатура
СОРТИРАНЕ ПО
Име

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

Автоматична поръчка

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

Ако трябва да покажете записите на таблицата в постоянен ред, трябва да използвате конструкцията Auto-Order.

ИЗБИРАМ
Номенклатура. Име КАТО Име
ОТ
Справочник.Номенклатура AS Номенклатура
АВТОМАТИЧНА ПОРЪЧКА

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

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

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

  • разрез на първия;
  • изрязване на последното.
  • остатъци;
  • революции;
  • салда и оборот.
  • движения от субконто;
  • революции;
  • скорост Dt Kt;
  • остатъци;
  • салда и оборот
  • подконто.
  • база;
  • графични данни;
  • действителен срок на валидност.

За разработчика на решение данните се вземат от една (виртуална) таблица, но всъщност платформата 1C ги взема от много таблици, преобразувайки ги в необходимата форма.

ИЗБИРАМ
Продукти в складови остатъци и номенклатура.
ProductsInWarehousesRemainingAndTurnover.QuantityInitialRemaining,
ProductsInWarehousesRemainsAndTurnover.QuantityTurnover,
СтокиВСкладовеОстатъциИОборот.КоличествоВходящи,
СтокиВСкладовеОстатъциИОборот.КоличествоПотребление,
ProductsInWarehousesRemainingsAndTurnover.QuantityFinalRemaining
ОТ
RegisterAccumulations.GoodsInWarehouses.RemainsAndTurnover AS СтокиВСкладовеRemainsAndTurnover

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

Опции за виртуална маса

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

За такива таблици се счита за неправилно да се използва селекция в конструкцията „WHERE“. В допълнение към факта, че заявката става неоптимална, е възможно да получите неверни данни.

Пример за използване на тези параметри:

Регистър на натрупванията в складовете и оборотите (& Начало на периода, & Край на периода, Движения и граници на периода, Номенклатура = & Задължителна номенклатура).

Алгоритъм за виртуални маси

Например най-използваната виртуална таблица от типа „Остатъци” съхранява данни от две физически таблици – салда и движения.

Когато използвате виртуална таблица, системата извършва следните манипулации:

  1. Получаваме най-близката изчислена стойност по отношение на датата и измерванията в таблицата с общите суми.
  2. „Добавяме“ сумата от таблицата за движение към сумата от таблицата с общите суми.


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

Използване на Query Builder

Създател на заявки– инструмент, вграден в системата 1C Enterprise, който значително улеснява разработването на заявки към бази данни.

Създателят на заявки има доста прост, интуитивен интерфейс. Въпреки това, нека разгледаме по-подробно използването на конструктора на заявки.

Текстовият конструктор на заявката се стартира от контекстното меню (десен бутон на мишката) на желаното място в програмния код.

Описание на конструктора на заявки 1C

Нека разгледаме всеки раздел на дизайнера по-подробно. Изключение прави разделът Builder, който е тема за друга дискусия.

Раздел Таблици и полета

Този раздел определя източника на данни и полетата, които трябва да бъдат показани в отчета. По същество тук са описани конструкциите SELECT.. FROM.

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

В контекстното меню на виртуални таблици можете да зададете параметри на виртуална таблица:

Раздел Връзки

Разделът се използва за описание на връзките на няколко таблици и създава конструкции с думата CONNECTION.

Раздел Групиране

В този раздел системата ви позволява да групирате и обобщавате задължителните полета на резултата от таблицата. Описва използването на конструкциите ГРУПИРАНЕ ПО, СУМА, МИНИМУМ, СРЕДНО, МАКСИМУМ, КОЛИЧЕСТВО, БРОЙ РАЗЛИЧНИ.

Раздел Условия

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

Раздел Разширени

Раздел Допълнителнопълен с всякакви параметри, които са много важни. Нека разгледаме всеки от свойствата.

Групиране Избиране на записи:

  • Първо Н– параметър, който връща само N записа към заявката (оператор FIRST)
  • Без дубликати– гарантира уникалността на получените записи (оператор РАЗЛИЧЕН)
  • Позволен– позволява ви да изберете само онези записи, които системата ви позволява да изберете, като вземете предвид (ПОЗВОЛЕНА конструкция)

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

Отдолу има знаме Заключете получените данни за по-късна промяна. Позволява ви да активирате възможността за задаване на заключване на данни, което гарантира безопасността на данните от момента на четенето им до промяната им (важи само за режима на автоматично заключване, дизайн ЗА ПРОМЯНА).

Раздел Присъединявания/Псевдоними

В този раздел на дизайнера на заявки можете да зададете възможността за свързване на различни таблици и псевдоними (конструкцията HOW). Таблиците са посочени от лявата страна. Ако поставите флаговете срещу таблицата, ще се използва конструкция UNITE, в противен случай - UNITE ALL (разлики между двата метода). От дясната страна е посочено съответствието на полетата в различни таблици; ако съответствието не е посочено, заявката ще върне NULL.

Раздел за поръчка

Това определя реда, в който се сортират стойностите (ORDER BY) - низходящ (DESC) или възходящ (ASC).

Има и едно интересно знаме - Автоматична поръчка(в заявката - АВТОМАТИЧНА ПОРЪЧКА). По подразбиране системата 1C показва данни в „хаотичен“ ред. Ако зададете този флаг, системата ще сортира данните по вътрешни данни.

Раздел Пакет на заявка

В раздела дизайнер на заявки можете да създавате нови и да го използвате като навигация. В текста на заявката пакетите са разделени със символа “;” (запетая).

Бутон „Заявка“ в дизайнера на заявки

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

В този прозорец можете да направите корекции на заявката и да я изпълните.


Използване на конзолата за заявки

Конзолата за заявки е прост и удобен начин за отстраняване на грешки в сложни заявки и бързо получаване на информация. В тази статия ще се опитам да опиша как да използвам Query Console и ще дам връзка за изтегляне на Query Console.

Нека да разгледаме по-отблизо този инструмент.

Изтеглете 1C конзола за заявки

Първо, за да започнете да работите с конзолата за заявки, трябва да я изтеглите от някъде. Лечението обикновено се разделя на два вида - контролирани форми и конвенционални (или понякога се наричат ​​8.1 и 8.2/8.3).

Опитах се да комбинирам тези два изгледа в една обработка - желаната форма се отваря в желания режим на работа (в управляван режим конзолата работи само в дебел режим).

Описание на конзолата за заявки 1C

Нека започнем да разглеждаме конзолата за заявки с описание на основния панел за обработка:

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

Първата група бутони в командната лента е отговорна за запазването на текущите заявки във външен файл. Това е много удобно; винаги можете да се върнете към писане на сложна заявка. Или, например, съхранявайте списък с типични примери за определени дизайни.

Отляво, в полето „Заявка“, можете да създавате нови заявки и да ги запазвате в дървовидна структура. Втората група бутони отговаря за управлението на списъка със заявки. С него можете да създавате, копирате, изтривате, премествате заявка.

  • Изпълниискане– просто изпълнение и резултати
  • Изпълнение на пакета– позволява ви да видите всички междинни заявки в пакет от заявки
  • Преглед на временни таблици– позволява ви да видите резултатите, които временните заявки връщат в таблица

Параметри на заявката:

Позволява ви да зададете текущите параметри за заявката.

В прозореца с параметри на заявката е интересно следното:

  • Бутон Вземете от заявкаавтоматично намира всички параметри в заявката за удобство на програмиста.
  • Флаг Общи параметри за всички заявки– когато е инсталиран, обработката му не изчиства параметрите при преминаване от заявка към заявка в общия списък със заявки.

Задайте параметър със списък от стойностиМного е просто, просто когато избирате стойност на параметър, щракнете върху бутона за изчистване на стойността (кръст), системата ще ви подкани да изберете типа данни, където трябва да изберете „Списък със стойности“:

Също така в горния панел има бутон за извикване на настройките на конзолата за заявки:

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

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

Дизайнерът на заявки 1C 8 се извиква от контекстното меню (десен бутон на мишката), когато щракнете върху полето за въвеждане:

Също така в това меню има такива полезни функции като изчистване или добавяне на нов ред („|“) към заявката или получаване на кода на заявката в тази удобна форма:

Заявка = Нова заявка;
Request.Text = ”
|ИЗБЕРЕТЕ
| Валути.Връзка
| ОТ
| Справочник.Валути AS Валути”;
RequestResult = Request.Execute();

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



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

Оптимизация на заявките

Една от най-важните точки за увеличаване на производителността на 1C предприятие 8.3 е оптимизациязаявки. Тази точка също е много важна, когато преминаване на сертифицирането. По-долу ще говорим за типични причини за неоптимална производителност на заявките и методи за оптимизация.

Селекции във виртуална таблица с помощта на конструкцията WHERE

Необходимо е да се прилагат филтри към детайлите на виртуалната таблица само чрез VT параметрите. При никакви обстоятелства не трябва да използвате конструкцията WHERE за избор във виртуална таблица; това е сериозна грешка от гледна точка на оптимизация. В случай на избор чрез WHERE, всъщност системата ще получи ВСИЧКИ записи и едва след това ще избере необходимите.

ДЯСНО:

ИЗБИРАМ

ОТ
Регистър на натрупванията. Взаимни разчети с участници в организациите (.
,
Организация = &Организация
И Индивидуално = &Индивидуално) КАК Взаимни разплащания с Участници в Организации Салда

ГРЕШНО:

ИЗБИРАМ
Взаимни разчети с Участници на Салда на организациите
ОТ
Регистър на натрупванията. Взаимни разчети с участници в организации (,) КАК Взаимни разчети с участници в организации
КЪДЕТО
Взаимни разчети с участниците в организациите. Организация = & Организация
И Взаимни разчети с Участници на организации Индивидуални = &Индивидуални

Получаване на стойността на поле от сложен тип с помощта на точка

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

Например, крайно нежелателно е оптимизацията да има достъп до полето за запис в регистъра – регистратор. Регистраторът има съставен тип данни, сред които са всички възможни типове документи, които могат да записват данни в регистъра.

ГРЕШНО:

ИЗБИРАМ
Запис Set.Recorder.Date,
RecordSet.Quantity
ОТ
RegisterAccumulations.ProductsOrganizations AS SetRecords

Тоест, всъщност такава заявка ще има достъп не до една таблица, а до 22 таблици на база данни (този регистър има 21 типа регистратори).

ДЯСНО:

ИЗБИРАМ
ИЗБОР
WHEN ProductsOrg.Registrar LINK Документ. Продажби на продукти и услуги
THEN EXPRESS(ProductsOrg.Registrar AS Document.Sale of GoodsServices).Дата
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
THEN EXPRESS(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Дата
КРАЙ КАТО ДАТА,
ProductsOrg.Quantity
ОТ
RegisterAccumulations.GoodsOrganizations AS GoodsOrganization

Или вторият вариант е да добавите такава информация към детайлите, например в нашия случай добавяне на дата.

ДЯСНО:

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

Подзаявки в условие за присъединяване

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

ГРЕШНО:

ИЗБИРАМ …

ЛЯВО ПРИСЪЕДИНЯВАНЕ (
ИЗБЕРЕТЕ ОТ RegisterInformation.Limits
КЪДЕТО …
ГРУПИРАЙ ПО...
) ОТ …

ДЯСНО:

ИЗБИРАМ …
PUT Ограничения
ОТ Информационен регистър.Ограничения
КЪДЕТО …
ГРУПИРАЙ ПО...
ИНДЕКС ПО...;

ИЗБИРАМ …
ОТ Документ за стоки и услуги
LEFT JOIN Граници
ОТ …;

Обединяване на записи с виртуални таблици

Има ситуации, когато при свързване на виртуална маса с други, системата не работи оптимално. В този случай, за да оптимизирате производителността на заявката, можете да опитате да поставите виртуалната таблица във временна таблица, като не забравяте да индексирате обединените полета в заявката за временна таблица. Това се дължи на факта, че VT често се съдържат в няколко физически СУБД таблици; в резултат на това се компилира подзаявка за избора им и проблемът се оказва подобен на предишната точка.

Използване на селекции въз основа на неиндексирани полета

Една от най-честите грешки при писане на заявки е използването на условия за неиндексирани полета, това противоречи правила за оптимизиране на заявки.СУБД не може да изпълни оптимално заявка, ако заявката включва избор на неиндексируеми полета. Ако вземете временна таблица, трябва също да индексирате полетата за връзка.

Трябва да има подходящ индекс за всяко условие. Подходящ индекс е този, който отговаря на следните изисквания:

  1. Индексът съдържа всички полета, изброени в условието.
  2. Тези полета са в самото начало на индекса.
  3. Тези селекции са последователни, т.е. стойностите, които не са включени в условието на заявката, не са „заклещени“ между тях.

Ако СУБД не избере правилните индекси, цялата таблица ще бъде сканирана - това ще има много негативно влияние върху производителността и може да доведе до продължително блокиране на целия набор от записи.

Използване на логическо ИЛИ в условия

Това е всичко, тази статия обхваща основните аспекти на оптимизацията на заявките, които всеки 1C експерт трябва да знае.

Много полезен безплатен видео курс за разработване и оптимизиране на заявки, Горещо препоръчвамза начинаещи и повече!

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

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

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


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

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

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

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

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

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

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

Информацията е взета от сайта

Публикации по темата