В процессе разработки на платформе 1С часто возникает задача: определить, содержит ли переменная или поле базы данных какое-либо значение, или же оно «пустое». В отличие от многих других языков, в 1С понятие «пустое значение» имеет несколько оттенков. Разберем их по порядку.
Что считается «пустым» в 1С?
То, что считается пустым в конкретной задаче, зависит от типа данных переменной.
- Неопределено – переменная не инициализирована или ей явно присвоено это значение.
- NULL – используется только в запросах для обозначения отсутствия данных в результате соединения таблиц.
- Пустая ссылка – ссылка на несуществующий объект базы данных (например, невыбранный элемент справочника).
- Пустая строка –
"". - Нулевое число –
0. - Пустая дата –
'00010101'(1 января 0001 года).
Проверка на пустое значение на встроенном языке 1С
Универсальный способ – функция ЗначениеЗаполнено()
Если ЗначениеЗаполнено(Переменная) Тогда
Сообщить("Значение есть");
Иначе
Сообщить("Значение пустое");
КонецЕсли;Это самый популярный и правильный метод для начинающих.
Как работает:
- Возвращает Истина, если значение не пустое и не равно
Неопределено. - Возвращает Ложь – для пустых ссылок, пустых строк, Неопределено, NULL (если он вдруг попал в код), нуля и пустой даты.
Проверка конкретного типа
Иногда нужно различить, что именно пусто. Например, ноль – допустимое числовое значение.
Для ссылочных типов (справочник, документ) используется метод Пустая() или сравнение со значением Справочники.<ИмяСправочника>.ПустаяСсылка(). Первый проверяет значение на пустуя ссылку.
Если СпрНоменклатура.Пустая() Тогда
Сообщить("Это пустая ссылка");
КонецЕсли;
Если СпрНоменклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Сообщить("Это пустая ссылка");
КонецЕсли;Для строк
Если Строка = "" ИЛИ Строка = Неопределено Тогда
Сообщить("Строка пуста");
КонецЕсли;Числа обычно проверяют на ноль, но число может быть и Неопределено, если переменную не инициализировали. Но с числом все не однозначно, ведь ноль далеко не всегда показывает, что переменная числового типа является пустым значением. Все зависит от конкретной ситуации.
Если Число = 0 ИЛИ Число = Неопределено Тогда
Сообщить("Ноль или не задано");
КонецЕсли;Пустая дата в 1С – это ‘00010101’. Удобно проверять через константу Дата(‘00010101’).
Если ДатаДок = '00010101' Тогда
Сообщить("Дата не заполнена");
КонецЕсли;Иногда нужно поймать именно неинициализированную переменную (имеет значение Неопределено).
Если Переменная = Неопределено Тогда
Сообщить("Переменная не имеет значения");
КонецЕсли;Проверка на пустое значение в языке запросов
В запросах к базе данных пустоты обозначаются ключевым словом NULL (это не то же самое, что Неопределено в коде). Чаще всего возникает при левом соединении, когда в правой части нет соответствующего значения. Для проверки на NULL в языке запросов имеется функцию ЕСТЬ NULL.
ВЫБОР
Контрагенты.Ссылка КАК Контрагент,
Договоры.Ссылка КАК Договор,
ВЫБОР
КОГДА Договоры.Ссылка ЕСТЬ NULL
ТОГДА "Нет договора для с контрагентом"
ИНАЧЕ "Есть договор с контрагентом"
КОНЕЦ КАК НаличиеДоговораСКонтрагентом
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Договоры
ПО Контрагенты.Ссылка = Договоры.ВладелецКак видно из логики кода, при левом соединении значение договора может быть равно NULL. Но с пустым значением очень неудобно работать. Поэтому чаще всего заменяют возможное значение NULL каким то значением по умолчанию, с которым проще всего работать. Для этой цели в языке запросов существует функция ЕСТЬNULL(). Она похожа по написанию на предыдущую функцию, но пишется слитно. Синтаксис у нее следующий:
ЕСТЬNULL(<Значение>, <ЗначениеПоУмолчанию>)Если Значение равно NULL, то вместо него функция вернет Значение по умолчанию, иначе вернет само это значение. Перепишем предыдущий код надлежащим образом:
ВЫБОР
Контрагенты.Ссылка КАК Контрагент,
ЕСТЬNULL(Договоры.Ссылка, ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)) КАК Договор,
ВЫБОР
КОГДА Договоры.Ссылка ЕСТЬ NULL
ТОГДА "Нет договора для с контрагентом"
ИНАЧЕ "Есть договор с контрагентом"
КОНЕЦ КАК НаличиеДоговораСКонтрагентом
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Договоры
ПО Контрагенты.Ссылка = Договоры.ВладелецКак вы уже могли заметить, пустое значение для ссылочного типа это ЗНАЧЕНИЕ(Справочник.<ИмяСправочника>.ПустаяСсылка). Вместо справочника может быть любой другой объект метаданных. Поэтому мы можем справнить значением с данной конструкцией, чтобы проверить ссылку на пустое значение.
Проверка числа и строки происходит аналогичным образом, как и во встроенном языке. А вот дату можно проверить сравнив со значением: ДАТАВРЕМЯ(1, 1, 1).
ВЫБРАТЬ
"" КАК ПустаяСтрока,
0 КАК ПустоеЧисло,
ДАТАВРЕМЯ(1,1,1) КАК ПустаяДата,
Значение(Справочник.Номенклатура.ПустаяСсылка) КАК ПустаяСсылка,
NULL КАК ОтсутствиеДанныхМожет быть полезно: в языке запросов аналогом условного оператора Если…Тогда…Иначе является оператор ВЫБОР…КОГДА. Синтаксис у него следующий:
ВЫБОР
КОГДА <Условие>
ТОГДА <Выражение при выполнениии условия>
ИНАЧЕ <Выражение при невыполнении условия>
КОНЕЦ