Разработка и Конфигурация · 9 мин
ЕСТЬNULL в 1С: что значит и как использовать в запросах
Что означает ЕСТЬNULL в языке запросов 1С: синтаксис, примеры замены NULL, типичные ошибки с типами данных, отличия от ЕСТЬ NULL и практические рекомендации.
ЕСТЬNULL — это функция встроенного языка запросов 1С, которая заменяет значение NULL на указанное вами значение. Она принимает два аргумента: проверяемое выражение и значение, которое нужно вернуть, если выражение равно NULL. Если проверяемое выражение не NULL — функция возвращает его само.
NULL в 1С — это не пустая строка, не ноль и не пустая ссылка. Это специальное значение «отсутствие данных», которое чаще всего появляется при левом соединении таблиц, когда в присоединяемой таблице не нашлось подходящей записи. Любая операция с NULL (сравнение, арифметика, конкатенация) даёт NULL, поэтому необработанные NULL ломают отчёты и вычисления.
Функция активно используется при построении отчётов на СКД, в произвольных запросах и при обработке остатков, оборотов и ссылочных полей. Понимание её работы — базовый навык для разработчика и консультанта 1С.
Что такое NULL в запросах 1С и откуда он берётся
NULL означает, что данных нет в принципе — поле не заполнено на уровне результата запроса. Самый частый источник NULL — левое соединение (ЛЕВОЕ СОЕДИНЕНИЕ): если для строки основной таблицы нет пары в присоединяемой, все поля второй таблицы получают значение NULL.
Также NULL появляется при обращении к реквизитам через разыменование, когда сама ссылка не заполнена, при соединении с виртуальными таблицами остатков без отборов и в полях составного типа, где фактическое значение отсутствует. Важно понимать: NULL не равен сам себе. Условие Поле = NULL всегда ложно, проверять нужно через Поле ЕСТЬ NULL.
Синтаксис функции ЕСТЬNULL
Функция записывается так: ЕСТЬNULL(ПроверяемоеВыражение, ЗначениеЗамены). Оба аргумента обязательны. Тип значения замены должен быть совместим с типом проверяемого выражения, иначе запрос либо вернёт ошибку, либо приведёт к неожиданным результатам при выводе.
Типичные примеры: ЕСТЬNULL(Остатки.КоличествоОстаток, 0) — подставить ноль вместо отсутствующего остатка; ЕСТЬNULL(Контрагенты.ИНН, "") — пустая строка вместо NULL; ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) — пустая ссылка вместо NULL.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Товары.Номенклатура = Остатки.НоменклатураФункцию можно вкладывать друг в друга для цепочки замен: ЕСТЬNULL(ЕСТЬNULL(Поле1, Поле2), 0) — сначала берётся Поле1, если оно NULL — Поле2, если и оно NULL — ноль.
Типичные сценарии применения
Остатки и обороты при левом соединении
Классическая задача — вывести список номенклатуры или контрагентов с остатками, включая позиции без движений. Без ЕСТЬNULL в колонках остатков будут пустоты, а итоги и группировки в СКД могут посчитаться некорректно. Замена на 0 делает отчёт читаемым и математически корректным.
Подстановка пустых ссылок
Когда ссылочное поле может быть NULL (например, при соединении с таблицей, где записи нет), подставляют пустую ссылку нужного типа через ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка). Это позволяет дальше безопасно разыменовывать реквизиты и сравнивать поле в отборах.
Строковые поля и представления
Для текстовых реквизитов (комментарии, ИНН, адреса) NULL заменяют пустой строкой, чтобы при выводе в отчёт или печатную форму не появлялись пустые ячейки там, где логичнее видеть отсутствие текста.
- 1Найдите в запросе поля из присоединяемых таблиц (правые части ЛЕВОГО СОЕДИНЕНИЯ)
- 2Определите тип каждого такого поля: число, строка, ссылка, дата
- 3Оберните поле в ЕСТЬNULL с заменой соответствующего типа: 0, пустая строка, пустая ссылка
- 4Выполните запрос в консоли запросов и проверьте, что вместо пустых ячеек подставлены значения
- 5Проверьте итоги и группировки — они должны считаться без пропусков
Ошибки типов и ограничения функции
Главное ограничение: типы обоих аргументов должны быть совместимы. Нельзя написать ЕСТЬNULL(СсылочноеПоле, 0) — запрос упадёт с ошибкой несоответствия типов. Если поле составного типа, значение замены должно входить в этот состав либо нужно явно приводить тип через ВЫРАЗИТЬ().
Вторая тонкость — ЕСТЬNULL не исправляет логику соединения. Если NULL появился из-за неправильного условия связи таблиц, замена на ноль просто замаскирует ошибку: отчёт покажет нули там, где данные должны были подтянуться. Сначала проверяйте корректность соединения, потом обрабатывайте NULL.
Отличие ЕСТЬNULL от проверки ЕСТЬ NULL
Эти конструкции часто путают. ЕСТЬ NULL — логический оператор проверки, используется в условиях ГДЕ и ВЫБОР: ГДЕ Остатки.Количество ЕСТЬ NULL отберёт строки, где данных нет. ЕСТЬNULL() — функция замены значения, используется в списке выборки и вычисляемых полях.
Выбор зависит от задачи: если нужно отфильтровать записи без данных — используйте ЕСТЬ NULL в отборе; если нужно вывести все записи, но заменить пустоты — используйте ЕСТЬNULL в полях. Комбинировать оба подхода можно в одном запросе.
Сравнение вариантов
Заменяет NULL на значение в результате выборки. Подходит для отчётов и вычислений, но требует совместимости типов
Проверка в условии ГДЕ или ВЫБОР. Подходит для отбора строк без данных, не меняет само значение
Гибкая замена с разной логикой для разных случаев. Длиннее записывается, но позволяет сложные условия
Типичные ошибки при использовании
Первая ошибка — замена NULL нулём там, где ноль имеет прикладной смысл. Например, если нулевой остаток и отсутствие данных — разные ситуации для анализа, ЕСТЬNULL сотрёт это различие. В таких случаях лучше выводить NULL как есть или добавлять признак «нет данных».
Вторая ошибка — забыть, что NULL «заразен»: выражение Цена * ЕСТЬNULL(Количество, 0) всё равно даст NULL, если NULL окажется в поле Цена. Обрабатывать нужно все поля, участвующие в вычислении, а не одно из них.
Третья ошибка — использование ЕСТЬNULL в условиях соединения и отборов там, где это влияет на оптимизатор запроса. Оборачивание полей связи в функции может отключить использование индексов и замедлить запрос на больших таблицах.
Как проверить результат
После добавления ЕСТЬNULL выполните запрос в консоли запросов и визуально проверьте колонки: пустые ячейки должны быть заменены на ожидаемые значения нужного типа. Затем сверьте итоговые суммы с данными без соединений — например, сумму остатков по регистру напрямую и через ваш запрос.
Как проверить результат
Вместо пустот стоят 0, пустые строки или пустые ссылки
Пустые ячейки остались — поле не обёрнуто или NULL в другом поле вычисления
Тип колонки соответствует ожидаемому (число, строка, ссылка)
Ошибка несоответствия типов при выполнении
Суммы сходятся с прямым запросом к регистру
Итоги расходятся — проблема в логике соединения, а не в NULL
Если запрос используется в СКД, дополнительно проверьте настройки ресурсов: поля, обработанные ЕСТЬNULL, корректно суммируются, а группировки не теряют строки с нулевыми значениями.
Удобное правило: оборачивайте в ЕСТЬNULL все поля из правой части левого соединения сразу при написании запроса, а не после обнаружения пустот в отчёте. Это дешевле, чем искать причину странных итогов после сдачи отчёта пользователям.
Частые вопросы
Чем ЕСТЬNULL отличается от ISNULL?
Это одна и та же функция: ISNULL — английский синтаксис, ЕСТЬNULL — русский. В запросах 1С можно писать любой вариант, результат идентичен. Выбор зависит от языка конфигурации и договорённостей в команде.
Можно ли использовать ЕСТЬNULL в условии ГДЕ?
Технически можно, например ГДЕ ЕСТЬNULL(Остатки.Количество, 0) > 0. Но это обычно отключает использование индексов и замедляет запрос. Для отбора строк без данных лучше использовать конструкцию ЕСТЬ NULL.
Почему ЕСТЬNULL не заменяет значение, хотя поле пустое?
Вероятно, в поле не NULL, а пустая ссылка, пустая строка или ноль — визуально они похожи, но это разные значения. ЕСТЬNULL реагирует только на NULL. Проверьте фактическое значение через консоль запросов или вывод типа поля.
Что подставлять вместо NULL для даты?
Обычно подставляют пустую дату: ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)). Если по смыслу нужна конкретная дата (например, текущая), её можно указать через параметр запроса, но учитывайте, что это изменит логику отчёта.
Работает ли ЕСТЬNULL в СКД и динамических списках?
Да, функция доступна везде, где используется язык запросов 1С: в наборах данных СКД, в произвольных запросах динамических списков, в запросах кода на встроенном языке. Синтаксис и ограничения по типам везде одинаковые.
Что важно запомнить
ЕСТЬNULL заменяет NULL на заданное значение и незаменима при левых соединениях. Следите за совместимостью типов, обрабатывайте все поля в вычислениях и не маскируйте функцией ошибки в условиях соединения таблиц.