Проверка на пустое значение в 1С 8.5

В процессе разработки на платформе 1С часто возникает задача: определить, содержит ли переменная или поле базы данных какое-либо значение, или же оно «пустое». В отличие от многих других языков, в 1С понятие «пустое значение» имеет несколько оттенков. Разберем их по порядку.

Что считается «пустым» в 1С?

То, что считается пустым в конкретной задаче, зависит от типа данных переменной.

  1. Неопределено – переменная не инициализирована или ей явно присвоено это значение.
  2. NULL – используется только в запросах для обозначения отсутствия данных в результате соединения таблиц.
  3. Пустая ссылка – ссылка на несуществующий объект базы данных (например, невыбранный элемент справочника).
  4. Пустая строка – "".
  5. Нулевое число – 0.
  6. Пустая дата – '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 КАК ОтсутствиеДанных

Может быть полезно: в языке запросов аналогом условного оператора Если…Тогда…Иначе является оператор ВЫБОР…КОГДА. Синтаксис у него следующий:

ВЫБОР
      КОГДА <Условие> 
            ТОГДА <Выражение при выполнениии условия>
      ИНАЧЕ <Выражение при невыполнении условия>
КОНЕЦ

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправьте форму и мы вам перезвоним

Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу
Сайт itviar.ru использует cookie для персонализации и хранения настроек.
Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу