Операторът "в йерархията" в заявка. Примери за заявки за работа с йерархични директории Акаунт в йерархична заявка 1c

20.11.2023

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

Влезте в сайта като студент

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

Език за заявки 1C 8.3 за начинаещи програмисти: оператори BETWEEN и IN

Логически оператор BETWEEN

Оператор МЕЖДУви позволява да проверите включена ли е стойността?израз, посочен вляво от него в диапазона, посочен вдясно ( заедно с границите на диапазона, тоест включително).

Така че вместо

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

Оператор МЕЖДУМоже да се прилага към повече от просто числови диапазони. Също така работи добре с дати:

Логически оператор B

Проверка за съвпадение с един от изброените

Оператор INви позволява да проверите съответства ли стойносттаизразът, посочен вляво от него, с една от стойноститеописан вдясно.

Така че вместо

можеш да напишеш нещо по-сбито

И резултатът ще бъде същият:

Ако, напротив, е необходимо да изберете цялата храна, чийто цвят не съвпада с нито една стойност от списъка, тогава е подходяща следната форма на отрицание (появила се е частица НЕ):

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

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

Един от начините да направите това е да използвате логическия оператор IN, вдясно от който ще има подзаявка, избираща имена на цветове от всички записи в директорията храна:

ИЗБЕРЕТЕ име ОТ директория. Цветове WHERE Name IN ( SELECT Color. Name FROM Directory. Food )

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

Отново за тази форма на оператора IN, използването на частици също е налично НЕпред него.

Проверка на членството в йерархията за директории

За директории може да се извърши проверка и за принадлежност към йерархия.

Първо, нека да разгледаме пример за йерархична директория. Отворете директорията „Градове“ в нашата база данни:

Моля, обърнете внимание, че неговите елементи са различни от другите директории ( храна, Цветове, Аромати) наличие на жълти папки. това групи директории.

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

За да видите съдържанието на група, щракнете двукратно върху нея:

За да отидете на ниво нагоре, щракнете двукратно върху групата отново:

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

Всеки елемент (независимо дали е група или обикновен елемент) може да има родител. Например родителят на елемента Рио де Жанейро е групата Бразилия:

И това е вярно, защото Рио де Жанейро е част от бразилската група в йерархията на директорията:

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

Моля, обърнете внимание, че в текста на заявката има амперсанд (&) преди името GroupCountry. Имената с амперсанд се разпознават автоматично от системата като параметри, чиято стойност трябва да бъде зададена преди изпълнението на заявката.

След като поставим тази заявка в конзолата и щракнете върху бутона Изпълни, за да актуализирате, ще можем да зададем този параметър:

Изберете групата "Русия" като нейна стойност (бутон Избор):

Ако сега щракнете върху бутона "Изпълни", резултатът от заявката ще бъде както следва:

Резултатът от искането беше самата група (Русия) и всички елементи, които са част от нея (Перм, Красноярск и Воронеж).

Ако изберете „Бразилия“ вместо Русия, резултатът ще бъде следният:

Така резултатът от оператора В ЙЕРАРХИЯТАще бъде TRUE, ако стойността на израза отляво е препратка към елемент от директория и е включена в набора от стойности вдясно (Бразилия) или йерархично принадлежи към някаква група, съдържаща се в този набор (Сао Пауло, Рио де Жанейро, Салвадор).

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

За оператора В ЙЕРАРХИЯТАизползването на частици също е налично НЕпред него.

Направете теста

Стартирайте теста

1. Логическият оператор BETWEEN тества стойността

2. Булев израз 1 МЕЖДУ 1 И 1

3. Логически израз 1 НЕ МЕЖДУ 2 И 2

4. Проверки на логически оператор B

5. Логическият оператор B ви позволява да проверите

Дизайнът „В ЙЕРАРХИЯ“ в заявките на 1C:Enterprise 8.x ви позволява да получавате подчинени елементи на йерархичен конфигурационен обект според даден избор. Днес в статията ще разгледаме пример за използването му, както и действията на платформата от страна на СУБД и влиянието му върху производителността.

Използване

Нека да разгледаме прост пример за използване на конструкцията "В ЙЕРАРХИЯТА". При изпълнение на следната заявка ще бъдат получени подчинените елементи на йерархичната директория "Продукти" за предадената стойност на променливата "Връзка".

Текст на заявката = " ИЗБЕРЕТЕ | Продукти . връзка,| стоки |. статияОТ |Справочник . Продукти AS Продукти"

|КЪДЕ |

стоки

. Връзка В ЙЕРАРХИЯТА (& връзка)

В тестовата база данни директорията „Продукти“ съдържа следните тестови данни:

Разбира се, изображението не показва всички записи в директорията. Екранната снимка показва само структурата за съхранение на данни в йерархичната директория. Таблицата с директории съхранява 10 групи от най-високо ниво, всяка от които съдържа 5 вложени групи с 200 елемента всяка. Да се ​​върнем към заявката за тест. Нека предадем връзката към групата "Група - 1" към параметъра "&Връзка" (вижте екранната снимка по-горе). Тогава резултатът от заявката ще изглежда така:Както виждаме, заявката върна връзка към самата горна група (подадена като параметър), както и вложени групи с елементите в тях. По този начин използването на конструкцията „В ЙЕРАРХИЯТА“ ви позволява удобно да получавате йерархично подчинени данни. Синтаксис на езика за заявки 1C:Enterprise.

класически SQL

много подобни в някои отношения. Но за израза „В ЙЕРАРХИЯТА“ няма аналог в езика за заявки SQL, тъй като например за израза на езика за заявки на платформата „B“ има подобен SQL оператор „IN“. Ето защо е интересно, че платформата работи с СУБД при използване

  1. на този оператор
  2. Зад кулисите

Така че да започваме. Например ще използваме написаната по-рано заявка за директорията „Продукти“. Ще анализираме действията на платформата за две ситуации:

1. Ще предадем групата от най-високо ниво „Група 1“ като параметър „&Връзка“ (както направихме по-рано).

2. В параметъра ще предадем връзка към групата "Група 1 - 1", вложена в групата от най-високо ниво "Група 1".

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

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

3. За да получи крайния резултат от заявката, платформата генерира следната SQL заявка:

Резултатът от тази конкретна заявка може да бъде допълнително обработен от алгоритми на вградения език на платформата. По този начин, записи във временната таблица "#tt1" се използват за задаване на условието за вземане на проби от референтната таблица "_Reference41".

4. На последната стъпка платформата 1C:Enterprise 8.x изтрива временната таблица „#tt1“, тъй като тя вече няма да се използва в бъдеще.

Това завършва процеса на изпълнение на оператора “IN HIERARCHY”.Позволете ми да ви напомня, че разглежданата последователност от действия на SQL сървъра беше извършена, когато предадохме връзка към групата от най-високо ниво „Група - 1“ към заявка от страна на платформата. Но как ще се държи платформата, ако предадем връзка към групата от второ ниво „Група - 1 - 1“ като параметър „&Връзка“? Всичко ще се случи по същия начин, с изключение на следната точка: по-горе, във втория етап на изпълнение на SQL заявки от платформата, беше написано, че заявката за получаване на подчинени елементи е изпълнена два пъти - в случай на получаване на подчинени елементи за групата "Група - 1 - 1" това не е така . Заявката ще бъде изпълнена само веднъж.

Факт е, че броят на заявките за получаване на подчинени елементи зависи от броя на групите в йерархията. С други думи, ако нивото на йерархията на елемента съдържа поне една група, тогава искане от т.2.

Въздействие върху производителността

Неправилното използване на оператор в заявка може да доведе до неоптимална производителност на системата. Разглежданият оператор „В ЙЕРАРХИЯТА“ не прави изключение. Трябва да се използва с повишено внимание, тъй като значително усложнява алгоритъма за изпълнение на SQL заявки към базата данни и по този начин увеличава натоварването на СУБД сървъра.

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

ИЗБЕРЕТЕ продукти. Връзка ОТ директория. Продукти КАТО Продукти WHERE (Продукти. Връзка В ЙЕРАРХИЯ (& Връзка) ИЛИ Продукти. Връзка В ЙЕРАРХИЯ (& Връзка1) ИЛИ Продукти. Връзка В ЙЕРАРХИЯ (& Връзка2) )

Както можете да предположите, заявката ще доведе до генериране на много SQL заявки, което ще доведе до намаляване на производителността на информационната система.

Направете си изводите!

От вас зависи да си направите изводите. Само да кажа, че операторът “В ЙЕРАРХИЯТА” се използва от платформата за системата за композиране на данни, когато условията за избор включват “В ГРУПА”, “В ГРУПА ОТ СПИСЪКА” и други. Мисля, че няма нужда да обяснявам, че с неправилни манипулации потребителите могат да настроят много сложни селекции и да увеличат натоварването на 1C сървъра и СУБД няколко пъти. Нека променим настройките само за опитни потребители.

И разбира се, при писане собствени механизмиобърнете внимание на оператора "В ЙЕРАРХИЯТА". Много удобно от една страна и опасно от друга.

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

Получаване на елементи от йерархична директория, които са подчинени на дадена група

За получаване на подчинени елементи на йерархична директория, езикът за заявки предоставя конструкцията IN HIERARCHY. Пример за използване В ЙЕРАРХИЯТА:


ИЗБЕРЕТЕ
Номенклатура.Код,
Номенклатура.Покупна цена
ОТ

IN в този примерЩе бъдат получени всички записи на номенклатурната директория, разположена в групата &група, включително самата нея, нейните подчинени групи и елементи, принадлежащи към подчинени групи.

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


ИЗБЕРЕТЕ
Номенклатура.Код,
Номенклатура Име AS Име,
Номенклатура.Покупна цена
ОТ
Справочник.Номенклатура AS Номенклатура

КЪДЕ
Nomenclature.Parent = &Група

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

Проверка на наличието на подчинени елементи на елемент от директория

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

В този пример препратката към елемента, за който искате да проверите за деца, се записва в параметъра на заявка Родител. След като изпълните такава заявка, трябва да проверите резултата за празнота. Ако резултатът не е празен, значи има подчинени записи. Иначе - не. Пример:


Ако Request.Execute().Empty() Тогава
Доклад ("Няма записи");
В противен случай
Доклад ("Налични записи");
endIf;

Получаване на всички родители на елемент

Езикът на заявката не предоставя специални средстваза да получите всички родители на елемент. Можете да използвате йерархични суми, за да завършите задачата, но получаването на йерархични суми е оптимизирано за изграждане на суми за голям брой записи и не е напълно ефективно за получаване на родителите на един елемент. За по-ефективно извличане на всички родителски записи на даден елемент се препоръчва да преминавате през неговите родители на малки части. Пример:


CurrentItemItem = Артикул;

Заявка = Нова заявка ("ИЗБЕРЕТЕ
| Номенклатура. Родител,
| Номенклатура.Родител.Родител,
| Номенклатура.Родител.Родител.Родител,
| Номенклатура.Родител.Родител.Родител.Родител,
| Номенклатура.Родител.Родител.Родител.Родител.Родител
| ОТ
| Справочник.Номенклатура AS Номенклатура
|КЪДЕ
| Nomenclature.Link = &CurrentNomenclatureElement";

Докато цикълът на истината
Request.SetParameter("CurrentItemItem", CurrentItemItem);
Резултат = Query.Run();
Ако Result.Empty() Тогава
Прекъсване;
endIf;
Избор = Резултат.Избор();
Избор.Напред();
За ColumnNumber = 0 Чрез Result.Columns.Quantity() - 1 цикъл
CurrentItemItem = Избор [Номер на колона];
Прекъсване;
В противен случай
Доклад(Текущ елемент);
endIf;
EndCycle;

Ако CurrentItemItem = Directories.Nomenclature.EmptyLink() Тогава
Прекъсване;
endIf;
EndCycle;

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

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

Показване на йерархична директория в отчет

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


ИЗБЕРЕТЕ
Номенклатура.Код,
Номенклатура Име AS Име,
Номенклатура.Покупна цена
ОТ
Справочник.Номенклатура AS Номенклатура
ПОРЪЧАЙТЕ ПО
Име ЙЕРАРХИЯ

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

За да се поставят директорийни групи над елементи е необходимо това исканезаменете клаузата ORDER BY със следното:


ПОРЪЧАЙТЕ ПО
Номенклатура. Това е груповата ЙЕРАРХИЯ,
Име

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

Възможна е и замяна на офертата ПОРЪЧАЙ ПО с опция АВТОМАТИЧНА ПОРЪЧКА. В този случай резултатът ще бъде подреден в съответствие с настройките на директорията, т.е. ако директорията посочва, че групите трябва да бъдат разположени над елементите, тогава те ще бъдат разположени по-горе.

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


ИЗБЕРЕТЕ
Номенклатура.Код,
Номенклатура Име AS Име,
Номенклатура.Покупна цена

ОТ Справочник.Номенклатура КАТО Номенклатура

КЪДЕ
(Nomenclature.ThisGroup = FALSE)

ПОРЪЧАЙТЕ ПО Име

Получаване на суми по йерархия

За да получите резултати по йерархия в заявка, трябва да посочите в изречението СОФТУЕРНИ РЕЗУЛТАТИ ключова думаЙЕРАРХИЯ след указване на полето, по което ще се изчисляват сумите. Пример за отчет "Оборот на артикул" с получаване на суми по йерархия:


ИЗБЕРЕТЕ

ОТ

Номенклатурна ЙЕРАРХИЯ

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

В случай, че не се нуждаем от суми за елементи, а само от суми за групи, трябва да използваме конструкцията САМО ЙЕРАРХИЯ в сумите. Пример:


ИЗБЕРЕТЕ
Счетоводно отчитане на номенклатурния оборот. Номенклатура AS номенклатура,
Счетоводно отчитане на НоменклатураОборот.Номенклатура.Представяне,
Счетоводно отчитане на NomenclatureTurnover.QuantityTurnover AS QuantityTurnover
ОТ
Регистър за натрупване. Номенклатурно отчитане. Оборот КАК Номенклатурно отчитанеОборот
РЕЗУЛТАТИ СУМА (КоличествоОборот) PO
Номенклатура САМО ЙЕРАРХИЯ

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

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

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

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

ИЗБЕРЕТЕ
Банки. Име,
Банки.Кореспондентска сметка
ОТ
Справочник.Банки КАК Банки

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

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

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

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

За да получите данни, е достатъчно да използвате конструкциите "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.Nomenclature
WHERE NOT Remaining Products QuantityRemaining Е NULL

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

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

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

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

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

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

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

Връзки

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

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

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

Например:

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

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)
  • Без дубликати– гарантира уникалността на получените записи (оператор DIFFERENT)
  • Разрешено– позволява ви да изберете само онези записи, които системата ви позволява да изберете, като вземете предвид (ПОЗВОЛЕНА конструкция)

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

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

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

В този раздел на дизайнера на заявки можете да зададете възможността за свързване на различни таблици и псевдоними (конструкцията 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(ProductsOrganization.Registrar AS Document.Sales of GoodsServices).Дата
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
THEN EXPRESS(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Дата
КРАЙ КАТО ДАТА,
ProductsOrg.Quantity
ОТ
RegisterAccumulations.ProductsOrganizations AS ProductsOrganization

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

ДЯСНО:

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

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

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

ГРЕШНО:

ИЗБЕРЕТЕ...

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

ДЯСНО:

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

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

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

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

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

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

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

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

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

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

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

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