Обчислювані поля у запиті 1с. Мова виразів системи компонування даних (1Cv8). Операція перевірки значення на нерівність NULL

25.10.2019 Програми

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

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

Вирази використовуються у наступних підсистемах:

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

Літерали

У виразі можуть бути літерали. Можливі літерали наступних типів:

  • Рядок;
  • Число;
  • Дата;
  • Бульово.

Рядок

Рядковий літерал записується в символах «”», наприклад:

"Рядковий літерал"

При необхідності використання всередині рядкового літералу символу """, слід використовувати два таких символи.

Наприклад:

“Літерал ““у лапках“““

Число

Число записується без пробілів, у десятковому форматі. Дробова частина відокремлюється символом «.». Наприклад:

10.5 200

Дата

Літерал типу дата записується за допомогою ключового літералу ДАТАВРЕМЯ (DATETIME). Після цього ключового слова, в дужках, через кому перераховуються рік, місяць, день, години, хвилини, секунди. Вказівка ​​часу необов'язкова.

Наприклад:

ДАТАВРЕМЯ(1975, 1, 06) – Шосте січня 1975 року ДАТАВРЕМЯ(2006, 12, 2, 23, 56, 57) – Друге грудня 2006 року, 23 години 56 хвилин 57 секундода, 23 години 56

Бульово

Булеві значення можуть бути записані за допомогою літералів Істина (True), Брехня (False).

Значення

Для вказівки літералів інших типів (системних перерахувань, наперед визначених даних) використовується ключове слово Значення, після якого в дужках йде вказівка ​​імені літерала.

Значення(Вигляду. Активний)

Операції над числами

Унарний –

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

Продажі.

Унарний +

Ця операція не виконує над кількістю жодних дій. Наприклад:

Продажі.

Бінарний -

Ця операція призначена для обчислення різниці двох чисел. Наприклад:

Залишки ІОбороти. Початковий Залишок – Залишки І Обороти. Кінцевий Залишок Залишки І Обороти.

Бінарний +

Ця операція призначена для обчислення суми двох чисел. Наприклад:

Залишки ІОбороти. Початковий Залишок + Залишки І Обороти. Оборот Залишки І Обороти. Початковий Залишок + 100 400 + 357

твір

Ця операція призначена для обчислення добутку двох чисел. Наприклад:

Номенклатура.Ціна * 1.2 2 * 3.14

Поділ

Ця операція призначена для отримання результату поділу одного операнда на інший. Наприклад:

Номенклатура.Ціна / 1.2 2 / 3.14

Залишок від ділення

Ця операція призначена для отримання залишку від поділу одного операнда на інший. Наприклад:

Номенклатура.Ціна % 1.2 2 % 3.14

Операції над рядками

Конкатенація (Бінарний +)

Ця операція призначена для конкатенації двох рядків. Наприклад:

Номенклатура.Артикул + “: ”+ Номенклатура.Найменування

Подібно

Ця операція перевіряє відповідність рядка переданому шаблону.

Значенням оператора ПОДІБНО є ІСТИНА, якщо значення<Выражения>задовольняє шаблону, і БРЕХНЯ в іншому випадку.

Наступні символи в<Строке_шаблона>мають сенс, відмінний від просто чергового символу рядка:

  • % - відсоток: послідовність, що містить нуль та більш довільних символів;
  • _ - підкреслення: один довільний символ;
  • […] - один або кілька символів у квадратних дужках: один символ, будь-який з перерахованих усередині квадратних дужок У перерахуванні можуть зустрічатися діапазони, наприклад, a-z, що означають довільний символ, що входить в діапазон, включаючи кінці діапазону;
  • [^…] - у квадратних дужках значок заперечення, за яким слідує один або кілька символів: будь-який символ, крім тих, які перераховані слідом за значком заперечення;

Будь-який інший символ означає сам себе і не несе жодного додаткового навантаження. Якщо як самого себе необхідно записати один із перелічених символів, то йому має передувати<Спецсимвол>після ключового слова СПЕЦСИМВОЛ (ESCAPE).

Наприклад, шаблон

"%АБВ[абвг]\_абв%" СПЕЦСИМВОЛ "\"

означає підрядок, що складається з послідовності символів: літери А; літери Б; літери У; однієї цифри; однією з букв а, б, або г; символ підкреслення; літери а; літери б; літери ст. Причому ця послідовність може розташовуватися, починаючи з довільної позиції рядку.

Операції порівняння

Рівно

Ця операція призначена для порівняння двох операндів на рівність. Наприклад:

Продажі.Контрагент = Продажі.НоменклатураОсновнийПостачальник

Не дорівнює

Ця операція призначена для порівняння двох операндів на нерівність. Наприклад:

Продаж.Контрагент<>Продажі.НоменклатураОсновнийПостачальник

Менше

Ця операція призначена для перевірки того, що перший операнд менший за другий. Наприклад:

ПродажіПоточні.Сума< ПродажиПрошлые.Сумма

Більше

Ця операція призначена для перевірки того, що перший операнд більший за другий. Наприклад:

ПродажіПоточні.Сума > ПродажиМинули.Сума

Менше або дорівнює

Ця операція призначена для перевірки того, що перший операнд менше або дорівнює другому. Наприклад:

ПродажіПоточні.Сума<= ПродажиПрошлые.Сумма

Більше або дорівнює

Ця операція призначена для перевірки того, що перший операнд більше або дорівнює другому. Наприклад:

ПродажиПоточні.Сума >= ПродажиМинули.Сума

Операція В

Ця операція здійснює перевірку наявності значення переданому списку значень. Результатом операції буде Істина, якщо значення знайдено, або Брехня - інакше. Наприклад:

Номенклатура В (&Товар1, &Товар2)

Операція перевірки наявності значення набору даних

Операція здійснює перевірку наявності значення у вказаному наборі даних. Набір даних для перевірки має містити одне поле. Наприклад:

Продажі.Контрагент В Контрагенти

Операція перевірки значення на NULL

Ця операція повертає значення Істина, якщо значення є NULL. Наприклад:

Продажі.Контрагент Є NULL

Операція перевірки значення на нерівність NULL

Ця операція повертає значення Істина у випадку, якщо значення не є NULL. Наприклад:

Продажі.Контрагент Є НЕ NULL

Логічні операції

Логічні операції приймають як операнди вирази, що мають тип Булево.

Операція НЕ

Операція НЕ повертає значення Істина у випадку, якщо її операнд має значення Брехня, і значення Брехня у випадку, якщо її операнд має значення Істина. Наприклад:

НЕ Документ.Вантажоодержувач = Документ.Вантажовідправник

Операція І

Операція І повертає значення Істина у випадку, якщо обидва операнди мають значення Істина, і значення Брехня у випадку, якщо один з операндів має значення Брехня. Наприклад:

Документ.Вантажоодержувач = Документ.Вантажовідправник І Документ.Вантажоодержувач = &Контрагент

Операція АБО

Операція АБО повертає значення Істина у випадку, якщо один з операндів має значення Істина, і Брехня у випадку, якщо обидва операнди мають значення Брехня. Наприклад:

Документ.Вантажоодержувач = Документ.Вантажовідправник АБО Документ.Вантажоодержувач = &Контрагент

Агрегатні функції

Агрегатні функції здійснюють деяку дію над набором даних.

Сума

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

Сума(Продажі.СумаОборот)

Кількість

Функція Кількість розраховує кількість значень, відмінних від значення NULL. Наприклад:

Кількість (Продаж.Контрагент)

Кількість різних

Ця функція розраховує кількість різних значень. Наприклад:

Кількість(Різні Продажі.Контрагент)

Максимум

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

Максимум(Залишки.Кількість)

Мінімум

Функція набуває мінімального значення. Наприклад:

Мінімум(Залишки.Кількість)

Середнє

Функція отримує середнє значення значень, відмінних від NULL. Наприклад:

Середнє(Залишки.Кількість)

Інші операції

Операція ВИБІР

Операція Вибір призначений для вибору одного з кількох значень при виконанні деяких умов. Наприклад:

Вибір Коли Сума > 1000 Тоді Сума Інакше 0 Кінець

Правила порівняння двох значень

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

  • NULL (найнижчий);
  • Бульово;
  • Число;
  • Дата;
  • Рядок;
  • Посилальні типи

Відносини між різними типами посилань визначаються на основі посилальних номерів таблиць, відповідних тому чи іншому типу.

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

  • у типу Бульова значення ІСТИНА більше значення БРЕХНЯ;
  • у типу Число звичайні правила порівняння для чисел;
  • у типу Дата більш ранні дати менше пізніших;
  • у типу Рядок - порівняння рядків відповідно до встановлених національних особливостей бази даних;
  • типи посилань порівнюються на основі своїх значень (номери запису і т. п.).

Робота зі значенням NULL

Будь-яка операція, в якій значення одного з операндів NULL, даватиме результат NULL.

Є винятки:

  • операція І будуть повертати NULL тільки у випадку, якщо жоден з операндів не має значення Брехня;
  • операція АБО повертатиме NULL тільки у випадку, якщо жоден з операндів не має значення Істина.

Пріоритети операцій

Операції мають такі пріоритети (перший рядок має нижчий пріоритет):

  • В, Є NULL, Є НЕ NULL;
  • =, <>, <=, <, >=, >;
  • Бінарний +, Бінарний -;
  • *, /, %;
  • Унарна +, Унарна -.

Функції мови виразів системи компонування даних

Обчислити

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

  • Вираз. Тип Рядок. Містить вираз, що обчислюється;
  • Угруповання. Тип Рядок. Містить угруповання, в контексті якого необхідно обчислити вираз. Якщо в якості імені угруповання використовується порожній рядок, обчислення буде виконано в контексті поточного угруповання. Якщо в якості імені угруповання буде використаний рядок ЗагальнийПідсумок, обчислення буде виконано в контексті загального підсумку. В інших випадках обчислення виконуватиметься в контексті батьківського угруповання з таким ім'ям. Наприклад:
Сума(Продажи.СумаОборот) / Обчислити("Сума(Продажі.СумаОборот)", "ЗагальнийПідсумок")

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

Рівень

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

Рівень()

Номер по порядку

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

Номер по порядку()

НомерПорядкуУгрупованні

Повертає наступний порядковий номер у поточному угрупованні.

НомерПорядкуУгрупованні()

Формат

Отримати форматований рядок переданого значення.

Форматний рядок задається відповідно до форматного рядка 1С:Підприємство.

Параметри:

  • значення;
  • Форматний рядок.

Формат (Витратні Накладні. Сумма Док, "ЧДЦ = 2")

Початок періоду

Параметри:

    • Хвилина;
    • День;
    • Тиждень;
    • Місяць;
    • квартир;
    • Декада;
    • Півріччя.

ПочатокПеріоду(ДатаЧас(2002, 10, 12, 10, 15, 34), "Місяць")

Результат:

01.10.2002 0:00:00

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

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

Параметри:

  • Дата. Тип Дата. Вказана дата;
  • Тип періоду. Тип Рядок. Містить одне із значень:
    • Хвилина;
    • День;
    • Тиждень;
    • Місяць;
    • квартир;
    • Декада;
    • Півріччя.

КінецьПеріоду(ДатаЧас(2002, 10, 12, 10, 15, 34), "Тиждень")

Результат:

13.10.2002 23:59:59

ДодатиКДате

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

Параметри:

  • Тип збільшення. Тип Рядок. Містить одне із значень:
    • Хвилина;
    • День;
    • Тиждень;
    • Місяць;
    • квартир;
    • Декада;
    • Півріччя.
  • Величина – скільки необхідно збільшити дату. Тип Число. Дробова частина ігнорується.

ДодатиКДате(ДатаЧас(2002, 10, 12, 10, 15, 34), "Місяць", 1)

Результат:

12.11.2002 10:15:34

РізницяДат

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

Параметри:

  • Вираз. Тип Дата. Вихідна дата;
  • Вираз. Тип Дата. Віднімається дата;
  • Тип різниці. Тип Рядок. Містить одне із значень:
    • Секунда;
    • Хвилина;
    • День;
    • Місяць;
    • квартир;

РІЗНЕСТЬДАТ(ДАТАВРЕМЯ(2002, 10, 12, 10, 15, 34), ДАТАВРЕМЯ(2002, 10, 14, 9, 18, 06), "ДЕНЬ")

Результат:

Підрядка

Ця функція призначена для виділення підрядка з рядка.

Параметри:

  • Рядок. Тип Рядок. Рядок, з якого виділяють підрядок;
  • позиція. Тип Число. Позиція символу, з якого починається виділення з рядка підрядка;
  • довжина. Тип Число. Довжина виділення підрядка.

ПІДСТРОКУ (Контрагенти. Адреса, 1, 4)

ДовжинаРядки

Функція призначена визначення довжини рядка.

Параметр:

  • Рядок. Тип Рядок. Рядок, довжину якої визначають.

Рядок(Контрагенти.Адреса)

Рік

Ця функція призначена виділення року із значення типу Дата.

Параметр:

  • Дата. Тип Дата. Дата, за якою визначають рік.

РІК(РозхНакл.Дата)

Квартал

Ця функція призначена для виділення номера кварталу із значення типу Дата. Номер кварталу у нормі знаходиться в діапазоні від 1 до 4.

Параметр

  • Дата. Тип Дата. Дата, за якою визначають квартал
КВАРТАЛ(РасхНакл.Дата)

Місяць

Ця функція призначена для виділення номера місяця із значення типу Дата. Номер місяця в нормі перебуває в діапазоні від 1 до 12.

  • Дата. Тип Дата. Дата, за якою визначають місяць.
МІСЯЦЬ(РозхНакл.Дата)

ДеньРоку

Ця функція призначена для отримання дня року значення типу Дата. День року у нормі перебуває у діапазоні від 1 до 365(366).

  • Дата. Тип Дата. Дата, за якою визначають день року.
ДЕНЬ РОКУ(РозхНакл.Дата)

День

Ця функція призначена для отримання дня місяця із значення типу Дата. День місяця у нормі знаходиться в діапазоні від 1 до 31.

  • Дата. Тип Дата. Дата, за якою визначають дні місяця.
ДЕНЬ(РозхНакл.Дата)

Тиждень

Ця функція призначена для отримання номера тижня року із значення типу Дата. Тижня року нумеруються, починаючи з першого.

  • Дата. Тип Дата. Дата, за якою визначають номери тижня.
ТИЖДЕНЬ(РозхНакл.Дата)

День тижня

Ця функція призначена для отримання дня тижня із значення типу Дата. День тижня в нормі знаходиться в діапазоні від 1 (понеділок) до 7 (неділя).

  • Дата. Тип Дата. Дата, за якою визначають день тижня.
ДЕНЬТИЖНЯ(РозхНакл.Дата)

Година

Ця функція призначена для отримання години доби зі значення типу Дата. Година доби знаходиться в діапазоні від 0 до 23.

  • Дата. Тип Дата. Дата, за якою визначають годину доби.
ЧАС(РозхНакл.Дата)

Хвилина

Ця функція призначена для отримання хвилини години із значення типу Дата. Хвилина години в діапазоні від 0 до 59.

  • Дата. Тип Дата. Дата, за якою визначають хвилину години.
ХВИЛИНА(РозхНакл.Дата)

Секунда

Ця функція призначена для отримання секунди хвилини значення типу Дата. Секунда хвилини в діапазоні від 0 до 59.

  • Дата. Тип Дата. Дата, за якою визначають секунди хвилини.
СЕКУНДА(РозхНакл.Дата)

Виразити

Ця функція призначена для виділення типу виразу, який може містити складовий тип. У випадку, якщо вираз міститиме тип, відмінний від необхідного типу, буде повернуто значення NULL.

Параметри:

  • Перетворюваний вираз;
  • Вказівка ​​типу. Тип Рядок. Містить рядок типу. Наприклад, "Число", "Рядок" тощо. Крім примітивних типів, цей рядок може містити ім'я таблиці. У цьому випадку буде здійснено спробу висловити посилання на вказану таблицю.

Виразити(Дані.Реквізит1, "Число(10,3)")

ЄNull

Ця функція повертає значення другого параметра, якщо значення першого параметра NULL.

В іншому випадку буде повернено значення першого параметра.

ЄNULL(Сума(Продажі.СумаОборот), 0)

Функції спільних модулів

Вираз механізму компонування даних може містити виклики функцій глобальних загальних модулів конфігурації. Ніякого додаткового синтаксису для виклику таких функцій не потрібно.

У цьому прикладі буде здійснено виклик функції "Скорочене Найменування" із загального модуля конфігурації.

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

Крім того, функції загальних модулів не можуть бути використані у виразах полів користувача.

ОбчислитиВираз- Досить складна функція СКД для розуміння, а приклади застосування в довідковій інформації досить мізерні. У цій статті розглянуто приклади, які, напевно, стануть у нагоді кожному розробнику:

  1. наростаючий результат угрупованні;
  2. наростаючий результат у крос-таблиці;
  3. одержання попереднього значення;
  4. виведення ТЧ в одному рядку.

1. Отримання показника наростаючим підсумком

Отримаємо кількість товару наростаючим підсумком лише на рівні угруповання. Для цього створюємо поле, що обчислюється (див. малюнок 1).
На вкладці "Ресурси" задаємо функцію для поля, що обчислюється:
ОбчислитиВираз("Сума(КількістьОборот)", "Перша", "Поточна")
яка сумуватиме кількість товарів від першого запису до поточного (див. рисунок 2).

Якщо кількість товару наростаючим підсумком потрібно отримувати на рівні детальних записів, то функцію Обчислити Вираз задаємо для поля, що обчислюється, на вкладці "Обчислювані поля" (див. малюнок 3).
Залежно від рівня отримання наростаючого результату, створюємо угруповання (див. малюнок 4): лише на рівні ресурсів - угруповання товарів, лише на рівні ДЗ - угруповання детальних записів.
Малюнок 4. Угруповання звіту з наростаючим підсумком

2. Отримання значення показника з попереднього рядка

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

3. Отримання показника наростаючим підсумком у крос-таблиці

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

4. Виведення даних табличної частини в один рядок

Способи виведення даних табличної частини в один рядок, включаючи спосіб з використанням функції Обчислити Вираз, розглянутий у статті