1с 8.3 звіт скд обчислювані поля. Корисні приклади складання схеми компонування даних. Залишок від ділення

  • 1С-Бітрікс
  • Одна з найважливіших областей бізнес-софту – це звітність. Від того, наскільки легко налаштувати під мінливі потреби бізнесу (і законодавства) існуючий звіт або зробити новий, може залежати (причому не в переносному сенсі!) доля бізнесу, чи то звіт для податкової інспекції, чи діаграма залежності попиту на товари від сезону та інших факторів . Потужна та гнучка система звітності, що дозволяє легко витягти з системи потрібні дані, представити їх у доступному для розуміння вигляді, що дозволяє кінцевому користувачеві переналаштувати стандартний звіт так, щоб побачити дані в новому світлі – це ідеал, якого повинна прагнути кожна бізнес-система.

    У платформі «1С:Підприємство» за побудову звітів відповідає механізм під назвою «Система компонування даних» (скорочено СКД). У цій статті ми намагатимемося дати короткий описідеї та архітектури механізму СКД та його можливостей.


    СКД – це механізм, що ґрунтується на декларативному описі звітів. СКД призначений для побудови звітів та для виведення інформації, що має складну структуру. До речі, окрім розробки звітів, механізм СКД також використовується в «1С:Підприємстві» в динамічному списку, засобі показу спискової інформації з багатою функціональністю (показ плоских та ієрархічних списків, умовне оформлення рядків, угруповання тощо).

    Трохи історії

    У першій версії платформи «1С:Підприємство 8», версії 8.0, звіти робилися так:
    1. Писав один або декілька запитів мовою запитів 1С (SQL-подібна мова, детальніше про неї нижче).
    2. Писав код, який переносив результати виконаних запитів у табличний документ або діаграму. Код також міг виконувати роботу, яку у запиті зробити неможливо – наприклад, обчислював значення, використовуючи вбудовану мову 1С.
    Підхід прямолінійний, але не найзручніший – візуальних налаштувань мінімум, все доводиться програмувати «врукопашну». А один із козирів на той момент зовсім нової платформи «1С:Підприємство 8» - це мінімізація у прикладному рішенні обсягу коду, який потрібно писати вручну, зокрема, за рахунок візуального проектування. Логічно було б піти цим шляхом і в механізмі побудови звітів. Що й було зроблено шляхом розробки нового механізму – Системи Компонування Даних.

    Однією з ідей, що лягли в основу СКД, була гнучкість і настроюваність звітів, причому доступна як розробнику, так і кінцевому користувачеві. В ідеалі хотілося б дати доступ кінцевому користувачеві до того ж набору інструментів для дизайну звіту, що й розробнику. Логічно було б зробити єдиний набір інструментів, доступний для всіх. Ну а раз інструменти припускають участь кінцевого користувача - значить, потрібно використання програмування в них прибрати до мінімуму (найкраще - усунути зовсім), і максимально використовувати візуальні налаштування.

    Постановка задачі

    Завдання перед командою розробки стояло таке – створити систему створення звітів, засновану не так на алгоритмічному (тобто через написання коду), але в декларативному підході до створення звітів. І ми вважаємо, що завдання успішно вирішили. На наш досвід, близько 80% необхідної звітності може бути реалізована за допомогою СКД без єдиного рядка коду (за винятком написання формул обчислюваних полів), здебільшого - через візуальні налаштування.
    Розробка першої версії СКД зайняла близько 5 людино-років.

    Дві мови

    У створенні звітів задіяно дві мови. Одна – мова запитів, яка використовується для вибірки даних. Друга – мова виразів компонування даних, призначений для запису виразів, що використовуються в різних частинах системи, наприклад, в налаштуваннях компонування даних, для опису виразів полів користувача.

    Мова запитів

    Мова запитів заснована на SQL і легко освоюється знаючими SQL. Приклад запиту:

    Легко бачити аналоги стандартних для SQL-запиту секцій – SELECT, FROM, GROUP BY, ORDER BY.

    При цьому мова запитів містить значну кількість розширень, орієнтованих на відображення специфіки фінансово-економічних завдань та на максимальне скорочення зусиль розробки прикладних рішень:

    • Звернення до полів через точку. Якщо поля будь-якої таблиці мають тип посилання (зберігають посилання на об'єкти іншої таблиці), розробник може в тексті запиту посилатися на них через ".", при цьому кількість рівнів вкладеності таких посилань система не обмежує (наприклад, Замовлення Клієнта. Угода. Організація. телефон).
    • Багатовимірне та багаторівневе формування підсумків. Підсумки та підсумки формуються з урахуванням угруповання та ієрархії, обхід рівнів може виконуватися в довільному порядку з підбиттям підсумків, забезпечується коректна побудова підсумків за тимчасовими вимірами.
    • Підтримка віртуальних таблиць. Віртуальні таблиці, що надаються системою, дозволяють отримати практично готові дані більшості прикладних завдань без необхідності складання складних запитів. Так, віртуальна таблиця може надати дані щодо залишків товарів у розрізі періодів на якийсь момент часу. При цьому віртуальні таблиці максимально використовують інформацію, що зберігається, наприклад, раніше розраховані підсумки і т.д.
    • Тимчасові таблиці. Мова запитів дозволяє використовувати у запитах тимчасові таблиці. З їхньою допомогою можна підвищити продуктивність запитів, у деяких випадках знизити кількість блокувань і зробити текст запиту легшим для сприйняття.
    • Пакетні запити Для зручнішої роботи з тимчасовими таблицями у мові запитів підтримується робота з пакетними запитами - в такий спосіб, створення тимчасової таблиці та її використання поміщаються однією запит. Пакетний запит є послідовністю запитів, розділених точкою з комою (";"). Запити в пакеті виконуються один за одним. Результатом виконання пакетного запиту, залежно від використовуваного методу, буде або результат, який повертається останнім запитом пакета, або масив результатів всіх запитів пакета в тій послідовності, в якій слідують запити пакета.
    • Отримання уявлень посилальних полів. Кожна об'єктна таблиця (у якій зберігається довідник чи документ) має віртуальне поле - «Уявлення». Це поле містить текстове представлення об'єкта та полегшує роботу творця звітів. Так, для документа це поле містить всю ключову інформацію - назву типу документа, його номер і дату (наприклад, «Продаж 000000003 від 06.07.2017 17:49:14»), позбавляючи розробника від написання поля, що обчислюється.
    • та ін.
    Механізм запитів автоматично модифікує запит з урахуванням ролей, до яких належить користувач, від імені якого виконується запит (тобто користувач побачить лише ті дані, які має право бачити) та функціональних опцій (тобто відповідно до налаштованої у прикладному рішенні) функціональністю).

    Є також спеціальні розширення мови запитів для СКД. Розширення здійснюється за допомогою спеціальних синтаксичних інструкцій, що укладаються у фігурні дужки та розміщуються безпосередньо в тексті запиту. За допомогою розширень розробник визначає які операції кінцевий користувач зможе проводити, налаштовуючи звіт.

    Наприклад:

    • ВИБРАТИ. У цій пропозиції описуються поля, які користувач зможе вибирати для виведення. Після цього ключового слова через кому перераховуються псевдоніми полів з основного списку вибірки запиту, які будуть доступними для налаштування. Приклад: (ВИБРАТИ Номенклатура, Склад)
    • ДЕ. Описуються поля, куди користувач зможе накладати відбір. У цій пропозиції використовуються поля таблиць. Використання псевдонімів полів списку вибірки є неприпустимим. Кожна частина об'єднання може містити власний елемент ДЕ. Приклади: (ДЕ Номенклатура.*, Склад), (ДЕ Документ.Дата >= &ДатаПочатку, Документ.Дата<= &ДатаКонца}
    • та ін.
    Приклад використання розширень:

    Мова виразів компонування даних

    Мова виразів компонування даних призначений для запису виразів, що використовуються, зокрема, для опису виразів полів користувача. СКД дозволяє визначати у звіті поля користувача, використовуючи або власні вирази, або набори варіантів з умовами їх вибору (аналог CASE в SQL). Поля користувача є аналогом обчислюваних полів. Вони можуть задаватися як у конфігураторі, так і в режимі «1С:Підприємство», але у виразах полів користувача не можна використовувати функції загальних модулів. Тому поля користувача призначені швидше для користувача, ніж для розробника.

    Приклад:

    Процес створення звіту на СКД

    При створенні звіту нам потрібно створити макет, який визначає, як дані відображатимуться у звіті. Можна створити макет, який базується на схемі компонування даних. Схема компонування даних визначає суть даних, що надаються звітом (звідки отримувати дані і як можна керувати їх компонуванням). Схема компонування даних є базу, основі якої можуть бути сформовані всілякі звіти. Схема компонування даних може містити:
    • текст запиту з інструкціями системи компонування даних;
    • опис кількох наборів даних;
    • докладний опис доступних полів;
    • опис зв'язків між кількома наборами даних;
    • опис параметрів отримання даних;
    • опис макетів полів та угруповань;
    • та ін.

    Наприклад, можна як набору даних додати в схему компонування даних запит, і викликати конструктор запиту, що дозволяє в графічному вигляді скласти запит довільної складності:

    Підсумком запуску конструктора запитів буде текст запиту (мовою запитів «1С:Підприємства»). Цей текст можна за необхідності скоригувати вручну:

    Наборів даних у схемі компонування даних може бути кілька, набори даних можуть бути пов'язані в макеті довільним чином, можуть бути додані поля, задані параметри звіту і т.п. Варто згадати цікаву особливість роботи механізму запитів у 1С:Підприємстві. Запити зрештою транслюються у діалект SQL, специфічний для СУБД, з якою безпосередньо працює додаток. Ми взагалі намагаємося задіяти можливості серверів СУБД по максимуму (нас обмежує те, що ми використовуємо тільки ті можливості, які є одночасно у всіх підтримуваних платформою «1С:Підприємство» СУБД – MS SQL, Oracle, IBM DB2, PostgreSQL). Таким чином, на рівні запиту в обчислюваних полях ми можемо використовувати ті функції, які транслюються в SQL.

    А ось на рівні схеми компонування даних ми вже можемо додавати поля користувача і використовувати в них функції вбудованою мовою розробки 1С (у тому числі й написані нами), що сильно розширює можливості звітів. Технічно це виглядає так - все, що можна транслювати в SQL, транслюється в SQL, запит виконується на рівні СУБД, результати запиту поміщаються в пам'ять сервера додатків 1С і СКД обчислює для кожного запису значення полів, що обчислюються, чиї формули написані мовою 1С.


    Додавання полів користувача

    До звіту можна додати довільну кількість таблиць та діаграм:


    Дизайнер звітів


    Звіт під час виконання

    За допомогою СКД користувач може додавати до звіту складні відбори (які будуть додані до запиту в потрібних місцях), умовне оформлення (що дозволяє по-різному форматувати – шрифтом, кольором тощо – поля, що виводяться в залежності від їх значень) та багато іншого .

    Коротко описати процес побудови та формування звіту можна так:

    • Розробник у design time за допомогою дизайнера (або в runtime за допомогою коду) визначає схему компонування даних:
      • Текст запиту/запитів
      • Опис обчислюваних полів
      • Зв'язки між запитами (якщо їх декілька)
      • Параметри звіту
      • Параметри за замовчуванням
      • І т.д.
    • Вищеописані налаштування зберігаються в макеті
    • Користувач відкриває звіт
      • Можливо, робить додаткові налаштування (наприклад, змінює значення параметрів)
      • Натискає кнопку "Сформувати"
    • Установки користувача застосовуються до схеми компонування даних, визначеної розробником.
    • Формується проміжний макет компонування даних, що містить інструкції, звідки отримувати дані. Зокрема, коригуються запити, задані у макеті. Так, із запиту видаляються поля, які не використовуються у звіті (це робиться з метою мінімізувати обсяг отриманих даних). У запит додаються всі поля, що беруть участь у формулах полів, що обчислюються.
    • У справу включається процесор компонування даних. Процесор компонування виконує запити, здійснює зв'язок наборів даних, розраховує значення полів і ресурсів, що обчислюються, виконує угруповання. Словом, робить усі розрахунки, які були виконані лише на рівні СУБД.
    • Процесор виведення даних запускає запит виконання і виводить отримані дані в табличний документ, діаграму тощо.


    Процес формування звіту механізмом СКД

    Ми намагаємося мінімізувати обсяг даних звітів, що передаються з сервера до клієнтського додатку. При показі даних у табличному документі при відкритті табличного документа ми передаємо з сервера ті рядки, які користувач бачить на початку документа. У міру просування користувача по рядках документа на клієнта підкачуються з сервера дані, що відсутні.

    Налаштування користувача

    Весь інструментарій СКД доступний як розробнику, так і кінцевому користувачеві. Але практика показала, що кінцевого користувача часто лякає безліч можливостей інструменту. Тим більше, що в більшості випадків вся потужність налаштувань кінцевому користувачеві і не потрібна – йому достатньо мати швидкий доступ до налаштування одного-двох параметрів звіту (наприклад, періоду та контрагента). Починаючи з певної версії платформи, у розробника звіту з'явилася можливість відзначити, які налаштування звіту доступні користувачеві. Робиться це за допомогою прапорця «Включати в налаштування користувача». Також у налаштувань звіту з'явився прапор «Режим відображення», який приймає одне з трьох значень:
    • Швидкий доступ. Налаштування буде виведено безпосередньо у верхню частину вікна звіту.
    • Звичайний. Налаштування буде доступне за допомогою кнопки «Налаштування».
    • Недоступне. Налаштування буде недоступне кінцевому користувачеві.


    Режим відображення налаштування у design time


    Відображення налаштувань у режимі «Швидкий доступ» під час виконання (під кнопкою «Сформувати»)

    Плани розвитку

    Один із пріоритетних напрямків у розвитку СКД для нас – спрощення налаштувань користувача. Наш досвід показує, що для частини кінцевих користувачів робота з налаштуваннями користувача - все ще серйозна праця. Ми це враховуємо та працюємо в цьому напрямку. Відповідно, і розробникам також простіше працювати з СКД, т.к. ми, як і раніше, хочемо надавати єдиний інструментарій налаштування звітів як для розробника, так і для кінцевого користувача.

    Схема компонування даних (1С СКД)- зручний конструктор для створення в програмних продуктах 1С: Підприємство складних звітів, що сприяють розвитку та відстеженню автоматизації виробництва, що дозволяють зробити їх максимально гнучкими та красивими за мінімум часу. Додатковий плюс Схеми компонування даних (1С СКД) - автоматичне формування керованої форми звіту, а при подальшому розвитку даного напряму є важливим фактором при виборі методу розробки звіту. Але через складність структури Схеми компонування даних (1С СКД) та величезної кількості налаштувань часто призводить до більш тривалої розробки звіту, ніж через «конструктор вихідної форми». Тому програмісту 1С необхідно розбиратися в усіх тонкощах роботи Схеми компонування даних (1С СКД), щоб надалі прискорити час розробки звітів.

    Розберемо перші три вкладки Схеми компонування даних (1С СКД) – набір даних, зв'язку набору даних та поля, що обчислюються.

    Набір даних у 1С СКД

    Набір даних включає можливість створення трьох об'єктів – запит, об'єкт та об'єднання, зупинимося докладніше на кожному з них:

    Є звичайним запитом, який формується за кнопкою Конструктор запиту. Якщо встановлено прапорець Автозаповнення, всі вибрані реквізити автоматично потраплять у поля набору даних. Також є можливість самим налаштувати заповнення полів у запиті на вкладці Компонування даних, де знаходяться три вкладки:

    Таблиці, тут вибираються таблиці, які братимуть участь у формуванні звіту, зазвичай вибираються дані за умовчанням, оскільки у вкладці Таблиці і поля ми вже вибрали потрібні нам документи, довідники, регістри…

    Поля, тут ми вибираємо ті об'єкти, які повинні потрапити до звіту, прапор дочірні вказує, чи будуть доступні дочірні елементи по об'єкту чи ні, логічно, що рядкові, числові та подібні дані не можна буде встановити прапор у положення Істина.

    Умови тут ми вибираємо ті об'єкти, які можна буде використовувати в умовах у СКД.

    Частина роботи виконується у схемі компонування даних, частина програмно, розглянемо на простому прикладі:

    Спочатку створимо макет схема компонування даних документа і назвемо СКД (наприклад: 1С СКД), у ньому створюємо набір даних об'єкт, далі заповнюємо поля, наприклад, маємо у документа табличну частину товари з реквізитами – номенклатура, кількість і ціна.

    Додамо три поля і заповнюємо по кожному стовпчику поле найменуванням реквізитів, інші стовпчики заповняться автоматично:

    Створимо кнопку на формі документа, опишемо механізм роботи в керованих формах:

    &На Клієнті

    Процедура Друк()

    НашЗвіт = ДрукНаСервері(); //викликаємо функцію на сервері

    НашЗвіт.Показати(); //виводимо сформований звіт

    КінецьПроцедури

    &На сервері

    Функція ДрукНа Сервері()

    Об'єктДокумента = РеквізитФормиЗначення("Об'єкт");

    //поміщаємо табличну частину Товари в структуру з найменуванням Товари СКД так само, як ми вказали в самій СКД ім'я об'єкта, що містить дані

    НабірДаних = Новий Структура;

    НабірДаних.Вставити(“ТовариСКД”, Об'єктДокумента.Товари);

    //отримуємо наш макет і виставляємо налаштування за замовчуванням, щоб усі налаштування виводу звіту бралися з нашого макета

    НашМакет = Об'єктДокумента. ОтриматиМакет("СКД");

    Параметри = НашМакет.ПараметриЗа замовчуванням;

    //створюємо макет компонування даних з нашими налаштуваннями

    КомпонувальникМакета = Новий КомпонувальникМакетаКомпонуванняДаних;

    МакетКомпонування = КомпонувальникМакета.Виконати(НашМакет, Налаштування);

    //виконуємо компонування даних з нашим набором даних

    ПроцесорКомпонуванняДаних = Новий ПроцесорКомпонуванняДаних;

    ПроцесорКомпонівкиДаних.Ініціалізувати(МакетКомпонівки, НабірДаних);

    //формуємо табличний документ та виводимо в нього наш звіт

    ДокументЗвіту = Новий ТабличнийДокумент;

    ПроцесорВиводу = Новий ПроцесорВиводуРезультатуКомпонуванняДанихВТабличнийДокумент;

    ПроцесорВиводу.ВстановитиДокумент(ДокументЗвіту);

    Процесор Виводу.Вивести(ПроцесорКомпонуванняДаних);

    Повернення ДокументЗвіту;

    КінецьФункції

    За бажання можна отримати області та будь-якого іншого макета і так само вивести в даному звіті, наприклад, маємо типовий макет формування платіжки і в ньому дуже добре створена шапка, тоді, щоб нам не робити зайву роботу, просто спочатку отримаємо макет, виведемо шапку, потім сформуємо та виведемо наш звіт на СКД.

    Про єднання

    У нього ми можемо поміщати наші запити та об'єкти, але на відміну від зв'язку, він просто додає таблиці один до одного, тобто якщо ми зв'яжемо дві однакові таблиці, то отримаємо в результаті одну, а при об'єднанні, вона подвоїться, розглянемо на простому прикладі :

    Маємо таблиці:

    При зв'язку ми отримаємо:

    А при об'єднанні:

    Розглянемо тепер заповнення колонок у наборах даних (деякі пропустимо, оскільки пов'язані з іншими вкладками, до них повернемося до майбутніх статей):

    - поле, Вказуємо загальну назву реквізиту;

    ­­- шлях, Вказуємо назву реквізиту, яким будемо до нього звертатися в СКД, наприклад, в обчислюваних полях;

    - Заголовок, Вказуємо найменування реквізиту, яке буде виводиться у звіті;

    - обмеження поля, Вказуємо доступність даного реквізиту;

    - обмеження реквізитів, вказуємо доступність дочірніх елементів, важливо, якщо вказана доступність реквізитів, то й саме поле буде доступне, можливо, у майбутніх релізах змінять дану механіку;

    - вираз, за ​​яким обчислюється подання поле, зручно використовувати, коли нам потрібно змінити трохи виведення реквізитів, наприклад, нам потрібно, щоб після імені номенклатурививодився склад, На якому знаходиться вона, тоді заповнимо наступне: Номенклатура + "перебуває на складі" + Склад. Повторюся, що звернення реквізитів здійснюється через назву, вказану в колонці шлях;

    - вираз упорядкування, зручний механізм налаштування упорядкування звіту, де умову можна задати вручну, аналогічно попередньому пункту, але, як показує практика, часто цей механізм працює не так, як хотілося б, і раджу користуватися стандартним сортуванням;

    - тип значення, вказується тип значення реквізиту, заповнювати необхідно, якщо користуватиметеся наступним полем;

    - доступні значення, працює лише при заповненому тип значення, відкриваємо форму заповнення та у колонці Значеннявказуємо елемент, який потрібно змінити, відповідно до типу, це може бути зумовлені об'єкти або у числових, наприклад, реквізитів прості значення, поданнівказуємо, на що нам потрібно змінити, приклад булевського типу:

    - оформлення– стандартне налаштування формату поля, аналогічне налаштуванню в керованих формах, дозволяє більш точно та красиво налаштувати виведення певного реквізиту.

    Зв'язки набору даних у 1С СКД

    Тут встановлюється лише ліве з'єднання, за принципом, аналогічним зв'язківу запитах, джерелі зв'язкувказуємо основну таблицю для з'єднання, приймачідодаткову. У вираз джерелоі вираз приймачвказуємо реквізити, якими відбуватиметься зв'язок. Інші колонки розглянемо докладніше, коли розбиратимемо вкладку Параметри. Якщо немає додаткового зв'язку з параметрами, то рекомендується зв'язок робити у запиті, це прискорить роботу звіту.

    У світлі найближчого виходу 8.2.14 спробую описати деякі нові функції системи компонування даних.

    Відкриваємо схему компонування даних, бажано у зовнішньому звіті, щоб було простіше редагувати.

    Додаємо набір даних типу запит і пишемо, або вручну, або за допомогою конструктора запитів найпростіший запит:

    1. Налаштовуємо запит у СКД.

    2. Налаштовуємо обчислювані поля в СКД

    3. Виконуємо налаштування компонування даних на закладці налаштування

    4. Запускаємо 1С Підприємство 8.2.14. Відкриваємо звіт. Формуємо, одержуємо.

    Опис найновіших функцій:

    1. Поточна дата()

    Повертає системну дату. При компонуванні макету компонування у всіх виразах, які є у компонуванні, функція ПоточнаДата()замінюється значенням поточної дати.

    2. ВИЧИСЛИТИ ВИРАЗ ()

    Синтаксис:

    ОбчислитиВираз(<Выражение>, <Группировка>, <ОбластьВычисления>, <Начало>, <Конец>, <Сортировка>, <ИерархическаяСортировка>, <ОбработкаОдинаковыхЗначенийПорядка>)

    Опис:

    Функція призначена для обчислення виразу в контексті певного угруповання.

    Функція враховує вибір угруповань, але не враховує ієрархічні відбори.

    Функція не може застосовуватися до групування у груповому відборі цього угруповання. Наприклад, у відборі угруповання Номенклатура не можна використовувати вираз ОбчислитиВираз («Сума(СумаОборот)», «Загальний Підсумок») > 1000. Але такий вираз можна використовувати в ієрархічному відборі.

    Якщо кінцева запис передує початкової, вважається, що записи до розрахунку детальних даних, і розрахунку агрегатних функцій відсутні.

    При розрахунку інтервальних виразів для загального підсумку (параметр Угруповання має значення ЗагальнийПідсумок) вважається, що записи для розрахунку детальних даних та розрахунку агрегатних функцій відсутні.

    Компонувальник макету при генерації виразу функції Обчислити Вираз, якщо вираз упорядкування містить поля, які не можуть бути використані в групуванні, замінює функцію Обчислити Вираз на NULL.

    Параметри

    <Выражение>

    Тип: Рядок. Вираз, який треба обчислити.

    <Группировка>

    Тип: Рядок. Містить угруповання, в контексті якого необхідно обчислити вираз. Якщо в якості імені угруповання використовується порожній рядок, обчислення буде виконано в контексті поточного угруповання. Якщо в якості імені угруповання буде використаний рядок ЗагальнийПідсумок, обчислення буде виконано в контексті загального підсумку. В інших випадках обчислення виконуватиметься в контексті батьківського угруповання з таким ім'ям.

    Наприклад:

    Сума(Продажи.СумаОборот)/Обчислити(“Сума(Продажи.СумаОборот)”, “Загальний Підсумок”)

    В даному прикладі в результаті вийде відношення суми по полю Продажу. Сума Обіг запису угруповання до суми того ж поля у всій компонуванні;

    <ОбластьВычисления>

    Тип: Рядок. Параметр може приймати такі значення:

    • ЗагальнийПідсумок - вираз обчислюватиметься для всіх записів угруповання.
    • Ієрархія - вираз буде обчислюватися для батьківського ієрархічного запису, якщо така є, і для всього угруповання, якщо батьківського ієрархічного запису немає.
    • Угруповання - вираз обчислюватиметься для поточного групового запису угруповання.
    • УгрупованняНеРесурса - при обчисленні функції для групового запису за ресурсами, вираз буде обчислено для першого групового запису вихідного групування.

    При обчисленні функції ОбчислитиВираз()зі значенням Угруповання НеРесурсу для групових записів, що не є угрупованнями за ресурсами, функція обчислюється так само, як би вона обчислювалася в тому випадку, якщо значення параметра дорівнює значенням Угруповання.

    Компонувальник макету компонування даних при генерації макета компонування даних при виведенні в макет поля-ресурсу, за яким виконується угруповання, поміщає в макет вираз, що обчислюється за допомогою функції ОбчислитиВираз(), із зазначенням параметра Угруповання НеРесурсу. Для інших ресурсів у групуванні ресурсом поміщаються типові висловлювання ресурсів.

    <Начало>

    Тип: Рядок. Вказує, з якого запису потрібно починати фрагмент, в якому розраховувати агрегатні функції виразу та з якого запису отримувати значення полів поза агрегатними функціями. Значення може бути одним із наступних:

    <Конец>

    Тип: Рядок. Вказує, до якого запису слід продовжувати фрагмент, у якому розраховувати агрегатні функції висловлювання. Значення може бути одним із наступних:

    • Перший (First). Необхідно отримувати перший запис угруповання. Після слова у дужках можна вказувати вираз, результат якого використовуватиметься як зміщення від початку угруповання. Отримуване значення має бути цілим числом, більше нуля. Наприклад, Перша(3) – отримання третього запису від початку угруповання.

    Якщо перший запис виходить за межі угруповання, вважається, що записів немає. Наприклад, якщо записів 3, а потрібно отриматиПерша(4), то вважається, що записів немає.

    • Остання (Last). Необхідно отримати останній запис угруповання. Після слова у дужках можна вказувати вираз, результат якого використовуватиметься як зміщення від кінця угруповання. Отримуване значення має бути цілим числом, більше нуля. Наприклад,Остання(3) – отримання третього запису від кінця угруповання.

    Якщо останній запис виходить за межі угруповання, вважається, що записів немає. Наприклад, якщо записів 3, а потрібно отримати остання(4), то вважається, що записів немає.

    • Попередня (Previous). Потрібно отримати попередній запис угруповання. Після слова у дужках можна вказувати вираз, результат якого використовуватиметься як зміщення назад від поточного запису угруповання. Наприклад, Попередня(2) – одержання попереднього від попереднього запису.

    Якщо попередній запис виходить за межі угруповання (наприклад, для другого запису угруповання потрібно отримати Попередній(3), то виходить перший запис угруповання.

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

    • Наступний (Next). Необхідно отримати наступний запис угруповання. Після слова у дужках можна вказувати вираз, результат якого використовуватиметься як зміщення вперед від поточного запису угруповання. Наприклад, Наступна(2) – отримання наступного від наступного запису.

    Якщо наступний запис виходить за межі угруповання, вважається, що записів немає. Наприклад, якщо записів 3 і для третього запису отримують Наступний(), то вважається, що записів немає.

    При отриманні наступного запису для підсумку групування вважається, що запису немає.

    • Поточна (Current). Потрібно отримати поточний запис.

    При отриманні для результату угруповання виходить перший запис.

    • Обмежує значення (BoundaryValue). Необхідність отримати запис за вказаним значенням. Після слова Обмежує Значення у дужках потрібно вказати вираз, зі значення якого потрібно починати фрагмент першого поля впорядкування.

    Як запис буде виходити перший запис, значення поля упорядкування у якої більше або дорівнює зазначеному значенню. Наприклад, якщо в якості поля упорядкування використовується поле Період, і воно має значення 01.01.2010, 01.02.2010, 01.03.2010, і потрібно отримати ОбмежуючеЗначення(ДатаЧас(2010, 1, 15)), то буде отриманий запис. 2010 року.

    <Сортировка>

    Тип: Рядок. Перераховуються вирази, розділені комами, які описують правила упорядкування. Якщо не вказано, то впорядкування виконується так само, як і у угруповання, для якого обчислюється вираз. Після кожного виразу можна вказати ключове словоВозр (для впорядкування по зростанню), Убут (для впорядкування по спадання) і Автоупорядкування (для впорядкування посилальних полів по полях, по яких потрібно впорядковувати об'єкт, на який виконується посилання). Слово Автоупорядкування може використовуватися як зі словом Возр, і зі словом Убыв.

    <ИерархическаяСортировка>

    Тип: Рядок. Аналогічно параметру Сортування. Застосовується для впорядкування ієрархічних записів. Якщо не вказано, компонувальник макета генерує упорядкування відповідно до впорядкування, зазначеного у параметрі Сортування.

    <ОбработкаОдинаковыхЗначенийПорядка>

    Тип: Рядок. Вказує правило визначення попереднього або наступного запису, якщо є кілька записів з однаковим значенням упорядкування:

    • Окремо (Separately) означає, що для визначення попереднього та наступного записів використовується послідовність упорядкованих записів. Значення за замовчуванням.
    • Разом (Together) означає, що попередні та наступні записи визначаються на підставі значень виразів упорядкування.

    Наприклад, якщо отримана послідовність упорядкована за датою:

    Дата ПІБ Значення
    1 01 січня 2001 року Іванов М. 10
    2 02 січня 2001 року Петров З. 20
    3 03 січня 2001 року Сидоров Р. 30
    4 04 січня 2001 року Петров З. 40

    Якщо значення параметра дорівнює окремо, то:

    § попереднім записом до запису 3 буде запис 2.

    § якщо розрахунковий фрагмент визначається як Поточна, Поточна (відповідно, параметри Початок і Кінець), то для запису 2 цей фрагмент буде складатися з одного запису 2. Вираз ОбчислитиВираз («Сума(Значення)», Поточна, Поточна) дорівнюватиме 20.

    Якщо значення параметра дорівнює Разом, то:

    § попереднім записом до запису 3 буде запис 1.

    § якщо розрахунковий фрагмент визначається як Поточна, Поточна (відповідно, параметри Початок і Кінець), то для запису 2 цей фрагмент буде складатися з записів 2 і 3. Вираз ОбчислитиВираз («Сума(Значення)», Поточна, Поточна) дорівнюватиме 50.

    При вказанні значення параметра, що дорівнює Разом, у параметрах Початок і Кінець не можна вказувати зміщення для позицій Перша, Остання, Попередня, Наступна.

    ОбчислитиВираз (“Сумма(СуммаОборот)”, “Перша”, “Поточна”)

    Якщо потрібно отримати значення угруповання в попередньому рядку, можна використовувати наступне вираз:

    ОбчислитиВираз (“Курс”, “Попередня”)

    перелік новихфункцій:

    ОбчислитиВираз СгрупуваннямМасив(<Выражение>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) –

    Функція повертає масив, кожен елемент якого містить результат обчислення виразу для угруповання по вказаному полю.

    ОбчислитиВираз СУгрупованняТаблицяЗначень(<Выражения>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) –

    Функція повертає таблицю значень, кожен рядок якої містить результат обчислення виразів для групування за вказаним полем

    ЗначенняЗаповнено(<Выражение>) – Повертає Істина, якщо значення відрізняється від значення даного типу за умовчанням, відмінно від значення NULL, відмінно від порожнього посилання, відмінно від значення Невизначено. Для логічних значень здійснюється перевірка значення NULL. Для рядків здійснюється перевірка на відсутність непробільних символів

    Формат(<Выражение>, <Форматная строка>) – Отримати відформатований рядок переданого значення. Форматний рядок задається відповідно до форматного рядка системи «1С:Підприємство».

    Підрядка(<Выражение>, <Начальные символ>, <ДлинаПодстроки>) – Ця функція призначена для виділення підрядка з рядка.

    ДовжинаРядки(<Выражение>) – Функція призначена для визначення довжини рядка. Параметр - вираз рядкового типу

    Рядок(<Выражение>) – Якщо як параметр переданий масив, то функція повертає рядок, що містить рядкові уявлення всіх елементів масиву, розділених символами “; “. Якщо як параметр передана таблиця значень, то функція повертає рядок, що містить рядкові уявлення всіх рядків таблиці значень, причому уявлення осередків кожного рядка поділяються символами “; “, а рядки – змивом перекладу рядка. Якщо у якогось елемента рядкове уявлення порожнє, то замість його уявлення виводиться рядок<Пустое значение>.

    Здрастуйте, шановний читачу! У нас черговий урок з основ системи компонування. Ви познайомилися з функціями мови виразів СКД, побачили особливості роботи системи компонування, а також розібралися з основними налаштуваннями полів компонування. А зараз ми розглянемо новий матеріал. Поїхали!

    Додаткові параметри полів СКД.

    Колонка "Тип значення"дозволяє вказати тип даних для поля компонування. Навіщо вказувати тип, наприклад для поля «Номенклатура», якщо так відомо якого типу? Це необхідно, якщо поле компонування складеного типу. Можна вибрати певний тип, тоді при відборі цього поля будуть вибиратися значення даного типу.

    Колонка «Доступні значення»дозволяє вказати доступні для вибору значення та обмежити вибір користувача певними рамками.

    Колонка «Оформлення»дозволяє ставити оформлення полю компонування, не використовуючи макети. Можна вказати колір шрифту, колір рамки, орієнтацію тексту тощо.

    Колонка "Параметри редагування"дозволяє вказати, як редагувати поле компонування. Наприклад, можна вказати швидкий вибір елементів зі списку у відборі. За промовчанням поле компонування всі параметри редагування успадковує від метаданих об'єкта.

    Обчислювані поля

    На закладці «Обчислювані поля» компонування даних можна створювати свої поля, що обчислюються.

    Навіщо потрібні поля, що обчислюються, якщо їх можна створювати на рівні запиту? Не всі поля можна описати за допомогою запиту. Якщо потрібно скласти складне поле з різних наборів даних, наприклад, типу запит і об'єкт, тоді без обчислюваних полів не обійтися. Додати поле компонування даних не можна, якщо джерелом даних є запит і автозаповнення, а за допомогою обчислюваних можна додати скільки завгодно полів.

    У колонці поля «Вираз», що обчислюється, потрібно написати довільний вираз, який використовує поля компонування даних, звертаючись по їх шляху (колонка «Шлях» на закладці «Набори даних»). Або можна використовувати функції математичного перетворення, або звертатися до функцій загальних модулів. Наприклад, запишемо в колонці «Шлях до даних» назву обчислюваного поля «Відхилення», а в полі «Вираз» наступне:

    Сума - Ціна* Кількість

    Перегляньте ще один , а ще можна завантажити з використанням цих функцій.

    По суті, для полів, що обчислюються, задаються ті ж самі налаштування, що і для полів компонування. Тут немає лише колонки «Група ієрархії». При написанні обчислюваних полів не можна звертатися до інших полів, що обчислюються.

    Як передавати параметри та відбори до звіту, побудованого на СКД без створення форми звіту?

    &На Клієнті // Передача параметрів до звіту СКДПроцедура ОбробкаКоманда(ПараметриКоманда, ПараметриВиконанняКоманда) Відбір = Новий Структура("Номенклатура" , ПараметрКоманда) ; ФіксованіНалаштування = ОтриматиФіксованіНастройки() ; ПараметриФорми = Новий Структура( "СформуватиПриВідкритті, Відбір, КлючВаріанта, ФіксованіНалаштування", Істина , Відбір, "ВаріантЗвітуПоПродажам", Фіксовані Налаштування); ВідкритиФорму( "Звіт.ЗвітПоПродажам.Форма", Параметри Форми); КінецьПроцедури &На Сервері Функція ОтриматиФіксованіНалаштування() ЗвітПоПродаж = Звіти. ЗвітПоПродажам. Створити(); СКД = Звіт По Продажах. СхемаКомпонівкиДаних; Налаштування = СКД. ПараметриЗа замовчуванням; ПочатокПеріоду = Налаштування. Параметри даних. ЗнайтиЗначенняПараметра( Новий ПараметрКомпонівкиДаних("ПочатокПеріоду" ) ) ; Початок періоду. Значення = Початок Місяця (Поточна Дата ()); Початок періоду. Використання = Істина; ПочатокПеріоду = Налаштування. Параметри даних. ЗнайтиЗначенняПараметра( Новий ПараметрКомпонуванняДаних("КінецьПеріоду" ) ) ; Кінець періоду. Значення = КінецьМісяця(ПоточнаДата() ); Кінець періоду. Використання = Істина; Повернення Налаштування; КінецьФункції // ОтриматиФіксованіНалаштування()

    Як вирівняти заголовки стовпців по центру у звіті СКД?

    Потрібно встановити два параметри в полі «Оформлення» на закладці «Набори даних»:

    Горизонтальне становище: Центрувати Вертикальне становище: Центрувати

    Також на закладці "Налаштування" внизу ви знайдете ще одну закладку: "Умовне оформлення". Там для кожного угруповання, параметра і т.д. можна встановити оформлення, яке ви хочете.

    Здається все розповів! Як ви пам'ятаєте, у вас є можливість ставити запитання, якщо виникли такі. Постараюся відповісти. У майбутньому планую написати ще статті на цю тему, тому не забудьте підписатися на оновлення нашого сайту, щоб не пропустити! Також обов'язково складу тест для закріплення матеріалу з цього уроку.

    Наприкінці статті хочу порадити вам безкоштовний від Сотнікова Анатолія. Це курс досвідченого програміста. Він на окремій базі покаже вам, як робити звіти в СКД. Вам тільки потрібно уважно слухати та запам'ятовувати! Ви отримаєте відповіді на такі запитання:
    • Як створити простий звіт у вигляді списку?
    • Навіщо потрібні колонки Поле, Шлях і Заголовок на закладці «Поля»?
    • Які існують обмеження для полів компонування?
    • Як правильно налаштовувати ролі?
    • Які існують ролі для полів компонування?
    • Де знайти закладку компонування даних у запиті?
    • Як настроювати параметри в СКД?
    • Далі ще цікавіше...
    Напевно, чи не варто самому намагатися борознити інтернет у пошуках потрібної інформації? Тим більше, все готове для застосування. Тільки почніть! Всі подробиці про те, що є у безкоштовних відеоуроках

    У даній невеликій нотатці хочу показати, як можна зробити підсумовування значень на різних рівнях угруповання, у звіті з використанням системи компонування даними.
    Як показано на зображенні, лише на рівні угруповання «Групи номенклатури», розраховується ресурс «Замовити», в ньому відображається скільки потрібно замовити за поточною групою номенклатури виходячи з певних умов:


    Дане значення може бути розраховане тільки на даному рівні угруповання, оскільки вище або нижче відсутні значення для розрахунку. Наприклад, на рівні детальних записів немає даних за максимальною кількістю в групі, тому що ці дані вірні тільки для групи в цілому, а не для окремих її складових.

    Відповідно, тепер необхідно розрахувати підсумки, за вище угрупуванням («Склади», «ТипиСкладів») і загальний підсумок.
    Для цього використовується функція ОбчислитиВираз СгрупуваннямМасив:
    ВИЧИСЛИТИ ВИРАЖЕННЯ ГРУПІРОВКОЙ МАСИВ (EVALEXPRESSIONWITHGROUPARRAY)
    Синтаксис:
    ОбчислитиВираз СгрупуваннямМасив(,)
    Опис:
    Функція повертає масив, кожен елемент якого містить результат обчислення виразу для угруповання по вказаному полю.
    Компонувальник макета при генерації макета перетворює параметри функції терміни полів макета компонування даних. Наприклад, поле Контрагент буде перетворено в НаборДаних.Контрагент.
    Компонувальник макету при генерації виразів для виведення поля користувача, у виразі якого присутня тільки функція ОбчислитиМассивСГруппировкойМассив(), генерує вираз, що виводиться таким чином, щоб виведена інформація була впорядкована. Наприклад, для поля користувача з виразом:

    ОбчислитиВираз СгрупуваннямМасив("Сума(СумаОборот)", "Контрагент")
    Компонувальник макету згенерує для виведення такий вираз:

    З'єднатиРядки(Масив(Упорядкувати(ОбчислитиВираз ЗУгрупуваннямТаблицяЗначень("Подання(Сума(НаборДаних.СумаОборот)),Сума(НаборДанних.СуммаОборот)","НаборДанних.Контрагент"),"2

    Параметри:

    Тип: Рядок. Вираз, який потрібно обчислити. Рядок, наприклад, Сума(СуммаОборот).

    Тип: Рядок. Вирази полів угруповання – вирази полів угруповання, перераховані через кому. Наприклад, Контрагент, Партія.

    Тип: Рядок. Вираз, що описує відбір, який застосовується до детальних записів. У виразі не підтримується використання агрегатних функцій. Наприклад, Позначка Видалення = Брехня.

    Тип: Рядок. Вираз, що описує добір, що застосовується до групових записів. Наприклад, Сума(СуммаОборот) > &Параметр1.
    Приклад:

    Максимум(ОбчислитиВираз ЗУгрупуваннямМасив ("Сума(СумаОборот)", "Контрагент"));

    Детальний опис синтаксису функції можна знайти за адресою http://its.1c.ru/db/v837doc#bookmark:dev:TI000000582
    Тепер для розрахунку, продублюємо поле «Замовити», з різними значеннями «Розраховувати по…», використовуючи наступні вирази, зверніть увагу, що в кожному вище рівні, що стоїть, використовуються значення рівнів нижче стоїть угруповань.

    У результаті отримуємо таку конструкцію: