Робота з підсумками в запиті - 1с простою мовою
Таким чином, ми отримали дані з трьома підсумковими записами і з чотирма детальними записами.
Сподіваюся, Ви зрозуміли відміну підсумків від угруповання! Тепер перейдемо до практики.
Ключове слово ПІДСУМКИ
Завдання 1. Налаштувати підсумки для поля Номенклатура табличній частині Товари документа РеалізаціяТоваровУслуг.
Відкриємо консоль запитів і в конструкторі запиту і визначимо джерело даних і вихідні поля.

Переконаємося, що є хоч якісь дані, виконавши запит.

Відобразився звичайний лінійний список. Поїхали далі. Тепер налаштуємо підсумки по полю Номенклатура. Для цього в конструкторі запиту існує закладка Підсумки. де вказуються группіровочние поля і підсумкові поля. У группіровочних полях вказуються поля, за якими будуть виходити підсумки, а в підсумкових полях вказуються поля за якими буде відбуватися підсумовування даних.

Тепер подивимося, який вийде результат (для наочності спосіб вивантаження поміняємо на Дерево).

Сподіваюся, тут все зрозуміло? Як ні? А зараз?

Простіше вже нікуди!
А тепер подивимося на отриманий текст запиту:
ВИБРАТИ
РеалізаціяТоваровУслугТовари.Номенклатура ЯК Номенклатура,
РеалізаціяТоваровУслугТовари.Колічество,
РеалізаціяТоваровУслугТовари.Сумма ЯК Сума
З
Документ.РеалізаціяТоваровУслуг.Товари ЯК РеалізаціяТоваровУслугТовари
ПІДСУМКИ
СУМА (Сума)
ПО
номенклатура
Як бачимо, в текст запиту були додані ключові слова ПІДСУМКИ і ПО. Після ключового слова ПІДСУМКИ слід список підсумкових полів. Якщо підсумки вважаються для декількох полів, то поля перераховуються через кому. Як підсумкових полів зазвичай виступає результат агрегатних функцій. Потім слід ключове слово ПО. після якого перераховується список полів, для яких вважаються підсумки - контрольні точки.
Підсумкові поля можуть розраховуватися необов'язково для всіх вихідних полів. До речі, можете переконатися в цьому, видаливши рядок СУМА (Сума).
Загалом, нічого складного немає. Потрібно всього лише "погратися" з підсумковими полями в консолі запитів і все стане зрозуміло. Наприклад, додати кілька контрольних точок і подивитися на результат.
- Пограй зі мною, попросив Мова Запитів.
Завдання 2: Переконатися, що одночасно можна використовувати підсумки і угруповання.
Переконатися в цьому легко - одночасно в консолі запитів налаштувати угруповання в секції Угруповання і налаштувати підсумки в секції Підсумки. Сподіваюся, з цим Ви самі впораєтеся.
Хочу лише звернути увагу на два моменти:
1) Якщо підсумки використовуються спільно з угрупованням і для підсумків не вказано список агрегатних функцій, то підсумкові поля будуть ВСЕ ОДНО формуватися автоматично з агрегатних полів списку вибірки угруповання. Якось занадто складно пояснив.
Коротше, в даному тексті запиту не обов'язково писати СУМА (Кількість)
ВИБРАТИ
РеалізаціяТоваровУслугТовари.Номенклатура ЯК Номенклатура,
СУМА (РеалізаціяТоваровУслугТовари.Колічество) ЯК Кількість
З
Документ.РеалізаціяТоваровУслуг.Товари ЯК РеалізаціяТоваровУслугТовари
згруповані за
РеалізаціяТоваровУслугТовари.Номенклатура
ПІДСУМКИ
СУМА (Кількість)
ПО
номенклатура
2) Якщо запит містить об'єднання, то агрегатні функції для підсумків будуть братися з першого запиту.
Підсумки для ієрархічних довідників
Якщо контрольна точка є посиланням на довідник, то можливий розрахунок підсумків за ієрархією довідника. Для цього після контрольної точки потрібно вказати ключове слово ИЕРАРХИЯ.
Наприклад, є текст запиту:
ВИБРАТИ
ВТ_Прімер.Номенклатура ЯК Номенклатура,
ВТ_Прімер.Колічество ЯК Кількість
З
ВТ_Прімер ЯК ВТ_Прімер
ПІДСУМКИ
СУМА (Кількість)
ПО
номенклатура
який повертає наступні дані:

У разі, якщо в запиті вказати ключове слово ИЕРАРХИЯ
ПО
Номенклатура ИЕРАРХИЯ ЯК ІерархіяНоменклатури
то результат запиту поверне підсумки по контрольним точкам і підсумки по ієрархії для контрольних точок.

У разі, якщо потрібно розрахувати ТІЛЬКИ ПІДСУМКИ значень за ієрархією, не розраховуючи підсумки в контрольних точках, то перед ключовим словом ИЕРАРХИЯ потрібно вказати слово ТІЛЬКИ.
ПО
Номенклатура ТІЛЬКИ ИЕРАРХИЯ ЯК ТолькоІерархіяНоменклатури
Завдання 3: Самостійно познайомитися з прапором Загальні підсумки.

Нічого складного немає. Просто встановіть даний прапор і подивіться результат виконання запиту, а також зверніть увагу на те, як змінився текст запиту.
Обхід результату запиту з підсумками
Завдання 4: Розібратися, як реалізований обхід результату запиту з підсумками.
Розберемо даний механізм на досить цікавою реальній задачі, яку мені колись доводилося вирішувати. Необхідно реалізувати звіт у вигляді крос-таблиці без використання СКД.
Для навчальних цілей нехай звіт повинен виглядати так:
1) Намалювати макет табличного документа.
Думаю, тут все зрозуміло. Найпростіший макет з чотири області: ОбластьШапкаФрукт, ОбластьШапкаКонтрагент, ОбластьСтрокаФрукт, ОбластьСтрокаКолічество.
2) Написати сам текст запиту:
ЗакупкаФруктовОбороти.Контрагент ЯК Контрагент,
ЗакупкаФруктовОбороти.Фрукт ЯК Фрукт,
ЗакупкаФруктовОбороти.КолічествоОборот ЯК КолічествоОборот
З
РегістрНакопленія.ЗакупкаФруктов.Обороти (ДатаНачала, Дата закінчення. ) ЯК ЗакупкаФруктовОбороти
ПІДСУМКИ
СУМА (КолічествоОборот)
ПО
контрагент,
фрукт
Даний запит отримає спочатку підсумки по Контрагенту. далі будуть отримані підсумки по фруктах. а деталізація по КолічествоОборот.
Буде виглядати приблизно так (сподіваюся, ніде не помилився):
Підсумки по полю Контрагент.
Підсумки по полю Фрукт.

Деталізація по КолічествоОборот.

А тепер починається найцікавіше.
3) Заповнити макет табличного документа.
Можливо, Ви вже здогадалися для чого були підраховані підсумки. Правильно! Для того, щоб було чим заповнювати макет табличного документа.
Отримати всіх контрагентів можна шляхом обходу підсумків по полю Контрагент.
РезультатЗапроса = Запит. Виконати ();
ВиборкаКонтрагент = РезультатЗапроса. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Контрагент");
Поки ВиборкаКонтрагент. Наступний () Цикл
ОбластьШапкаКонтрагент. Параметри. Заповнити (ВиборкаКонтрагент);
ТаблічнийДокумент. Приєднати (ОбластьШапкаКонтрагент);
КонецЦікла;
Таким способом буде заповнена шапка таблиці контрагентами: П'ятачок, Ярмарок, Три Тополі.
Хочу звернути увагу на параметри ОбходРезультатаЗапроса.ПоГруппіровкам і Контрагент. Вказуючи дані параметри ми системі говоримо, що потрібно вибрати підсумкові записи по Контрагенту. Якщо дані параметри не вказувати, то буде звичайна лінійна вибірка.
Далі, необхідно через підрядник вивести фрукт і його кількість закупівлі у контрагента, зазначеного в шапці звіту.
Вибірка по фруктам:
ВиборкаФрукт = РезультатЗапроса. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Фрукт");
Далі починаємо обходити вибірку з результату запиту:
ВиборкаФрукт = РезультатЗапроса. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Фрукт");
Поки ВиборкаФрукт. Наступний () Цикл
ОбластьСтрокаФрукт. Параметри. Заповнити (ВиборкаФрукт);
ТаблічнийДокумент. Вивести (ОбластьСтрокаФрукт);
КонецЦікла;
Відмінно! Залишилося тільки придумати, як заповнити інші осередки!
Тут є невелика хитрість. У типу ВиборкаІЗРезультатаЗапроса є метод Вибрати (). де в якості параметра можна вказати також угруповання, в нашому випадку це буде "Контрагент".
Пояснюю простою мовою.
У ВиборкаФрукт скільки у нас буде записів? Правильно, три:
Наприклад, поточна позиція перша запис (NULL, Яблуко, 600), у якій тип ВиборкаІЗРезультатаЗапроса. Якщо ми поточну вибірку обійдемо по групі Контрагент. то отримаємо якраз необхідний результат:
ВиборкаКонтрагент = ВиборкаФрукт. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Контрагент". "ВСЕ");
Поки ВиборкаКонтрагент. Наступний () Цикл
ОбластьСтрокаКолічество. Параметри. Заповнити (ВиборкаКонтрагент);
ТаблічнийДокумент. Приєднати (ОбластьСтрокаКолічество);
КонецЦікла;
Зверніть на параметр "ВСЕ". Вказуючи даний параметр ми системі говоримо обійти вибірку по всім трьом контрагентам, саме тому, в ВиборкаКонтрагент буде 3 записи (тому що всього три контрагента):
Якби поточна позиція була б 3 запис (NULL, Апельсин, 80), то в ВиборкаКонтрагент все одно буде 3 записи:
Зверніть увагу на записи із значенням NULL в осередках (значить по таким контрагентам не було закупівлі фруктів).
Якщо не вказати параметр "ВСЕ", то в ВиборкаКонтрагент була б тільки 1 запис:
Вообщем, вказуючи параметр "ВСЕ" ми обходимо послідовно всіх контрагентів і послідовно заповнюємо осередки табличного документа.
ВиборкаФрукт = РезультатЗапроса. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Фрукт");
Поки ВиборкаФрукт. Наступний () Цикл
ОбластьСтрокаФрукт. Параметри. Заповнити (ВиборкаФрукт);
ТаблічнийДокумент. Вивести (ОбластьСтрокаФрукт);
ВиборкаКонтрагент = ВиборкаФрукт. Вибрати (ОбходРезультатаЗапроса. ПоГруппіровкам. "Контрагент". "ВСЕ");
Поки ВиборкаКонтрагент. Наступний () Цикл
ОбластьСтрокаКонтрагент. Параметри. Заповнити (ВиборкаКонтрагент);
ТаблічнийДокумент. Приєднати (ОбластьСтрокаКонтрагент);
КонецЦікла;
КонецЦікла;
А я пішов далі дивитися футбол матч Ліги Чемпіонів Ростов - Атлетіко.
Сподобалося? Не забудь підтримати сайт!
Спасибі за ще одну цікаву статтю.
А можна приклад роботи із запитами, в об'єкті конфігурації "обробка"?
Наприклад потрібно створити запит, який виводив на форму обробки табличної частини з колонками: контрагент, склад, сума.
І вважав загальну суму і виводячи підсумок на форму обробки у вигляді поля
Я програміст, в інтернеті не знайшов подібних, напевно простих прикладів для досвідчених програмістів, може тут помогут-)
P.S. Вболіваємо за Ростов)
Ех ... Програв Ростов ...
Дякую за відгук.
З приводу Вашого прикладу.
Значить так, в конфігурації є якась обробка «Приклад». У неї є таблична частина «Інформація» з колонками «Контрагент», «Склад» і «Сума».
Створюємо форму, в якій розміщуємо нашу табличну частину.
На формі є кнопка «Заповнити». За кнопці «Заповнити» виконується якийсь запит, який заповнює табличну частину?
Підсумки по колонці «Сума» Ви хочете бачити саме в окремому полі або підвалі табличній частині?
Є конфігурація в якій є документ "продаж товарів"
1. Зробити запит за період з документом: продаж товару;
1.1 Винести на форму обробки табличної частини з колонками: контрагент, склад, сума;
1.2 порахувати загальну суму і винести підсумок на форму обробки у вигляді поля;
Ось так дослівно звучить завдання ...
Але ось як це зробити саме в "Обробки" не знаю. Тому може у Вас є, детальний приклад подібної завдання-)
Перепрошую, якщо не грамматно пояснюю ...
А, ну тоді в формі обробки потрібно розмістити ще два поля: ДатаНачала і ДатаОкончанія.
Це потрібно зробити в звичайній формі або у керованій? Відповім на ваше запитання у вигляді окремої статті ближче до вихідних.