Мова виразів системи компонування даних (1Cv8). Мова виразів системи компонування даних (1Cv8) Залишок від поділу

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

У платформі «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С за замовчуванням.

Користувачеві залишається можливість змінити безліч налаштувань за власним бажанням.

Якою є технологія створення звіту за попередніми технологіями:

  • Написати запит у програмі 1С
  • Розробити форму налаштувань (унікальну для звіту), яка дозволить змінювати лише вибрані програмістом N налаштувань
  • Написати код (програму) виконання запиту та побудови друкованої форми звіту.

Як Ви бачите, СКД 1С має значну перевагу як для користувача, так і для програміста:

  • Програміст – позбавляє написання програми для виконання звіту та налаштувань
  • Користувач – отримує значний доступ до установок звіту.

У всіх нових конфігураціях 1С всі звіти будуть використані лише на СКД 1С.

Давайте подивимося, як створити звіт на СКД 1С самому з нуля.

Створюємо звіт СКД 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)

· Остання (Last)

· Попередня (Previous)

· Наступна (Next)

· Поточна (Current)

· ОбмежуєЗначення(BoundaryValue) ОбмежуєЗначення

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

· Перша (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)), буде отримано запис з датою 01.02.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С:Підприємство».

Підрядка(, , ) - Ця функція призначена для виділення підрядка з рядка.

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

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

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

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

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

Приклад Запиту = Новий Запит;
Приклад Запиту. Текст = «
| ВИБРАТИ
| АвансовийЗвітПриєднаніФайли.Посилання

| Довідник.
|ДЕ
| АвансовийЗвітПриєднаніФайли.Дата< &ТекДата»;
ПрикладЗапроса.УстановитьПараметр(«ТекДата», ПоточнаДата());

Довільна дата

Розглянута вище функція дозволяє порівнювати і, отже, проводити відбір за будь-яким періодом. Такий спосіб дозволяє задати жорсткий відбір у запиті без використання додаткових параметрів.

Зверніть увагу, що використовуючи цю функцію в прикладі вище, як вхідні параметри ми передавали лише три числа (рік, місяць, день). Останні три (година, хвилина, секунда) є обов'язковими і за відсутності замінюються на «0», тобто початок дня.

В рамках цього прикладу будуть отримані всі файли, які приєднані до авансових звітів до кінця минулого 2016 року. У зв'язку з цим ми вкажемо годину, хвилину та секунду, щоб порівнювати моментом часу «31 грудня 2016 р 23:59:59».

ВИБРАТИ
АвансовийЗвітПриєднаніФайли.Посилання
З
Довідник.АвансовийЗвітПриєднаніФайли ЯК АвансовийЗвітПриєднаніФайли
ДЕ
АвансовийЗвітПриєднаніФайли.Дата< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Порожня дата

Здійснити перевірку змінної на те, чи містить вона в собі незаповнену дату найпростіше звичайним порівнянням. У цьому прикладі ми, використовуючи запит, виберемо всі надходження коштів на р/р, які не заповнено вхідна дата.

Припустимо, що нам надійшло завдання, за яким замовник хоче отримати звіт щодо введених у базу документів "Реалізація товарів та послуг", причому на кожен документ необхідно отримувати ціну з регістру відомостей "Ціни номенклатури" на дату документа. Звіт пишеться зміни " Управління виробничим підприємством " версії 1.3.

До запису з таблиці документа приєднується запис із віртуальної таблиці "ЦеныНоменклатуры.СрезОстанній" за відповідними умовами періоду, типу ціни та номенклатури. Тип ціни одержуємо з однойменного реквізиту документа.

Завдання має кілька способів розв'язання. Розглянемо два з них: звіт на СКД за допомогою двох наборів даних та отримання всіх необхідних даних в одному запиті. Тепер по порядку.

Використання СКД

Для реалізації такого звіту на СКД створимо у схемі компонування даних два набори даних. Перший отримуватиме список документів, другий ціни на дати документів за обраною номенклатурою та типом цін. Зв'язок між двома наборами даних здійснюється за номенклатурою, періодом (датою документа) та типом ціни. З першого набору необхідно передати параметри "Номенклатура", "ТипЦени" та "Період" у другий набір.

Перший набір даних містить наступний запит:

Запит вибирає з таблиці документа та табличної частини "Товари" поля: "Посилання", "Дата", "ТипЦен", "Номенклатура". Тепер розглянемо другий набір даних:

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

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

Налаштувавши структуру звіту та сформувавши його, ми отримаємо наступний результат:

Звіт працює. Перейдемо до розгляду варіанти одержання ціни на дату документа в одному запиті.

В одному запиті

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

"ВИБРАТИ | ДокументНоменклатураПеріод.Документ, | ДокументНоменклатураПеріод.Документ.Дата ЯК Дата, | ДокументНоменклатураПеріод.Документ. , |Реалізація ТоварівПослугТовари.Номенклатура ЯК Номенклатура, | МАКСИМУМ (Ціни Номенклатури. Період) Ціни Номенклатури.Номенклатура | І Реалізація ТоварівПослуг. Період |І РеалізаціяТоварівПосилання.ТипЦен | Номенклатури ЯК ЦіниНоменклатури | ПЗ ДокументНоменклатураПеріод. І ДокументНоменклатураПеріод.Документ.ТіпЦен = ЦіниНоменклатури.ТіпЦен | І ДокументНоменклатура.Період.Період = ЦіниНоменклатури.Період"

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

Результат виконання аналогічний результату попереднього звіту (див. скріншот вище).

Робіть висновки

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

Також варто пам'ятати, що створення звітів на основі таблиць документів не рекомендується методикою розробки від фірми 1С, оскільки вважається, що інформація в документах може бути недостовірною. Усі звіти необхідно будувати на підставі регістрів.

mob_info