Немає null в запиті 1с 8.3. Використання функції є null (). Робота з порожніми значеннями у запиті

11.05.2020 Програми

При роботі з мовою запитів іноді виникає ситуація, коли потрібно замінити значення NULL деяке інше значення. Потреба такої операції може виникнути, наприклад, при отриманні залишків на складі для всієї номенклатури. Ця стаття описує використання функції мови запитів ЕСТЬNULL() на вирішення подібних завдань, і навіть розглядаються інші варіанти решения.

Функція ЄNULL

У мові запитів реалізована функція ЕСТЬNULL(), призначення якої - замінювати вираз інше вираз у разі, якщо висловлювання мало значення NULL. Синтаксична діаграма даної функції має такий вигляд:

Є NULL (<Проверяемое выражение>, <Выражение замены>)

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


ВИБРАТИ
Є NULL (Облік Номенклатури Залишки. Кількість Залишок, 0) ЯК Кількість Залишок
З

ДЕ

У даному прикладівиходять всі елементи довідника номенклатури, після чого для кожної номенклатури з регістру накопичення виходять поточні залишки. Т.к. для номенклатури, за якою відсутні залишки, віртуальна таблиця залишків не запис поверне, то в результаті з'єднання в полі "ОблікНоменклатуриЗалишки.КількістьЗалишок" будуть значення NULL для номенклатури, за якою не було залишків. Для того щоб замість значення NULL в результаті запиту було значення 0, ми використовували функцію ЕСТЬNULL(), яка здійснить бажану заміну.

Використання операції ВИБІР

Для вирішення описаної раніше задачі можна скористатися операцією мови запитів ВИБІР. Приклад, як виглядатиме запит, аналогічний попередньому, виглядатиме так:


ВИБРАТИ
Довідник Номенклатури.
ВИБІР КОЛИ ОблікНоменклатуриЗалишки.КількістьЗалишок Є NULL ТОДІ 0
Інакше ОблікНоменклатуриЗалишки.КількістьЗалишок ЯК КількістьЗалишок
З
Довідник.Номенклатура ЯК ДовідникНоменклатури
ЛІВОЕ З'ЄДНАННЯ Реєстр Накопичення. Облік Номенклатури.
ПО ОблікНоменклатуриЗалишки.Номенклатура = ДовідникНоменклатури.Посилання
ДЕ
Довідник Номенклатури.ЦеГрупа = БРЕХНЯ

Результат даного запитубуде ідентичним результату запиту, наведеного в попередньому розділі.

Використання функції ЕСТЬNULL() переважніше використання операції ВИБІР з наступних причин: запис з використанням ЕСТЬNULL() трохи компактніше, що підвищує читабельність запиту. Крім того, у випадку, коли вираз, що перевіряється, є складною функцією, в тому числі агрегатною функцією, обчислення функції ЕСТЬNULL() може виконуватися швидше ніж аналог, записаний з використанням функції ВИБІР.

Особливості функції ЄNULL

Функція ЕСТЬNULL() хоч і є аналогом операції ВИБРАТИ з перевіркою значення на NULL, проте має відмінність. Відмінність полягає в тому, що у випадку, якщо вираз функції має рядковий або числовий тип, вираз заміни буде перетворено до типу виразу, що перевіряється.

Так, наприклад, у разі коли вираз, що перевіряється, має тип Рядка(5), а вираз заміни тип Рядка(10), тип результату буде перетворений до типу Рядка(5). В результаті, коли функція повертатиме вираз заміни, значення буде обрізано до п'яти символів.

З числовими виразами ситуація аналогічна: значення виразу, що замінюється, буде перетворено до типу перевіряється, тобто. вираз, що замінюється, може бути обрізаний. Якщо значення не може бути перетворено, мова запитів закінчить виконання запиту з помилкою. Наприклад, з помилкою закінчиться спроба перетворення числа 1000 на тип Число(2).

У процесі розробки звітів на СКД в 1с підприємство часто виникає завдання виведення нулів у порожні поля звіту. Справа в тому, що, за відсутності необхідних даних у базі, запит повертає не число 0, а спеціальне значення NULL, яке потім необхідно перетворити на число. Наприклад, якщо ми напишемо

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

У вас є питання, чи потрібна допомога консультанта?

Але уявімо, що ми використовуємо з'єднання 2 наборів даних у СКД, і результат одного з них виявляється порожнім. І тут нам допоможе конструкція ЕСТЬNULL у тексті запиту цього набору, т.к. він поверне порожню вибірку. Там не буде значень NULL, які можна було б перетворити на 0, там взагалі нічого не буде. NULL з'являється лише після з'єднання наборів даних, а це відповідає система компоновки. Вихід, що залишився - скористатися полями, що обчислюються. У нашому прикладі нам доведеться створити поле "Ціна", що обчислюється, і прописати в його вираз ЕСТЬNULL(Ціна,0). До моменту спрацьовування виразів обчислюваних полів вже відбудеться з'єднання запитів, так що ми вже буде поле "Ціна", і воно міститиме NULL. Створюючи обчислюване поле з такою самою назвою, ми по суті перевизначаємо поле, яке повернули нам набори даних.

Мова запитів 1С — одна з основних відмінностей між версіями 7.7 та 8. Одним із найважливіших пунктів у вивченні 1С-програмування є мова запитів. У 1С 8.3 запити - найпотужніший і найефективніший інструмент отримання даних. Мова запитів дозволяє зручно отримувати інформацію з бази даних.

Сам синтаксис дуже сильно нагадує класичний T-SQL, крім того, що в 1С за допомогою мови запитів можна лише отримувати дані, використовуючи конструкцію Вибрати (select). Мова підтримує і складніші конструкції, наприклад, (запит у запиті). Запити в 1С8 можна становити як на кирилиці, так і на латиниці.

У статті я намагатимусь розповісти про основні ключові слова в мові запитів 1С:

  • вибрати
  • дозволені
  • різні
  • висловити
  • перші
  • для зміни
  • значення
  • тип значення (і оператор ПОСИЛАННЯ)
  • вибір
  • згрупувати за
  • мають
  • Є NULL
  • Є NULL
  • з'єднання - праві, ліві, внутрішні, повні.

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

Для налагодження запитів у системі 1С 8.2 передбачено спеціальний інструмент - консоль запитів. Побачити опис і завантажити його можна за посиланням -.

Розглянемо найважливіші та найцікавіші оператори мови запитів 1С.

ВИБРАТИ (SELECT)

У мові запитів 1С підприємства 8 будь-який запит починається з ключового слова ВИБРАТИ. У мові 1С немає конструкцій UPDATE, DELETE, CREATE TABLE, INSERT, ці маніпуляції провадяться в об'єктній техніці. Призначення його – лише читання даних.

Наприклад:

ВИБРАТИ
Поточний Довідник. Найменування
З
Довідник.Номенклатура ЯК Поточний Довідник

Запит поверне таблицю із найменуваннями номенклатури.

Поряд із конструкцією ВИБРАТИможна зустріти ключові слова ДЛЯ ЗМІНИ, ДОЗВОЛЕНІ, РІЗНІ, ПЕРШІ

ДОЗВОЛЕНІ— вибирає лише записи з таблиці, на які є права поточного користувача.

РІЗНІ— означає, що результат не потрапить дублюючих рядків.

ВИБІР (CASE)

Дуже часто ця конструкція недооцінюється програмістами. Приклад її використання:

Поточний Довідник. Найменування,

КОЛИ Поточний Довідник.

«Послуга»

КІНЕЦЬ ЯК ВидНоменклатури

Довідник.Номенклатура ЯК Поточний Довідник

Приклад поверне текстове значення «Товар» або «Послуга» у полі «ВидНоменклатури».

ДЕ (WHERE)

Конструкція мови запитів 1C, що дозволяє накласти відбір на отримані дані. Врахуйте, що від сервера система отримує всі дані, а потім вони відбираються за даним параметром.

ВИБРАТИ
Довідник.Найменування
З
Поточний Довідник. Номенклатура ЯК Поточний Довідник
ДЕ Поточний Довідник. Послуга = ІСТИНА

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

«ДЕ Послуга»

По суті ми відбираємо рядки, у яких вираз після ключового слова дорівнює «Істина».

У виразах можна використовувати прямі умови:

ДЕ Код = "005215"

За допомогою оператора «ЗНАЧЕННЯ()» в умовах використовувати звернення до визначених елементів та перерахувань у запиті 1С:

ДЕ ТипНоменклатури = Значення (Перерахування. Типи Номенклатури. Товар)

Значення часу можуть бути зазначені таким чином:

ДЕ ДатаНадходження > ДАТАВРЕМЯ(2012,01,01):

Найчастіше умови вказуються у вигляді параметрів, що передаються в запит:

Отримайте 267 відеоуроків з 1С безкоштовно:

ДЕ Номенклатурна група = & Номенклатурна група

Умову можна накласти на тип реквізиту, якщо він складового типу:

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

ДЕ РеєстрНакопичення.Реєстратор В (&СписокДокументівДля Відбору)

Умова може бути складна, що складається з декількох умов:

ДЕ ДатаНадходження > ДАТАВРЕМЯ(2012,01,01) І НоменклатурнаГрупа=НоменклатурнаГрупа І НЕ Послуга

ЗГРУПУВАТИ ПО (GROUP BY)

Конструкція мови запитів 1С 8.2 використовується для групування результату.

Наприклад:

ВИБРАТИ
НадходженняТоварівПослугТовари.Товар,
СУМА(Надходження ТоварівПослугТовари.Кількість) ЯК Кількість,
СУМА(Надходження ТоварівПослугТовари.Сума) ЯК Сума
З
Документ.Надходження ТоварівПослуг.Товари ЯК НадходженняТоварівПослугТовари

ЗГРУПУВАТИ ПО
НадходженняТоварівПослугТовари.Товар

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

Крім ключового слова СУМАможна використовувати інші агрегатні функції: КІЛЬКІСТЬ, КІЛЬКІСТЬ РІЗНИХ, МАКСИМУМ, МІНІМУМ, СЕРЕДНЕ.

МАЮЧІ (HAVING)

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

Приклад використання МАЮЧІ у запиті 1С:

ВИБРАТИ
НадходженняТоварівПослугТовари.Товар,
СУМА(Надходження ТоварівПослугТовари.Кількість) ЯК Кількість,
СУМА(Надходження ТоварівПослугТовари.Сума) ЯК Сума
З
Документ.Надходження ТоварівПослуг.Товари ЯК НадходженняТоварівПослугТовари

ЗГРУПУВАТИ ПО
Надходження ТоварівПослугТовари.товар

СУМА(Надходження ТоварівПослугТовари.Кількість) > 5

Так ми відберемо кількість товарів, яких надійшло понад 5 штук.

ЗНАЧЕННЯ()

Наприклад:

ДЕ Банк = Значення (Довідник. Банки. Порожнє Посилання)

ДЕ ВидНоменклатури = Значення(Довідник.ВидиНоменклатури.Товар)

ДЕ ТипНоменклатури= Значення(Перерахування.ТипиНоменклатури.Послуга)

ТИП у запиті

Тип даних можна перевірити так: за допомогою функцій ТИП() та ТИПЗНАЧЕННЯ() або за допомогою логічного оператора ПОСИЛАННЯ.

ВИРАЗИТИ()

Оператор Виразити у запитах 1С служить перетворення типів даних.

Синтаксис: ВИРАЗИТИ(<Выражение>ЯК<Тип значения>)

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

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

ВИБРАТИ
Контактна Інформація.Об'єкт,
ВИРАЗИТИ(КонтактнаяИнформация.Представление ЯК РЯДКУ(150)) ЯК Подання
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація

ЗГРУПУВАТИ ПО
ВИРАЗИТИ(КонтактнаяИнформация.Представление ЯК РЯДКУ(150)),
Контактна Інформація.Об'єкт

Є NULL (ISNULL)

Достатньо корисна функціямови запитів 1С, яка перевіряє значення у записі, і якщо воно дорівнює NULL,то дозволяє замінити своє значення. Найчастіше використовується при отриманні віртуальних таблиць залишків та оборотів, щоб приховати NULLі поставити зрозумілий 0 (нуль).

Є NULL (Податки Перед Місяця. Застосована Льгота ФСС, 0)

Така функція мови запитів 1С Є NULL за відсутності значення поверне нуль, що дозволить уникнути помилки.

З'ЄДНАННЯ (JOIN)

З'єднання бувають 4 типи: ЛІВОЕ, ПРАВО, ПОВНЕ, ВНУТРІШНЄ.

ЛІВОЕ І ПРАВОЕ З'ЄДНАННЯ

З'єднання використовуються для зв'язку двох таблиць за певною умовою. Особливість при ЛІВОМУ З'ЄДНАННІу тому, що ми беремо першу вказану таблицю повністю та прив'язуємо за умовою другу таблицю. Поля другої таблиці, які вдалося прив'язати за умовою, заповнюються значенням NULL.

Приклад лівого з'єднання у запиті 1С:

Поверне всю таблицю і заповнить поле «Банк» лише в тих місцях, де буде дотримуватися умова «Контрагенти. Найменування = Банки. Найменування». Якщо умови не дотримуються, у полі Банк буде встановлено NULL.

ПРАВА З'ЄДНАННЯ у мові 1С 8.3абсолютно аналогічно ЛІВОМУ з'єднанню, за винятком однієї відмінності: ПРАВОМУ З'ЄДНАННІ"Головна" таблиця - друга, а не перша.

ПОВНЕ З'ЄДНАННЯ

ПОВНЕ З'ЄДНАННЯвідрізняється від лівого та правого тим, що виводить усі записи з двох таблиць, з'єднує лише ті, які може з'єднати за умовою.

Наприклад:

ПОВНЕ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ

Мова запитів поверне обидві таблиці лише за виконаною умовою З'єднати записи. На відміну від лівого/правого з'єднання можлива поява NULL у двох полях.

ВНУТРІШНЯ З'ЄДНАННЯ

ВНУТРІШНЯ З'ЄДНАННЯвідрізняється від повного тем, що виводить ті записи, які змогли з'єднати за заданою умовою.

Наприклад:

З
Довідник.Контрагенти ЯК Клієнти

ВНУТРІШНЯ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ
Клієнти. Найменування = Банки. Найменування

Цей запит поверне лише рядки, в яких банк і контрагент мають однакову назву.

Висновок

Це лише невелика частина синтаксису з мови запитів 1С 8, надалі я спробую розглянути докладніше деякі моменти, показати і багато іншого!

У ході роботи із запитами будь-якому програмісту доводиться так чи інакше взаємодіяти з порожніми значеннями. Що ми розуміємо під пустим значенням?

Порожнє значення – це відсутність значення, або значення за промовчанням для типу даних. З примітивними типами все досить просто: значенням за замовчуванням є таке собі початкове значення, Що служить точкою відліку.

Види порожніх значень

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

  • Для типу Число – пустим значенням є нуль – 0.
  • Для типу Рядок – порожній рядок – «».
  • Для типу Дата – перше січня першого року – 01.01.0001 00:00:00. Саме з цієї дати ведеться відлік часу в 1С*.
  • Для типу Бульово – значенням за замовчуванням, технічно, є Брехня, але логічно обидва значення типу є заповненими. Тому прийняття рішення про те порожнє значення Брехня чи ні, ґрунтується на логіці конкретного алгоритму.

*Будьте уважні, поза 1С існують різні системи числення дат з різними точками відліку.

Відсутнє значення у сенсі відповідає лише типу Null.Цей тип містить лише одне значення, яке означає відсутність значення.

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

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

Робота з порожніми значеннями у запиті

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

Типи Число, Рядок, Бульовоописуються у запиті як у вбудованій мові:

ВИБРАТИ 0 ЯК ПрімерТіпаКількість, "Привіт світ" ЯК ПрімерТіпаРядок, Істина ЯК ПрімерТіпаБулеве

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

Вибрати Партії.Період З РегістрНакопичення.Партії Як Партії Де Залишки.ДокументПартії = Невизначено

Порожні посилання значення визначаються трохи складніше. У всіх об'єктів посилань передбачено зумовлене службове значення ПустеПосилання. Завдяки цьому можна єдиним способом вибрати порожнє посилання – через функцію Значення:

Вибрати Значення(Довідник.Номенклатура.ПустаПосилання) Як Порожня Номенклатура

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

  • Оператор Є Null дозволяє створити логічний вираз, що порівнює обране значення зі значенням Null.
  • Функція ЄNull повертає перший аргумент, якщо він не дорівнює Null, і другий аргумент у протилежному випадку.

Вирази, що визначають порожні значення, можна використовувати в будь-яких розділах запиту, що підтримують вирази. Наприклад, ви можете додати порожнє посилання в розділ Вибрати або перевірку на Null в Умову.

Практичні приклади

За допомогою функції Значення

Вибрати Товари.Посилання Як Номенклатура, Товари.Посилання = Значення(Довідник.Номенклатура.ПустаПосилання) Як ЦяПосиланняПорожня З втТовари Як втТовари

З використанням оператора Є Null

Вибрати Товари.Посилання Як Номенклатура, Товари.Посилання Є Null Як ЦеПосиланняПорожня З втТовари Як втТовари

Null при лівому або повному з'єднанні

Перевірка на Null

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

Вибрати втТовари.Посилання Як Номенклатура, Залишки.КількістьЗалишок Як Кількість, Залишки.КількістьЗалишок Є Null Як НіЗалишки З втТовари як втТовари Ліве З'єднанняРегістрНакопичення.ТовариНаСкладах.Залишки Як Залишки За втТовари.Посилання = Залишки.Номенклатура

Обробка Null значень

Модифікація попереднього запиту для демонстрації найчастіше зустрічається методики отримання будь-яких значень за замовчуванням, замість відсутніх. У цьому прикладі з використанням функції ЄNull, проводиться заміна відсутнього значення залишку, на логічно правильне 0.

Вибрати втТовари.Посилання Як Номенклатура, ЄNull (Залишки.КількістьЗалишок, 0) Як Кількість З втТовари як втТовари Ліве З'єднанняРегістрНакопичення.ТовариНаСкладах.Залишки Як Залишки За втТовари.Посилання = Залишки.Номенклатура

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

NULL- Відсутні значення.
Чи не плутати з нульовим значенням! NULL - це не число, не дорівнює пробілу, порожньому засланню, невизначено.

NULL - типообразующее значення, тобто. Існує тип NULL і єдине значення цього типу.

Значення NULL з'являються в запиті в таких ситуаціях:
а) Зовнішнє з'єднання, при якому не було знайдено відповідного запису в іншій таблиці (при лівому – у другій, при правому – у першій, при повному – в обох)
б) Звернення до реквізитів елементів групи і навпаки.
в) NULL у списку полів вибірки (ВИБРАТИ)
г) Звернення до реквізитів для битого посилання

Є NULLвикористовується в операторі ВИБРАТИ (як би перевіряючи, що значення це порожнє (Значення Є NULL)):
Код 1C v 8.х
ВИБІР
КОЛИ Значення Є NULL ТОДИ РезультатЯкщоNULL
Інакше значення
КІНЕЦЬ

ще приклад:
Код 1C v 8.х ВИБРАТИ
ВИБІР КОЛИ ОблікНоменклатуриЗалишки.КількістьЗалишок Є NULL ТОДІ 0
Інакше ОблікНоменклатуриЗалишки.КількістьЗалишок ЯК КількістьЗалишок
З

ДЕ

Функція ЄNULL (значення, РезультатЯкщоNULL)повертає значення свого першого параметра, якщо він не дорівнює NULL, і значення другого параметра в іншому випадку
Є згорнутим ВИБІР ... КІНЕЦЬ, але Є NULL краще.
Код 1C v 8.х
ВИБРАТИ
ЄNULL(Довідник.Номенклатура.Артикул, "---") ЯК Артикул,
Довідник.Номенклатура.Представлення ЯК Номенклатура.

ще приклад:
Код 1C v 8.х
ВИБРАТИ
Довідник Номенклатури.
Є NULL (Облік Номенклатури Залишки. Кількість Залишок, 0) ЯК Кількість Залишок
З
Довідник.Номенклатура ЯК ДовідникНоменклатури
ЛІВОЕ З'ЄДНАННЯ Реєстр Накопичення. Облік Номенклатури.
ПО ОблікНоменклатуриЗалишки.Номенклатура = ДовідникНоменклатури.Посилання
ДЕ
Довідник Номенклатури.ЦеГрупа = БРЕХНЯ
У цьому прикладі виходять усі елементи довідника номенклатури, після чого для кожної номенклатури з регістру накопичення виходять поточні залишки. Т.к. для номенклатури, за якою відсутні залишки, віртуальна таблиця залишків не запис поверне, то в результаті з'єднання в полі "ОблікНоменклатуриЗалишки.КількістьЗалишок" будуть значення NULL для номенклатури, за якою не було залишків. Для того щоб замість значення NULL в результаті запиту було значення 0, ми використовували функцію ЕСТЬNULL(), яка здійснить бажану заміну.

Є NULLвідрізняється від ВИБІР з наступних причин:
а) При Є NULL краще читається запит (простіше)
б) При Є NULL, якщо перевіряється складний вираз, то працює швидше, оскільки обчислюється один раз
в) При Є NULL вираз заміни наводиться до типу виразу, що перевіряється, якщо воно має тип Рядка (довжина) або Число (розрядність).

Не можна перевіряти значення на NULL звичайною рівністю, тому що в SQL діє тризначна логіка - Істина, Брехня, NULL, і результатом такого порівняння буде UNKNOWN, що в 1С 8.0 аналогічно БРЕХНЯ.
NULL<>0, тому при лівих зовнішніх з'єднанняхсправ. Номенклатура з таблицями залишків, цін, контрагентів із взаєморозрахунками за відсутності таких записів там буде NULL, який не дорівнює 0. Краще рішення- Є NULL