В процессе разработки на платформе «1С:Предприятие 8» программисты часто сталкиваются с необходимостью обработки «пустых» значений. Особняком среди них стоит NULL — специальное значение, указывающее на отсутствие данных. В отличие от Неопределено или пустого значения типа (например, 0 для чисел или пустой строки), NULL ведет себя специфическим образом. В этой статье мы подробно разберем, как правильно идентифицировать это значение в программном коде, и выясним, какие методы являются наиболее эффективными.
Прежде чем переходить к методам проверки, давайте проанализируем ситуацию и выясним причину появления NULL в ваших переменных. По умолчанию новые переменные в языке 1С инициализируются значением Неопределено. Значение NULL практически никогда не возникает «само по себе». Рассмотрим основные источники его появления:
ЛЕВОЕ СОЕДИНЕНИЕ (или ПРАВОЕ СОЕДИНЕНИЕ), если в правой таблице не найдено соответствие, все поля этой таблицы в результате запроса примут значение NULL.СУММА или СРЕДНЕЕ по пустой выборке, результатом может стать NULL.NULL.Рассмотрим самый простой и быстрый способ. Во встроенном языке 1С (в отличие от языка запросов) оператор сравнения = корректно работает со значением NULL. Если вы точно знаете, что переменная может содержать либо число, либо NULL, используйте следующую конструкцию:
Если Переменная = Null Тогда
// Обработка случая, когда значение отсутствует
Переменная = 0;
КонецЕсли;
Важно: Обратите внимание, что слово Null пишется без кавычек — это литерал встроенного языка. Этот метод является самым производительным, так как процессор выполняет прямое сравнение значений без вызова дополнительных функций.
Проанализируем ситуацию, когда мы не уверены, что именно пришло в переменную: NULL, Неопределено или просто пустая ссылка. В этом случае на помощь приходит системная функция ЗначениеЗаполнено().
Эта функция возвращает Ложь, если значение переменной является «пустым» для своего типа. Разберем по шагам, что именно считает «пустотой» эта функция:
NULL.Неопределено.Ложь.Справочники.Номенклатура.ПустаяСсылка()).Для нашей задачи по замене отсутствующего числа на ноль код будет выглядеть так:
Если Не ЗначениеЗаполнено(Переменная) Тогда
Переменная = 0;
КонецЕсли;
Этот метод считается более «безопасным» и универсальным, так как он страхует разработчика от различных типов неопределенности данных. Однако помните: если число 0 для вашей бизнес-логики является валидным заполненным значением, этот метод вам не подойдет, так как он приравняет 0 к «пустоте».
Если нам нужно строго убедиться, что в переменной лежит именно NULL, и никакое другое значение, мы можем использовать функцию ТипЗнч(). Посмотрим на пример кода:
Если ТипЗнч(Переменная) = Тип("Null") Тогда
Переменная = 0;
КонецЕсли;
Такой подход часто встречается в коде, написанном опытными разработчиками для обеспечения максимальной наглядности, однако с технической точки зрения он идентичен простому сравнению Переменная = Null, но работает чуть медленнее из-за вызова функций определения типа.
Выясним важный нюанс, который часто путает новичков. В языке запросов 1С логика работы с NULL строится по стандартам SQL (трехуровневая логика).
В запросе: Выражение ГДЕ Поле = NULL всегда будет возвращать Ложь, даже если в поле действительно NULL. Для проверки в запросах используется специальный оператор ЕСТЬ NULL.
В коде (встроенном языке): Оператор = Null работает как обычное сравнение.
Рассмотрим пример правильной обработки NULL еще на этапе получения данных. Это «золотой стандарт» разработки — стараться избавиться от NULL как можно раньше, чтобы не плодить проверки в коде:
// Пример фрагмента текста запроса
"ВЫБРАТЬ
| ЕСТЬNULL(Продажи.СуммаОборота, 0) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК Продажи"
Используя функцию ЕСТЬNULL в запросе, вы гарантируете, что в выборку (и в последующие переменные кода) попадет число 0 вместо NULL, и проверка в коде вовсе не понадобится. Для интерактивной отладки запросов и проверки выражений с ЕСТЬNULL подойдёт инженерная консоль запросов с сохранением комментариев.
Посмотрим на типичную ошибку. Что будет, если попытаться сложить число и NULL во встроенном языке?
// Если Переменная = Null
Результат = Переменная + 10; // Вызовет ошибку: «Операция не определена для данных значений»
В отличие от классического SQL, где NULL + 10 = NULL, 1С выдаст критическую ошибку выполнения. Именно поэтому, если вы работаете с результатами левых соединений, проверка на NULL перед арифметическими операциями обязательна.
Мы проанализировали основные способы проверки значения на NULL. Выбор метода зависит от контекста:
Если Переменная = Null Тогда.Неопределено) — используйте Если Не ЗначениеЗаполнено(Переменная) Тогда.ЕСТЬNULL(Поле, 0) прямо в тексте запроса.Помните, что NULL — это не ноль и не пустая строка. Это отсутствие значения как такового, и правильная его обработка — признак профессионального подхода к разработке на платформе 1С.