К статье
Практический материал

Разработка и Конфигурация · 11 мин

Что такое 0 в 1С и чем он отличается от NULL и пустых значений

Чем отличаются 0, NULL, Неопределено и пустая ссылка в 1С, где возникает ноль в запросах и отчётах, как проверить и обработать пустые значения.

Вопрос «что такое 0 в 1С» обычно возникает у начинающих разработчиков и пользователей отчётов, когда вместо ожидаемого числа в результате запроса появляется ноль, NULL или пустая ячейка. В платформе 1С:Предприятие существует сразу несколько «пустых» состояний: числовой ноль, значение NULL в запросах, значение Неопределено во встроенном языке и пустые ссылки объектов. Они похожи внешне, но ведут себя по-разному в сравнениях, расчётах и отборах.

Путаница между этими значениями — одна из самых частых причин ошибок в отчётах и обработках: итог «схлопывается», условие не срабатывает, а программа выдаёт сообщение о преобразовании типов. Понимание различий позволяет правильно писать запросы, строить отборы в СКД и корректно обрабатывать данные в коде.

Ниже разобраны все виды «нулевых» значений в 1С, правила их сравнения, типовые сценарии, в которых они появляются, и способы безопасной обработки — с примерами кода на встроенном языке и языке запросов.

Числовой ноль: обычное значение, а не пустота

Число 0 в 1С — полноценное значение типа Число. Оно участвует в арифметике, сравнениях и агрегатных функциях наравне с любыми другими числами. Если в регистре накопления записана сумма 0, это осмысленные данные: например, документ проведён, но движение по сумме нулевое.

Важное следствие: проверка «Если Сумма = 0 Тогда» отлавливает только реальный ноль. Если переменная не инициализирована или в запросе вернулось NULL, такое условие не сработает, и логика обработки «пустых» сумм сломается. Поэтому перед сравнением с нулём нужно убедиться, что значение вообще имеет числовой тип.

Отдельная тонкость — отображение нуля в отчётах. В СКД и макетах ноль можно скрыть форматной строкой, но визуально пустая ячейка при этом всё равно содержит число 0. Это чисто представление, на данные оно не влияет.

NULL в запросах: откуда берётся и чем опасен

Чаще всего NULL появляется при левом соединении таблиц: если для строки левой таблицы не нашлось пары в правой, все поля правой таблицы будут NULL. Второй типичный источник — обращение к реквизиту через точку, когда сама ссылка равна NULL: выражение вида «Товары.Номенклатура.Артикул» вернёт NULL для строк, где соединение не сработало.

Главная опасность NULL — трёхзначная логика сравнений. Любое сравнение с NULL (равно, не равно, больше) даёт не Истину и не Ложь, а NULL, который в условии ГДЕ трактуется как отказ. Поэтому условие «ГДЕ Остаток <> 0» молча отфильтрует строки, где Остаток равен NULL, хотя интуитивно их хочется видеть.

Для безопасной работы с NULL в запросах есть два штатных инструмента: функция ЕСТЬNULL(Поле, 0), заменяющая NULL на заданное значение, и оператор «ЕСТЬ NULL» (IS NULL) для явной проверки. Использовать их нужно до сравнений и арифметики, а не после.

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

Неопределено и пустая ссылка во встроенном языке

Значение Неопределено — аналог «ничего не присвоено» во встроенном языке 1С. Его возвращают функции без явного возврата значения, методы поиска, которые ничего не нашли (например, НайтиПоКоду при отсутствии элемента), и реквизиты составного типа без установленного значения. Проверка выполняется прямым сравнением: «Если Результат = Неопределено Тогда».

Пустая ссылка — другое состояние: тип объекта известен (например, СправочникСсылка.Номенклатура), но конкретный элемент не выбран. Проверяется методом Пустая() или функцией ЗначениеЗаполнено(). Пустая ссылка не равна Неопределено и не равна NULL — это три разных значения трёх разных «миров»: встроенного языка, типизированных ссылок и языка запросов.

Третий родственный случай — пустые примитивы: пустая строка "", дата '00010101' и число 0. Универсальная функция ЗначениеЗаполнено() считает «незаполненными» именно эти значения: для числа — 0, для строки — пустую строку, для даты — начало отсчёта. Это удобно для проверки реквизитов форм, но важно помнить: логика ЗначениеЗаполнено не совпадает с логикой NULL в запросах.

Как правильно сравнивать и обрабатывать пустые значения

Рабочее правило: сначала определите, в каком контексте вы работаете — в запросе или в коде, — а затем применяйте соответствующие инструменты. Смешивать подходы нельзя: Неопределено нельзя использовать в запросе, а NULL нельзя проверить сравнением в коде (результат запроса с NULL в поле при выборке превратится в NULL-значение, которое корректно проверяется только через сравнение с NULL в самом запросе или через ЕСТЬNULL).

Для кода типовая последовательность проверки результата поиска такая: сначала сравнение с Неопределено (нашли ли вообще), затем Пустая() для ссылок, затем содержательные проверки значения. Пропуск первого шага — частая причина ошибки «Значение не является значением объектного типа» при обращении к свойствам несуществующего объекта.

При передаче параметров в запрос помните: Неопределено в параметр запроса передавать нельзя — возникнет ошибка. Если параметр может отсутствовать, используйте либо пустую ссылку нужного типа, либо стройте текст запроса с условным включением отбора.

Порядок безопасной обработки результата поиска
  1. 1
    Вызовите метод поиска (НайтиПоКоду, НайтиПоНаименованию, Выполнить запрос)
  2. 2
    Проверьте результат на Неопределено — если равно, обработайте ситуацию «не найдено»
  3. 3
    Для ссылки дополнительно проверьте Пустая() или ЗначениеЗаполнено()
  4. 4
    Только после проверок обращайтесь к реквизитам и методам объекта
  5. 5
    В запросе оберните соединяемые поля в ЕСТЬNULL до сравнений и арифметики

Типичные сценарии: где ноль и NULL ломают логику

Отчёты и СКД

В отчётах на СКД NULL чаще всего всплывает в итогах: группировка по полю, которое может быть NULL, создаёт строку с пустым представлением, а пользователь воспринимает её как «лишнюю». Решение — ЕСТЬNULL в запросе набора данных или настройка отбора «Заполнено» на уровне отчёта.

Обратная ситуация — когда ноль нужно показать, а СКД его «прячет»: если ресурс вычисляется через соединение и для строки нет данных, вместо 0 выводится пусто. Это снова NULL, и лечится он тем же ЕСТЬNULL с подстановкой нуля.

Обмены и загрузка данных

При загрузке из Excel, CSV или через COM/HTTP-интеграции пустые ячейки источника часто превращаются в Неопределено или пустые строки, а не в 0. Если дальше эти значения идут в числовые реквизиты документа, возможны либо ошибки преобразования, либо молчаливая запись нулей там, где данные просто отсутствовали. Перед записью нормализуйте значения: явно решайте, что означает пустая ячейка — ноль или пропуск.

Остатки и виртуальные таблицы

Виртуальные таблицы остатков возвращают только ненулевые записи. Поэтому при левом соединении справочника с остатками товары без остатка получают NULL, а не 0. Отчёт «Товары с нулевым остатком» строится именно через ЕСТЬNULL(Остаток, 0) = 0, а не через прямое сравнение поля остатка с нулём.

Типичные ошибки
01
Сравнение поля с NULL через = или <> в условии ГДЕ — строки с NULL теряются из результата
02
Проверка результата НайтиПоКоду без сравнения с Неопределено — ошибка при обращении к реквизитам
03
Использование ЗначениеЗаполнено для чисел, где 0 — осмысленное значение, — данные ошибочно считаются пустыми
04
Передача Неопределено в параметр запроса — ошибка выполнения запроса
05
Арифметика с NULL без ЕСТЬNULL — результат всего выражения становится NULL

Как проверить, что обработка написана правильно

После доработки запроса или кода проверьте поведение на граничных данных: строка с реальным нулём, строка с NULL (объект без движений), отсутствующий элемент справочника. Все три случая должны обрабатываться осознанно и давать предсказуемый результат.

Контрольные точки

Контрольные точки

Строка с реальным нулём в данных
Норма

Ноль отображается и участвует в расчётах как число

Тревожный признак

Строка пропадает из отчёта или считается пустой

Объект без движений (левое соединение)
Норма

В результате 0 благодаря ЕСТЬNULL

Тревожный признак

Пусто или NULL в итоговом поле

Поиск несуществующего элемента
Норма

Код корректно обрабатывает Неопределено

Тревожный признак

Ошибка обращения к свойствам или молчаливый пропуск

Итоги группировки в СКД
Норма

Нет строк с пустым значением группировки

Тревожный признак

Появляется строка с пустым представлением поля

Полезный приём при отладке запросов — временно вывести подозрительное поле дважды: как есть и обёрнутое в ЕСТЬNULL. Разница между двумя колонками сразу покажет, где в данных сидит NULL. В консоли запросов это занимает меньше минуты и экономит часы поиска причины «неправильных» итогов.

Если отчёт вдруг показывает итог меньше ожидаемого, первым делом проверьте условия ГДЕ и ИМЕЮЩИЕ на предмет сравнений с полями, которые могут быть NULL. В подавляющем большинстве случаев «потерянные» строки отфильтрованы именно трёхзначной логикой, а не ошибкой в данных.
ПЗ
Практическое замечание

Когда стоит привлечь специалиста

Самостоятельная работа с нулевыми значениями безопасна в отчётах, консоли запросов и тестовых копиях базы. Риск появляется, когда обработка массово изменяет данные: пересчёт итогов, групповое перепроведение, загрузка из внешних источников. Ошибка в логике обработки NULL здесь может исказить учётные данные без видимых сообщений.

Перед любой массовой обработкой сделайте резервную копию и прогоните алгоритм на ограниченной выборке с ручной сверкой результата. Если доработка затрагивает регламентные операции — закрытие месяца, расчёт себестоимости, — доверяйте её специалисту с опытом работы именно с вашей конфигурацией.

Частые вопросы

Почему условие «ГДЕ Поле <> 0» не выводит строки с пустым полем?

Потому что пустое поле в результате соединения — это NULL, а любое сравнение с NULL не даёт Истину. Оберните поле в ЕСТЬNULL(Поле, 0) или добавьте явное условие «ИЛИ Поле ЕСТЬ NULL».

Чем Неопределено отличается от NULL?

Неопределено — значение встроенного языка, означающее «ничего не присвоено». NULL — значение языка запросов, означающее отсутствие данных в поле результата. Они существуют в разных контекстах и не сравниваются друг с другом напрямую.

Как проверить, что переменная в коде пустая?

Для результата поиска — сравнение с Неопределено. Для ссылок — метод Пустая() или ЗначениеЗаполнено(). Для чисел — явное сравнение с 0, если ноль считается пустым значением в вашей логике.

Можно ли передать Неопределено параметром в запрос?

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

Почему в отчёте СКД появилась строка с пустым значением группировки?

Группировочное поле содержит NULL — обычно из-за левого соединения или необязательного реквизита. Замените его через ЕСТЬNULL в запросе набора данных или добавьте отбор «Заполнено» в настройках отчёта.

Как вывести в отчёте товары с нулевым остатком?

Соедините справочник номенклатуры левым соединением с виртуальной таблицей остатков и поставьте условие ЕСТЬNULL(Остаток, 0) = 0. Прямое сравнение поля остатка с нулём не сработает, потому что для товаров без движений поле равно NULL.

Итог

Что важно запомнить

0 в 1С — обычное число, а «пустоту» выражают NULL в запросах, Неопределено в коде и пустые ссылки. NULL нельзя сравнивать обычными операторами — используйте ЕСТЬNULL и ЕСТЬ NULL. Результат поиска всегда проверяйте на Неопределено до обращения к свойствам. Массовые обработки с такой логикой запускайте только после резервной копии и теста на выборке.