THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

Добрий день.
В продовження про примітивних типахданих, так недавно розглядали, а сьогодні поговоримо про типі NULL.

Тип NULL - літерал, в якому може міститися лише одне значення це значення «NULL».
NULL - Чи не дорівнює порожній посиланням, Пробілу або Типу Не визначено.

Застосовується при роботі з БД (при з'єднанні таблиць), використовується для визначення відсутнього значення при роботі з БД.
Значення типу NULL можна отримати присвоївши змінної це значення:
Мінлива = NULL.

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

Для визначення значення NULL використовується конструкція Є NULL (is NULL).
Для перетворення типу NULL використовується функція ЕСТЬNULL (isNULL).

Для того, щоб в результаті запиту відсікти поля, що містять значення NULL застосовуються такі конструкції: - is not NULL - not is NULL

приклади

Приклад перевірки значення на NULL

ВИБРАТИ Довідник. Номенклатура. Найменування, Довідник. Номенклатура. ЗакупочнаяЦена ДЕ Довідник. Номенклатура. ЗакупочнаяЦена Є NULL

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

// Отримати суму по полю кількість. У разі, якщо немає записів, отримати 0ВИБРАТИ ЕСТЬNULL (СУМА (Кількість), 0) ЯК Кількість ІЗ Документ. РасхНакл. склад

З повагою 1С Програміст.
Залишайте свої коментар, мені цікава ваша думка.

NULL - це не що інше, як відсутність значення. Багато хто плутає його із значенням «0» типу число, порожній посиланням на який-небудь об'єкт або ж з нового рядка. Через це помилки виникає багато помилок.

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

Заснований на SQL, який не дозволяє перевіряти на значення NULL звичайним рівністю. Нижче описані два способи перевірки на NULL в 1С 8.3.

Функція мови запитів 1С 8.3 ЕСТЬNULL () має два вхідних параметра:

  • перевіряється вираз;
  • вираз заміни.

Якщо перевіряється значення буде NULL, то ця функція поверне значення виразу заміни. Якщо ж значення буде відмінно від NULL, то повернеться саме перевіряється вираз.

Нижче розглянуто приклад. У ньому вибираються всі номенклатурні позиції табличній частини товару з документа «Надходження товарів і послуг». За допомогою лівої з'єднання кожної номенклатурі проставляється остання ціна з регістра відомостей «Ціни номенклатури».

В даному випадку може виникнути така ситуація, що для будь-якої позиції може просто не бути ціни в регістрі. У такому випадку функція ЕСТЬNULL поверне нам звичний нуль. Якщо їй не скористатися, то при спробі провести арифметичні операції над полем «Ціна» зі значенням NULL ми отримаємо помилку.

ВИБРАТИ

ЕСТЬNULL (Цени.Цена, 0) ЯК АктуальнаяЦена
З



ДЕ

Є NULL в операторі ВИБІР

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

ВИБРАТИ
Товари.Номенклатура ЯК Товар,
ВИБІР
КОЛИ Цени.Цена Є NULL
ТОДІ 0
ІНАКШЕ Цени.Цена
КІНЕЦЬ ЯК АктуальнаяЦена
З
Документ.ПоступленіеТоваровУслуг.Товари ЯК Товари
ЛІВЕ З'ЄДНАННЯ РегістрСведеній.ЦениНоменклатури.СрезПоследніх ЯК Ціни
ПО Товари.Номенклатура = Цени.Номенклатура
ДЕ
Товари.Ссилка = & СсилкаНаДокумент

Відмінності функції ЕСТЬNULL () від ЕСТЬ NULL

Як ви могли побачити з попередніх прикладів, в обох випадках запит повертає одні й ті ж дані. Функція ЕСТЬNULL () є скороченим варіантом ВИБІР КОЛИ ... Є NULL ... КІНЕЦЬ, але вона все ж буде краще з наступних причин:

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

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

При роботі з цих слів іноді виникає ситуація, коли потрібно замінити значення 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).

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму