телевизори. Конзоли. Проектори и аксесоари. Технологии. Цифрова телевизия

Query Builder 1C 8.2. Създател на отчети и Създател на заявки, работещи с персонализиран източник на данни. Алгоритъм за използване на строителя

1. Какво е инструмент за създаване на отчети?

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

Настройките на Report Builder включват:

  • групи (пример: „Номенклатура“, „Контрагент“...),
  • индикатори (пример: “Количество”, “Сума”...),
  • допълнителни полета (пример: “Артикул.Услуга”, “Код.Акаунт”...),
  • филтър (пример: по конкретна позиция, по група контрагенти...) и
  • сортиране (пример: “Номенклатура.Код”, “Контрагент.Име”...)

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

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

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

2. Къде мога да използвам инструмента за създаване на отчети?

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

В допълнение, създателят на отчети може да се използва в случаите, когато извеждането на резултата не е необходимо, но потребителят трябва да персонализира елементите на заявката, например групиране или филтър (пример: качване на елемент в xml файл или обработка осчетоводяване на документи по зададен филтър).

Тъй като конструкторът на отчети не е наличен на сървъра на 1C:Enterprise и не се използва в модула за външна връзка, в тези случаи е необходимо да се използва конструктор на заявки, който е подобен на създателя на отчети, но няма визуални свойства и методи (“Layout”, “OutputReportTitle”, “Output()”, “DesignLayout()”...).

3. Малко за концепциите

В сравнение с версия 7.7, версия 8.0 е претърпяла лека промяна в концепциите, така че си струва да се спрем малко на това.

Концепция

Описание

Измервания на редове Списък с групировки, за които изходът ще се извършва по ред (пример: „Артикул“, „Акаунт“...)
Измервания на колони Списък с групировки, за които извеждането ще се извършва по колони (пример: “Склад”, “Месец”...).
Избор Набор от различни филтри (пример: по група контрагенти, по дадена организация...).
Поръчка Набор от полета за сортиране (пример: „Артикул. Код“, „Документ за продажба. Отговорник“…).
Поле Едно от полетата за избор на заявка (пример: „Артикул”, „Код на сметка”, „Количество”, „Сума”...).
Избрани полета Списъкът с избрани полета включва индикатори (пример: “Количество”, “Сума”...) и допълнителни полета (данни за групиране) (пример: “Номенклатура.Група”, “Сметка.Код”...).
Налични полета Списък с налични полета за добавяне към групиране, филтриране, сортиране и избрани полета. Като правило се попълва със списък от полета за избор на заявка, но може да се редактира програмно (можете да добавяте, променяте и изтривате налични полета).

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

Основната разлика е, че наличното поле няма свойството "DataPath" (пример: "Nomenclature.Code", "Quantity"), тъй като това е просто вид описание на полето, чрез което ще бъде направен опит за намиране съвпадение между примерните полета на заявката в момента, добавяйки го към списъка с групи, филтри, сортирания или избрани полета.

В същото време не е възможно програмно да добавите едно от наличните полета към някой от горните списъци, тъй като, от една страна, наличното поле няма методи a la „AddToSelection()“ или „AddToSelectedFields() ”, а от друга страна, когато добавяте нов елемент към който и да е от горните списъци, трябва да посочите свойството „DataPath”, което не винаги съвпада с името на полето (пример: полетата „Nomenclature.Parent” и „Номенклатура.Родител.Родител“ имат същото име „Родител“).

4. Типичен случай на употреба за създателя на отчети

IN общ случайПоследователността от действия при работа с конструктора на отчети е следната:

  1. Създайте нов обект „Конструктор на отчети“;
  2. Присвоете текста на заявката към свойството „Текст“;
  3. Ако настройките на създателя на отчети не са посочени в текста на заявката, тогава изпълнете метода „FillSettings()“;
  4. Осигурете на потребителя възможността да променя настройките на инструмента за създаване на отчети;
  5. Ако е необходимо, можете да откажете автоматичното генериране на оформлението от създателя на отчети и да зададете свойството „Оформление“ фиксирано оформление;
  6. Ако е необходимо, можете да присвоите свойството „Design Layout“ на едно от стандартните или на вашето собствено оформление и ако автоматично генерираното оформление на конструктора на отчети е заменено с фиксирано, тогава изпълнете „DesignLayout()“ метод;
  7. Извикайте метода “Run()”;
  8. Извикайте метода „Output()“.
Builder = Нов "Създател на отчети"; Builder.Text = "ИЗБЕРЕТЕ РАЗРЕШЕНО | Company CashRemains.StructuralUnit, | SUM(CompanyCashRemains.AmountRemaining) AS Amount | |FROM | RegisterAccumulations.CompanyCash.Remains(, (StructuralUnit.*)) | единица | |ОБЩА СУМА (Сума) BY | ОБЩИ, |Структурно звено"; Builder.FillSettings(); //Тук можете да дадете възможност на потребителя //да промени настройките на инструмента за създаване на отчети Builder.Layout = GetLayout("CustomLayout");
Builder.AppearanceLayout = GetAppearanceLayout(StandardAppearance.Classic);
Builder.DesignLayout();
Builder.Run();
Builder.Output();

5. Описание на някои свойства на конструктора на отчети

Имот

Описание

Текст Съдържа текста на заявката за конструктор на отчети. Ако текстът на заявката за съставител на отчети не съдържа елементи за настройка „(…)“, тогава можете да използвате метода „FillSettings()“, за да попълните автоматично настройките въз основа на текста на заявката.
Текст на заглавието Текстът, който ще се изведе в заглавката на справката (пример: „Салда на складовите наличности към 01.01.2004 г.“, „Продажби за януари 2004 г.“...).
OutputReportTitle
Заглавка на OutputTable
OutputGeneralResults
OutputFooterTables
OutputReportFootment
Тези свойства определят дали заглавието на отчета, горния колонтитул на таблицата, общите суми, долния колонтитул на таблицата и долния колонтитул на отчета се показват съответно.
OutputDetailedRecords Свойството е отговорно за принудителното извеждане или забраната на изхода подробни записи.
AutoDetailedRecords Ако свойството „AutoDetailed Records“ е зададено на True, тогава всеки подробен запис ще се показва само ако се различава от груповия запис.
Налични полета Съдържа списък с полета, налични за добавяне към групи, филтри, избрани полета и сортиране.
DimensionsStrings
РазмериКолони
Съдържа списък с групи, съответно по редове и колони.
Избор Съдържа списък с филтри, определени за създателя на отчети.
Избрани полета съдържа списък с избрани индикатори и подробности за групирането.
Поръчка съдържа списък с полета за сортиране.
Настроики Съдържа списък с параметри на builder (декларирани в тялото на заявката за builder с помощта на знака „&“).
Резултат Съдържа резултата от изпълнението на заявка за съставител на отчети (обект от тип Query Result).

6. Обработка на транскрипти с помощта на Report Builder

Свойството „Попълване на декриптиране“ съдържа една от трите опции за попълване на преписа по време на извеждане:

Вариант 1: не попълвайте (не използвайте препис).

2-ра опция: групиране на стойности (при декодиране на клетка ще се отвори групиращата стойност, показана в нея).

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

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

Ако се използва третата опция за попълване на преписа, тогава можете да използвате метода „SetupTranscript()“, предназначен да изпълни и покаже отчета, като вземе предвид преписа, извършен от потребителя.

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

7. Изготвяне на отчет

Свойството „Оформление“ съдържа оформлението, което се използва при извеждане на резултата в документ с електронна таблица. Ако е Недефинирано, оформлението се генерира автоматично.

Свойствата „ReportHeader Layout“, „TableHeaderLayout“, „DetailedRecordsLayout“, „TotalTotalsLayout“, „TableFooterLayout“ и „ReportFooterLayout“ съдържат името на областта в оформлението на съставителя на отчети или отделни оформления, използвани при показване съответно на заглавката на отчета, горен колонтитул на таблица, подробни записи, общи суми, долен колонтитул на таблица и долен колонтитул на отчет в документ с електронна таблица. Ако имената на обхвата съвпадат с имената в оформлението на конструктора на отчети, тогава не е необходимо да попълвате свойствата.

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

За да получите една от стандартните опции за дизайн, можете да използвате метода на глобалния контекст „GetDesignLayout()“.

Ако на свойството „Layout“ на създателя на отчети е присвоено фиксирано оформление, за да го проектирате, трябва да изпълните метода „DesignLayout()“.

Свойството „Поставяне на измерения в редове“ дефинира една от трите опции за показване на групиране по редове.
1-ви вариант: заедно (в една колона).
Пример:

2-ри вариант: отделно (в различни колони).
Пример:


Пример:

Свойството „Поставяне на измерения в колони“ дефинира една от трите опции за показване на групиране по колони.
1-ви вариант: заедно (в един ред).
Пример:

2-ри вариант: отделно (в различни редове).
Пример:

3 вариант: отделно и само накрая.
Пример:

Свойството „Поставяне на суми в редове“ дефинира един от четирите начина за показване на суми в редове.
1-ва опция: в заглавната част (само над следващите групировки и подробни записи).

2-ра опция: в горния и долния колонтитул (над и под последващи групи и подробни записи).

3-ти вариант: в сутерена (под следващите групировки и подробни записи, над тях се показва само описание на групирането).

4-ти вариант: само в сутерена (само под последващи групи и подробни записи).

Имот " Поставяне на суми в колони” дефинира един от четирите начина за показване на суми в колони.

1-ва опция: в заглавката (само вляво от следващите групирания и подробни записи).

2-ра опция: в горния и долния колонтитул (отляво и отдясно на следващите групирания и подробни записи).

3-ти вариант: в сутерена (вдясно от следващите групировки и подробни записи, вляво от тях се показва само описание на групировката).

4-ти вариант: само в сутерена (само вдясно от последващи групи и подробни записи).

Имот " Поставяне на подробности за размерите в редове” дефинира една от трите опции за показване на детайли за групиране по ред.

1-ви вариант: заедно (в една допълнителна колона).
Пример:

2-ри вариант: заедно с измерванията (в колони с групи).
Пример:

3-ти вариант: отделно (в различни допълнителни колони).
Пример:

Имот " Поставяне на подробности за измерванията в колони” дефинира една от трите опции за показване на детайли за групиране по колони.

1-ви вариант: заедно (в един допълнителен ред).
Пример:

2-ри вариант: заедно с размери (в редове с групиране).
Пример:

3-ти вариант: отделно (в различни допълнителни редове).
Пример:

8. Изход на конструктора на отчети

Методът „Run()“ изпълнява заявката за съставител на отчети и попълва свойството „Резултат“.
С помощта на метода „GetQuery()“ можете да получите заявката за съставител на отчети, която се изпълнява, когато се извика методът „Run()“.

Методът “Output()” показва резултата в документ с електронна таблица или диаграма. Ако не посочите обекта, към който искате да изведете, ще бъде създаден нов документ с електронна таблица.

Пример за изход към нов документ с електронна таблица:
Builder.Output();

Пример за изход към съществуващ документ с електронна таблица:
Builder.Output(FormElements.ResultTable);

Пример за изход към диаграма:
Builder.Output(FormElements.ResultDiagram, "Количество");

Ако искате да покажете резултата от създателя на отчети в обобщена таблица или обобщена диаграма, тогава не е необходимо да използвате метода „Output()“, а попълнете свойството „Източник на данни“ на обобщената таблица или диаграма . Източникът може да бъде резултат от създателя на отчети или самият създател на отчети. Резултатът от конструктора на отчети не изисква повторно изпълнение на заявката, но конструкторът на отчети ви позволява да промените състава на групировките.

9. Запазване и възстановяване на настройките на строителя

Методът “GetSettings()” ви позволява да получите текущите настройки на създателя на отчети с възможността да посочите кои (пример: само филтриране, филтриране и сортиране...).

Методът “SetSettings()” ви позволява да заредите настройките на създателя на отчети с възможността да посочите кои (пример: само филтриране, филтриране и сортиране...).

10. Групиране и полета на конструктора на отчети

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

Основните детайли на групата са

  • „Име“ (подробен идентификатор) ​​(пример: „Артикул“, „Контрагент“...),
  • „Представяне“ (представяне по време на извеждане) (пример: „Документ за продажба“, „Мерна единица“...),
  • „PathtoData“ (път към полето за избор на заявка) (пример: „Номенклатура“, „DocumentSales.Organization“...)

и, ако групирането е изградено според директорията, тогава

  • „Тип измерение“ (една от опциите за филтриране по стойности на полета: йерархия (елементи и групи), само йерархия (само групи) или елементи (само елементи)).

Освен това има няколко свойства, които ви позволяват да присвоите оформления на група, която ще се използва при извеждане в документ с електронна таблица.

  • „Оформление“ е името на областта в оформлението на конструктора на отчети или отделно оформление, използвано при групиране на изхода.
  • „Йерархично оформление“ е името на област в оформлението на конструктора на отчети или отделно оформление, използвано при показване на йерархия на групиране.
  • „Оформление на долния колонтитул“ е името на областта в оформлението на строителя или отделно оформление, използвано при показване на долния колонтитул на групата.
  • „HierarchyFooterLayout“ е името на областта в оформлението на компилатора или отделно оформление, използвано при рендиране на долния колонтитул на групираща йерархия.
  • „Оформления на мазето на ниво“ - масив от оформления на сутерена за различни нива на групиране.
  • „Оформления на нива“ - масив от оформления за различни нива на групиране.

Полето за създаване на отчет е едно от избраните полета. Основните подробности за полето са

  • „Име“ (идентификатор на полето) ​​(пример: „Количество“, „Номенклатурен код“, „Период“...),
  • „Представяне“ (представяне по време на извеждане) (пример: „Количество“, „Код“, „Период“...) и
  • “PathKData” (път към полето за избор на заявка) (пример: “Количество”, “Номенклатура. Код”, “Период”...).

Можете да извършвате редица действия със списък от групи или полета.

  • “Insert()“ - добавя групиране/поле към указаната позиция.
  • “Add()“ - добавя групиране/поле в края на списъка.
  • “Index()” - вземете индекса на групирането/полето в списъка.
  • “Quantity()” - вземете броя на групите/полетата в списъка.
  • “Find()“ - намиране на група/поле в списъка по име.
  • “Clear()“ - изчиства списъка с групи/полета.
  • “Get()” - получаване на групиране/поле по индекс.
  • “Shift()” - изместване на групировката/полето с определен брой позиции.
  • “Delete()” - премахва групиране/поле от списъка.

11. Builder език

Създателят на отчети има свой собствен език. Това е обикновен език за заявки, допълнен с конструкции „(…)“. Използвайки тези конструкции, можете да се откажете от метода „FillSettings()“ и да конфигурирате създателя на отчети в тялото на заявката.
По този начин можете да персонализирате елементите „SELECT“, „WHERE“, „ORDER BY“, „SUMMARY BY“, както и да правите няколко други интересни неща. В този случай тялото на заявката за изграждане ще бъде настройките по подразбиране, докато конструкциите (...) ще описват наличните настройки.

Ако полето за избор ви позволява да получите нещо чрез точка, тогава можете да посочите „.*“ след полето, тогава потребителят ще може да избере подробностите за полето. Например „Номенклатура.*“ ви позволява да сортирате по „Номенклатура.Код“ или да изберете по „Номенклатура.Услуга“. Но „Количество.*“ няма смисъл, тъй като полето „Количество“ няма подробности, което означава, че е достатъчно просто да посочите „Количество“.

Полетата, посочени в конструкцията „SELECT“, ограничават списъка с полета, достъпни за потребителя.
Полетата, посочени в конструкцията „WHERE“, ограничават списъка с полета, които могат да се използват във филтъра.
Полетата, посочени в конструкцията „ORDER BY“, ограничават списъка с полета, които трябва да бъдат сортирани.
Полетата, посочени в конструкцията „PO RESULTS“, ограничават списъка с полета за групиране на суми.

Сега за интересните неща.

Първо, в основния текст на заявката можете също да използвате конструкции (...) в параметрите на източника. Например, ако вместо
| ОТ
| Регистрирай Натрупвания. Оставащи продукти на компанията. Оставащи (&Крайна дата)
посочвам
| ОТ
| Регистър на натрупване. Остатъци от фирмени стоки. Остатъци ((&Крайна дата))
тогава в този случай ще бъде възможно да зададете филтър по полето „Крайна дата“.

В същото време, в първия случай е необходимо да зададете параметъра на създателя на отчети „Крайна дата“, във втория случай това не се изисква, освен това, ако изборът от полето „Крайна дата“ не е зададен, тогава този параметър от таблицата "Регистър на натрупване. Оставащи продукти на компанията. Оставащи остатъци" изобщо няма да се използва. няма да се взема предвид.

Второ, източниците в текста на заявката могат да бъдат маркирани като незадължителни чрез поставянето им в конструкцията „(…)“. Например, ако съставите текст на заявка като този

|ИЗБЕРЕТЕ


| Партиди от стокиCompanyRemains.QuantityRemaining AS QuantityByLots
|(ИЗБЕРЕТЕ
| Останали продукти на компанията Останали продукти Номенклатура AS Номенклатура,
| Оставащи продукти на компанията Remainings.QuantityRemaining AS Количество,
| Партиди от стокиCompanyRemains.QuantityRemaining AS QuantityByLots)
| ОТ
| Регистрирайте Натрупвания. Останали продукти на компанията. Останали AS Останали продукти на компанията Останали
| (ЛЯВА ВРЪЗКА Регистрирайте натрупвания. Партиди от фирмени стоки. Остатъци КАТО остатъци от партиди от фирмени стоки
| Оставащи софтуерни продукти на CompanyRemainings.Nomenclature = Много продукти на CompanyRemainings.Nomenclature)
|РЕЗУЛТАТИ SUM(Количество), SUM(QuantityByBatch) BY
| СА ЧЕСТИ,
| Номенклатура

тогава лявото свързване чрез партиден регистър ще се извърши само ако полето „QuantityByBatch“ присъства в списъка с избрани полета.

трето, в параметрите на източника можете да посочите, че ако са посочени филтри, ако е възможно, да ги приложите не към резултата от заявката с помощта на елемента „WHERE“, а към самия източник. Така че вместо
| RegisterAccumulations.CompanyProductRemains.Remains()

има смисъл да се пише

| Регистър на натрупване. Фирмени стоки Остатъци. Остатъци (, (Номенклатура.*, Фирмен склад.*, Поръчка.*, Цена на дребно, Номенклатурни характеристики.*))

Добре, четвърто, най-вкусната според мен. Ако параметърът „Периодичност“ е посочен в източника (за таблици, които ви позволяват да получавате оборот), той може също да бъде зададен като „(...)“ и в резултат на малка манипулация с текста на заявката на строителя , можем да използваме групиране по периоди.

Пример: |ИЗБЕРЕТЕ РАЗРЕШЕНО | Продуктови партиди Фирмен оборот. Номенклатура, | SUM(Множество продуктиОборот на фирмата.Входящи разходи) КАТО Входящи разходи, | SUM(КомпанияПродукт ПартидиОборот.Потребление на разходи) КАТО Потребление на разходи | |ОТ | Регистър на натрупване. Фирмени стоки Партиди. Оборот(, (&Честота), | (Номенклатура.*)) AS Фирмени стоки Партиди Оборот | |ГРУПИРАНЕ ПО | Партиди СтокиФирмен Оборот.Номенклатура | |РЕЗУЛТАТИ AMOUNT(Входящи разходи), AMOUNT(РазходиРазходи) ПО | ОБЩИ, | Номенклатура | |(ИЗБЕРЕТЕ | Партиди от продукти от оборота на компанията. Номенклатура.*, | Регистратор.*, | Начало на периода (Период, ден) AS PeriodDay, | Начало на периода (Период, седмица) AS PeriodWeek, | Начало на Периодът (Период, Десетилетие) AS PeriodDecade, | Начало на Периода (Период, Месец) AS PeriodMonth, | Начало на Периода (Период, Тримесечие) AS PeriodQuarter, | Начало на Периода (Период, Полугодина) AS PeriodHalf-Year , | Начало на периода(Период, Година) КАТО ПериодГодина, | SUM(Партиди продуктиОборот на фирмата.Получаване на разходи) КАТОПолучаване на разходи, |SUM (Партиди продукти на компаниятаОборот.Разходи) КАК РазходиРазходи) | | | (КЪДЕ | Партиди продукти от оборота на компанията. Номенклатура. *, | Регистратор. *, | СУМА (Партиди стоки от оборота на компанията. Входящи разходи) КАТО разходи за приход, | СУМА (Партиди стоки от оборота на компанията . Разходи за разходи) КАТО Разходи за разходи) | |(РЕЗУЛТАТИ ПО | Номенклатура.*, | Регистратор.*, | Начало на периода(Период, Ден) КАТО ПериодДен, | Начало на Периода(Период, Седмица) КАТО ПериодСедмица, | Начало на Периода(Период, Декада) AS PeriodDecade, | Начало на периода(Period, Month ) AS PeriodMonth, | Начало на периода(Period, Quarter) AS PeriodQuarter, | Начало на периода(Period, Half-Year) AS PeriodHalf-Year, | Начало на периода(Period , Година) КАТО Период Година)

Има едно предупреждение: за да работи групирането по периоди, трябва да добавите филтър по параметъра „Честота“. За да не правите това ръчно, за удобство можете да го добавите програмно, преди да стартирате конструктора на отчети, и да го премахнете след изпълнение, така че да не ви обърква, тъй като от гледна точка на здравия разум е невъзможно да се разбере такова филтър. Направено е нещо подобно

Ако Report Builder.AvailableFields.Find("Честота")<>Недефиниран След това Периодичност = Недефиниран; Ако Report Builder.DimensionsRows.Find("PeriodYear")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodYear")<>Недефиниран Тогава Периодичност = 9; endIf; Ако Report Builder.DimensionsRows.Find("PeriodHalf-Year")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("ПериодПоловина-година")<>Недефиниран Тогава Периодичност = 8; endIf; Ако Report Builder.DimensionsRows.Find("PeriodQuarter")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodQuarter")<>Недефиниран Тогава Периодичност = 7; endIf; Ако ReportBuilder.DimensionsRows.Find("PeriodMonth")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodMonth")<>Недефиниран Тогава Периодичност = 6; endIf; Ако Report Builder.Row Dimensions.Find("PeriodDecade")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodDecade")<>Недефиниран Тогава Периодичност = 5; endIf; Ако ReportBuilder.DimensionsRows.Find("PeriodWeek")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodWeek")<>Недефиниран Тогава Периодичност = 4; endIf; Ако Report Builder.DimensionsRows.Find("PeriodDay")<>Недефинирано ИЛИ Report Builder.DimensionsColumns.Find("PeriodDay")<>Недефиниран Тогава Периодичност = 3; endIf; Ако ReportBuilder.DimensionsRows.Find("Recorder")<>Недефинирано ИЛИ ReportBuilder.DimensionsColumns.Find("Recorder")<>Недефинирано ИЛИ ReportBuilder.SelectedFields.Find("Регистратор")<>Недефиниран Тогава Периодичност = 2; endIf; Ако Честота<>Undefined Then Selection FieldBy Periodicity = Report Builder.Selection.Add("Периодичност"); SelectionFieldByPeriodicity.Value = Периодичност; SelectionFieldByPeriodicity.Use = True; endIf; endIf; Builder.Run(); Ако Избор на поле По периодичност<>Undefined Тогава Report Builder.Selection.Delete(Report Builder.Selection.Index(SelectionFieldByPeriodicity)); endIf;

12. Персонализирайте конструктора

За да дадете възможност на потребителя да промени списъка за групиране, филтъра, избраните полета или сортирането, достатъчно е да създадете атрибута на отчета „Builder“ и да поставите таблично поле във формуляра на отчета и да посочите „Builder.DimensionsRows“, „ Builder.DimensionsColumns" като източник на данни. , "Builder.Selection", "Builder.SelectedFields" или "Builder.Order".

Освен това можете също да посочите „Builder.AvailableFields“ като източник на данни и по този начин, първо, да видите списъка с налични полета, и второ, да използвате контекстно менюдобавяне на полета към групиране, селекция, избрани полета или филтър.

Езикът за заявки в 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 ”.

От получените данни избираме само данни, които отговарят на условието от „КЪДЕ” „Условие за избор на данни”. След това групираме заявката по поле „Име на поле1”, докато сумираме „Име на поле2”. Създаваме общи суми за полето „Име на поле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 Оставащи продукти. QuantityRemaining Е NULL

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

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

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

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

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

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

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

Връзки

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

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

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

Например:

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

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

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

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

Например:

ОТ

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

ОТ

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

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

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

Например:

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

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

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

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

Асоциации

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

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

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

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

ИЗБИРАМ
Валутни курсове Последно напречно сечение Валута КАТО Валута,
Валутни курсове Последно напречно сечение.
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 експерт трябва да знае.

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

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

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

Създател на отчети в 1C - какво е това?

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

  1. Резултатът от заявката;
  2. Област на клетка на документ с електронна таблица;
  3. Таблична частдокумент или справочник;
  4. Набор от записи в регистъра.

В допълнение, конструкторът на отчети в 1C има атрибут „Текст“, към който може да бъде изпратен текстът на заявката, чийто резултат трябва да се види.

Фигура 1 показва секция от код, която ви позволява да използвате „Създателя на отчети“, за да покажете произволна таблица със стойности

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

Между другото, резултатът от изпълнението на кода, показан на фиг. 1, може да се види на фиг. 2

Фиг.2

Настройка на конструктора

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

Подобно на SKD builder, той включва:

  • Групиране (нива на йерархия при извеждане на информация);
  • Индикатори (стойности, за които е необходимо да се получи резултатът);
  • Допълнителни изчисляеми полета (детайли на елемента, резултати от действия със стойности);
  • Филтри (селекции);
  • Сортиране.

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

Алгоритъм за използване на строителя

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

  1. Декларираме създаването на нов обект от типа ReportBuilder;
  2. На този етап можете или да използвате Query Builder, за да създадете текст за селекция, или, като използвате обекта DataSourceDescription, да използвате съществуваща селекция;
  3. Настройките на създателя на отчети могат да бъдат зададени с помощта на метода на обекта на създателя FillSettings();
  4. Можете да откажете да използвате стандартно оформление на дизайна, създадено с помощта на метода за автоматично генериране, като дефинирате свойството Layout обект на строителя;
  5. Ако DataSourceDescription не се използва, на този етап е необходимо да се изпълни заявката, използвайте метода Execute();
  6. Последната стъпка е да стартирате метода Output(); изходът може да бъде направен в документ с електронна таблица или в съответния елемент на формуляр.

Използване на дешифриране в конструктора

Третият ред на фиг. 1 включва декодирането на клетките на резултата от изпълнението на builder.

За да направим това, използвахме свойството Decryption Filling. Типът на това свойство е ReportBuilderDecryptionFillType; то може да приема една от трите стойности:

  1. GroupingValues ​​​​– когато клетка е активирана, ще се използва стойността на групирането, посочено в нея;
  2. Не попълвай – стойността по подразбиране, което означава, че преписът няма да се използва за крайния резултат;
  3. Препис – структурата на преписа ще бъде запълнена със стойностите на всички групи от оригиналната проба.

В допълнение, потребителят има възможност самостоятелно да зададе дешифрирането с помощта на метода ConfigureDecryption(). Кодовата секция, която изпълнява този метод, е показана на фиг. 3

Фиг.3

Пример за използване на конструктора за включване на селекции в отчет

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

  1. Нека започнем, като създадем външен отчет и добавим към него атрибут с произволно име и напишем ReportBuilder (фиг. 4);

Фиг.4

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

Фиг.5

  1. Създаваме процедура OnOpen(), свързана със съответното събитие на нашата форма;

Фиг.6

  1. Кодът, написан в него, трябва задължително да съдържа заявка за конструктора на отчети, пример за код е показан на фиг. 6, за да създадете текста на конструктора, можете да използвате конструктора на заявки, в конструктора, условията на builder и неговите допълнителни настройки са посочени в съответния раздел на фиг. 7;

Фиг.7

  1. Условията за избор, посочени във фигурни () скоби в текста на заявката, ще бъдат изпълнени само ако съответният избор е активиран и използван от потребителя;

  2. Процедурата, която показва резултата от строителя, е представена на фиг. 8 и е свързана с щракване върху бутона Генериране;

Фиг.8

  1. Ние запазваме нашия отчет.

Външният вид на създадения от нас отчет и резултатът от него са показани на Фиг. 9

Фиг.9

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

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

Данните се съхраняват в база данни. 1C заявките са начин за извличане на данни от база данни, за да се покажат на потребителя във форма или да се обработят.

Основната част от отчета е заявката за 1C. В случай на отчет, ACS е най-голямата част от доклада.

Седни. Поеми си дъх. Успокой се. Сега ще ви кажа новината.

За да програмирате в 1C, не е достатъчно да знаете езика за програмиране 1C. Също така трябва да знаете езика за заявки 1C.

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

Освен това е двуезичен - тоест можете да пишете на руски или английски. Той е изключително подобен на езика SQL заявкии тези, които го познават, могат да се отпуснат.

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

Когато потребителят стартира 1C в режим Enterprise, в работещия клиент няма нито един грам данни. Следователно, когато трябва да отворите директория, 1C изисква данни от базата данни, тоест прави 1C заявка.

1C заявките са:

  • Автоматични заявки 1C
    Генерира се автоматично от системата. Създадохте формуляр за списък с документи. Добавена е колона. Това означава, че когато отворите този формуляр в режим Enterprise, ще има заявка и данните за тази колона ще бъдат поискани.
  • Полуавтоматични заявки 1C
    Има много методи (функции) на езика 1C, при достъп до които се прави заявка към базата данни. Например.GetObject()
  • Ръчни 1C заявки (написани от програмиста специално като заявка)
    Можете сами да напишете 1C заявка в код и да я изпълните.

Създаване и изпълнение на 1C заявки

Заявка 1C е действителният текст на заявката на езика на заявката 1C.
Текстът може да бъде написан с химикалки. Тоест вземи и го напиши (ако знаеш този език).

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

След като текстът на заявката 1C е готов, тя трябва да бъде изпълнена. За тази цел в 1C кода Request() има обект. Ето един пример:

Заявка = Нова заявка();
Query.Text = "ИЗБЕРЕТЕ
| Номенклатура.Връзка
| ОТ
| Справочник.Номенклатура AS Номенклатура
|КЪДЕ
| Номенклатура.Обслужване“;
Изберете = Query.Run().Select();

Доклад(Избор.Връзка);
EndCycle;

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

Резултатът може да бъде качен в обикновена таблица:
Fetch = Query.Run().Unload(); //Резултат – таблица със стойности

Или просто обикаляйте ред по ред.
Изберете = Query.Run().Select();
Докато Select.Next() цикъл
//Направете нещо с резултатите от заявката
EndCycle;

Работа с 1C заявки

Основни принципи на 1C заявки

Основни принципи за изграждане на 1C заявка -
ИЗБЕРЕТЕ Списък с полета ОТ Заглавие на таблица WHERE Условия

Пример за конструиране на такава 1C заявка:

ИЗБИРАМ
//списък с полета за избор
връзка,
Име,
Код
ОТ
//име на таблицата, от която избираме данни
//списък с таблици е списък с обекти в прозореца на конфигуратора
Справочник.Номенклатура
КЪДЕТО
//показва избор
Тип продукт = &Услуга //избор по външна стойност
Или услуга // Атрибут „Услуга“ от тип Boolean, избор по стойност True
СОРТИРАНЕ ПО
//Сортиране
Име

Списък на 1C таблици

Можете да видите имената на таблиците в прозореца на конфигуратора. Просто трябва да напишете “Указател” вместо “Указатели”, например “Указател.Номенклатура” или “Документ.Продажби на стоки и услуги” или “Регистър на натрупване.Продажби”.

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

Information Register.RegisterName.Last Slice(&Date) – 1C заявка от информационния регистър, ако е периодична, за определена дата

Accumulation Register.Register Name.Balances(&Date) – 1C заявка от регистъра на балансите за определена дата

Регистър за натрупване.Име на регистър.Оборот (&Начална дата, &Крайна дата) – 1C заявка от оборотния регистър за периода от началната дата до крайната дата.

Допълнителни принципи

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

ИЗБИРАМ
//Quantity(FieldName) – брои количеството
//Field AS OtherName – преименува полето
Количество (връзка) AS Количество публикувани документи
ОТ

КЪДЕТО
Проведено

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

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството
Количество (връзка) AS QuantityBy Organisations
ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО

Организация

Тази заявка 1C ще ни върне броя документи за всяка организация (наричана още „по организация“).

Нека допълнително изчислим количеството на тези документи с помощта на 1C заявка:

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството

//пребройте сумата

ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО
//трябва да се използва, ако списъкът с полета има функция count() и едно или повече полета едновременно - тогава трябва да групирате по тези полета
Организация

Тази заявка от 1C също ще ни върне количеството документи.

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството
Количество (връзка) AS QuantityBy организации,
//пребройте сумата
Сума (DocumentAmount) КАТО сума
ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО
//трябва да се използва, ако списъкът с полета има функция count() и едно или повече полета едновременно - тогава трябва да групирате по тези полета
Организация
ПО РЕЗУЛТАТИ Общи

Езикът за заявки 1C е обширен и сложен и ние няма да разгледаме всичките му възможности в един урок - прочетете следващите ни уроци.

Накратко за допълнителни функции 1C език за заявки:

  • Обединяване на данни от множество таблици
  • Вложени заявки
  • Пакетна заявка
  • Създаване на собствени виртуални маси
  • Заявка от таблица със стойности
  • Използване на вградени функции за получаване и манипулиране на стойности.

1C Query Builder

За да не пишете текста на заявката на ръка, има дизайнер на заявки 1C. Просто щракнете с десния бутон навсякъде в модула и изберете 1C Query Designer.

Изберете желаната таблица отляво в дизайнера на заявки 1C и я плъзнете надясно.

Изберете необходимите полета от таблицата в дизайнера на заявки 1C и плъзнете надясно. Ако желаете не само да изберете поле, но и да приложите към него някаква функция за сумиране, след като плъзнете, кликнете върху полето два пъти с мишката. След това в раздела Групиране ще трябва да изберете (плъзнете) необходимите полета за групиране.

В раздела Условия в дизайнера на заявки 1C можете да изберете необходимите селекции по същия начин (чрез плъзгане на полетата, чрез които ще направите избора). Не забравяйте да изберете правилното състояние.

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

С помощта на дизайнера на заявки 1C можете да изучавате всяка съществуваща заявка. За да направите това, щракнете с десния бутон върху текста на съществуваща заявка и изберете 1C дизайнер на заявки - и заявката ще бъде отворена в 1C дизайнера на заявки.

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

  • Таблица със стойности,
  • Заявка за резултат,
  • Площ на клетките на табличен документ,
  • таблична част,
  • Регистър за натрупване Набор от записи,
  • Информация RegisterRecordSet,
  • Счетоводен регистър Набор от записи,
  • Изчисляване RegisterRecordSet.
За да може конструкторът на отчети да показва отчет за произволен източник на данни, е достатъчно да зададете описанието на източника на данни в свойството DataSource builder. Свойството DataSource на съставителя на отчети може да съдържа стойност от тип DataSourceDescription. Обектът DataSourceDescription съдържа самия източник на данни и също така съдържа описание на колоните на източника на данни. Всяко описание на колона с източник на данни съдържа:
  • Име - съдържа името на колоната в източника на данни,
  • DataPath – съдържа описание на зависимостта на колоните една от друга. Колона, чийто път на данни е получен чрез точка от пътя на данни на друго поле, се счита за атрибут на другата колона. Ако дадено поле съдържа думата Представяне, разделена с точка, тогава това поле се счита за представяне на колоната от пътя до данните, от които е получено представянето. Примери. Ако колоната „Номенклатура“ има път към данните „Номенклатура“, а колоната „Код“ има път към данните „Номенклатура.Код“, тогава тази колона ще се счита за атрибут на колоната „Номенклатура“. Колоната с пътя към данните "Номенклатура.Представяне" ще се счита за представяне на колоната "Номенклатура",
  • Поле - знак, че тази колона може да се използва като поле за отчет,
  • Ред - знак, че подреждането е възможно за дадена колона,
  • Изборът е знак, че е възможно да се наложи селекция върху дадена колона,
  • Измерение - знак, че тази колона може да се използва като групиране на отчети,
  • Общо - ред, съдържащ израз за изчисляване на общата сума. За създателя на отчет изразът на този ред съответства на израза за изчисляване на общата сума, използван в езика на заявката,
Когато зададете източник на данни на обекта DataSourceDescription, описанията на колоните се създават и попълват автоматично.

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

Пример за настройка на източник на данни за създателя на отчети:

ReportBuilder.DataSource = NewDataSourceDescription(ValueTableResult);

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

Работата на конструктора на заявки с персонализиран източник на данни е идентична с работата с персонализиран източник на конструктора на отчети.



Свързани публикации