Почему в запросе 1С вместо результата вычислений выводится NULL?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов или обработок на платформе 1С:Предприятие часто возникают ситуации, когда после объединения данных из разных таблиц в итоговом результате вместо ожидаемых чисел мы получаем значение NULL. Давайте разберемся, почему это происходит и как правильно выполнять математические операции в запросах, чтобы избежать подобных ошибок.

Суть проблемы: как NULL портит математику

Основная причина появления NULL кроется в логике работы ЛЕВОГО СОЕДИНЕНИЯ (LEFT JOIN). Когда мы присоединяем одну таблицу к другой, база данных пытается найти соответствие между записями по заданному условию. Если для какой-либо строки из «левой» (основной) таблицы не нашлось подходящей записи в «правой» таблице, платформа 1С автоматически заполняет поля из «правой» таблицы значением NULL.

В языке запросов 1С, как и в большинстве SQL-движков, любая арифметическая операция с участием NULL дает на выходе NULL. Например, если вы пытаетесь выполнить вычитание: СуммаНаряда - СуммаФакт, и в одной из переменных оказывается пустое значение, результат будет равен NULL, даже если второе значение является числом.

Разбираем решение: использование функции ЕСТЬNULL

Чтобы гарантировать корректный математический расчет, необходимо принудительно преобразовывать NULL в числовое значение (обычно в 0). Для этого в платформе 1С предусмотрена функция ЕСТЬNULL (в английской версии ISNULL). Она проверяет значение поля: если оно не равно NULL, функция возвращает само значение, в противном случае — возвращает указанный нами результат замены.

Пошаговое исправление запроса

Рассмотрим, как правильно изменить ваш финальный запрос, чтобы расчет Пересчет выполнялся без ошибок. Вместо прямого обращения к полям, нам нужно обернуть каждое слагаемое в функцию ЕСТЬNULL.

Вот как должен выглядеть исправленный участок кода:


ВЫБРАТЬ
    ВТ_Инциденты.Документ КАК Документ,
    ВТ_Инциденты.СуммаНаряда КАК СуммаНаряда,
    ВТ_Наряды.СуммаФакт КАК СуммаФакт,
    ЕСТЬNULL(ВТ_Инциденты.СуммаНаряда, 0) - ЕСТЬNULL(ВТ_Наряды.СуммаФакт, 0) КАК Пересчет
ИЗ
    ВТ_Инциденты КАК ВТ_Инциденты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Наряды КАК ВТ_Наряды
        ПО ВТ_Инциденты.Документ = ВТ_Наряды.ГлавныйДокумент

Важные рекомендации при работе с NULL

  1. Типизация данных: При использовании функции ЕСТЬNULL следите за тем, чтобы тип значения замены (например, 0) соответствовал типу поля. Если поле имеет составной тип, это может привести к ошибкам, поэтому иногда требуется дополнительное приведение типов через ВЫРАЗИТЬ.
  2. Логика агрегатных функций: Помните, что агрегатные функции, такие как СУММА(), игнорируют NULL-значения. Если вы суммируете колонку, содержащую NULL, они просто исключаются из подсчета, что может привести к неверным итогам, если вы ожидали, что система будет воспринимать их как ноли.
  3. Выбор типа соединения: Если в итоговом результате вам не нужны записи, для которых не нашлось соответствий в обеих таблицах, используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО. Это позволит отсечь записи с NULL еще до выполнения математических вычислений.

Заключение

При выполнении любых расчетов в запросах 1С всегда задавайте себе вопрос: «Может ли здесь оказаться пустое значение?». Если соединение таблиц происходит не «внутренне», ответ почти всегда — да. Приучите себя использовать ЕСТЬNULL как стандарт безопасности для всех числовых полей, участвующих в формулах. Это позволит избежать многих часов отладки и гарантирует, что ваши отчеты будут выдавать верные цифры.

← На главную