Разработка и Конфигурация · 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) для явной проверки. Использовать их нужно до сравнений и арифметики, а не после.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Товары.Ссылка = Остатки.Номенклатура
ГДЕ
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) <= 0Неопределено и пустая ссылка во встроенном языке
Значение Неопределено — аналог «ничего не присвоено» во встроенном языке 1С. Его возвращают функции без явного возврата значения, методы поиска, которые ничего не нашли (например, НайтиПоКоду при отсутствии элемента), и реквизиты составного типа без установленного значения. Проверка выполняется прямым сравнением: «Если Результат = Неопределено Тогда».
Пустая ссылка — другое состояние: тип объекта известен (например, СправочникСсылка.Номенклатура), но конкретный элемент не выбран. Проверяется методом Пустая() или функцией ЗначениеЗаполнено(). Пустая ссылка не равна Неопределено и не равна NULL — это три разных значения трёх разных «миров»: встроенного языка, типизированных ссылок и языка запросов.
Третий родственный случай — пустые примитивы: пустая строка "", дата '00010101' и число 0. Универсальная функция ЗначениеЗаполнено() считает «незаполненными» именно эти значения: для числа — 0, для строки — пустую строку, для даты — начало отсчёта. Это удобно для проверки реквизитов форм, но важно помнить: логика ЗначениеЗаполнено не совпадает с логикой NULL в запросах.
Как правильно сравнивать и обрабатывать пустые значения
Рабочее правило: сначала определите, в каком контексте вы работаете — в запросе или в коде, — а затем применяйте соответствующие инструменты. Смешивать подходы нельзя: Неопределено нельзя использовать в запросе, а NULL нельзя проверить сравнением в коде (результат запроса с NULL в поле при выборке превратится в NULL-значение, которое корректно проверяется только через сравнение с NULL в самом запросе или через ЕСТЬNULL).
Для кода типовая последовательность проверки результата поиска такая: сначала сравнение с Неопределено (нашли ли вообще), затем Пустая() для ссылок, затем содержательные проверки значения. Пропуск первого шага — частая причина ошибки «Значение не является значением объектного типа» при обращении к свойствам несуществующего объекта.
При передаче параметров в запрос помните: Неопределено в параметр запроса передавать нельзя — возникнет ошибка. Если параметр может отсутствовать, используйте либо пустую ссылку нужного типа, либо стройте текст запроса с условным включением отбора.
- 1Вызовите метод поиска (НайтиПоКоду, НайтиПоНаименованию, Выполнить запрос)
- 2Проверьте результат на Неопределено — если равно, обработайте ситуацию «не найдено»
- 3Для ссылки дополнительно проверьте Пустая() или ЗначениеЗаполнено()
- 4Только после проверок обращайтесь к реквизитам и методам объекта
- 5В запросе оберните соединяемые поля в ЕСТЬNULL до сравнений и арифметики
Типичные сценарии: где ноль и NULL ломают логику
Отчёты и СКД
В отчётах на СКД NULL чаще всего всплывает в итогах: группировка по полю, которое может быть NULL, создаёт строку с пустым представлением, а пользователь воспринимает её как «лишнюю». Решение — ЕСТЬNULL в запросе набора данных или настройка отбора «Заполнено» на уровне отчёта.
Обратная ситуация — когда ноль нужно показать, а СКД его «прячет»: если ресурс вычисляется через соединение и для строки нет данных, вместо 0 выводится пусто. Это снова NULL, и лечится он тем же ЕСТЬNULL с подстановкой нуля.
Обмены и загрузка данных
При загрузке из Excel, CSV или через COM/HTTP-интеграции пустые ячейки источника часто превращаются в Неопределено или пустые строки, а не в 0. Если дальше эти значения идут в числовые реквизиты документа, возможны либо ошибки преобразования, либо молчаливая запись нулей там, где данные просто отсутствовали. Перед записью нормализуйте значения: явно решайте, что означает пустая ячейка — ноль или пропуск.
Остатки и виртуальные таблицы
Виртуальные таблицы остатков возвращают только ненулевые записи. Поэтому при левом соединении справочника с остатками товары без остатка получают NULL, а не 0. Отчёт «Товары с нулевым остатком» строится именно через ЕСТЬNULL(Остаток, 0) = 0, а не через прямое сравнение поля остатка с нулём.
Как проверить, что обработка написана правильно
После доработки запроса или кода проверьте поведение на граничных данных: строка с реальным нулём, строка с 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. Результат поиска всегда проверяйте на Неопределено до обращения к свойствам. Массовые обработки с такой логикой запускайте только после резервной копии и теста на выборке.