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

В этой статье мы разберём:

  • 🔍 Что на самом деле означает сообщение «Есть NULL» в контексте и баз данных.
  • 📊 Типичные сценарии, в которых оно возникает (запросы, отчёты, обмены, регламентные задания).
  • 🛠️ Практические способы поиска и устранения причины — от простых проверок до сложных отладок.
  • ⚠️ Что НЕЛЬЗЯ делать, чтобы не усугубить ситуацию (спойлер: игнорировать ошибку — худший вариант).

Важно понимать, что «NULL» в — это не просто «пустое значение», а специальный маркер, указывающий на отсутствие данных в базе. Его появление часто сигнализирует о проблемах с целостностью информации, некорректных связях между объектами или ошибках в логике обработки. Далее мы подробно разберём каждый аспект.

📊 Где вы чаще всего встречаете ошибку "Есть NULL"?
При выполнении запросов
В отчётах (СКД, компоновщик)
Во время обмена данными
При работе с регистрами
Другое

1. Что такое NULL в 1С и почему он появляется

В контексте 1С:Предприятие и SQL-баз данных NULL — это не то же самое, что пустая строка ("") или ноль (0). Это специальное значение, означающее отсутствие данных в поле. Например:

  • 📌 Поле ДатаДокумента не заполнено (не 01.01.0001, а именно отсутствует значение).
  • 📌 Ссылка на справочник не указана (не пустая ссылка, а неопределённая).
  • 📌 В регистре накопления нет записей для определённого измерения.

Сообщение «Есть NULL»** обычно появляется в двух случаях:

  1. Явная проверка в коде или запросе: например, конструкция ЕСТЬ NULL в языке запросов или функция ЗначениеЗаполнено() в встроенном языке.
  2. Неявное обнаружение системой: когда или СУБД (например, Microsoft SQL Server или PostgreSQL) автоматически фиксирует наличие NULL в данных, которые не должны их содержать.

Пример типичной ситуации: вы выполняете запрос с условием ГДЕ НЕ ДатаДокумента ЕСТЬ NULL, но в результате всё равно получаете сообщение об ошибке. Это означает, что в выборке остались записи с NULL, несмотря на фильтр. Почему так происходит — разберём дальше.

💡

Если ошибка появляется в отчёте, попробуйте временно убрать все фильтры и группировки. Часто «Есть NULL» возникает из-за некорректных параметров компоновки данных.

2. Типичные сценарии возникновения ошибки

Ошибка «Есть NULL»** может проявляться в разных частях системы. Рассмотрим наиболее частые случаи:

Сценарий Причина Пример
Запросы к базе данных Неучтённые NULL в полях, участвующих в условиях или соединениях (СОЕДИНИТЬ) Запрос с ЛЕВОЕ СОЕДИНЕНИЕ, где в правой таблице есть записи без связей
Отчёты (СКД) Поля с NULL в источниках данных, не обработанные в настройках компоновки Отчёт по продажам, где для некоторых товаров не указан Менеджер
Обмен данными Пропущенные обязательные реквизиты в выгружаемых/загружаемых данных Выгрузка справочника Контрагенты без заполненного ИНН
Регламентные задания Ошибки в обработках, работающих с неполными данными Задание по закрытию месяца, если не заполнены все обязательные документы

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

Почему NULL опасен в бухгалтерских регистрах?

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

3. Как диагностировать причину ошибки

Чтобы найти источник проблемы, следуйте этому алгоритму:

☑️ Пошаговая диагностика "Есть NULL"

Выполнено: 0 / 5

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

ВЫБРАТЬ

ЕСТЬNULL(Документ.Дата) КАК ЕстьNullВДате,

ЕСТЬNULL(Документ.Контрагент) КАК ЕстьNullВКонтрагенте

ИЗ

Документ.ЗаказПокупателя КАК Документ

Для отчётов (СКД) проверьте:

  • 🔎 Настройки компоновки: не отключены ли параметры Игнорировать пустые строки или Только непустые значения.
  • 🔎 Источники данных: нет ли в них полей с NULL, которые используются в выражениях.
  • 🔎 Параметры отчёта: не передаются ли в них неопределённые значения.

Если ошибка возникает при обмене данными, изучите правила обмена и логи. Часто проблема кроется в:

  • 📄 Пропущенных обязательных реквизитах (например, ИНН для контрагента).
  • 📄 Несоответствии типов данных между системами (например, в одной базе поле — строка, в другой — число).
  • 📄 Удаленных объектах, на которые есть ссылки в выгружаемых данных.
💡

В 90% случаев «Есть NULL» в обменах данных связано с нарушением целостности ссылок или пропущенными обязательными полями.

4. Практические способы устранения ошибки

В зависимости от причины, способы решения будут различаться. Рассмотрим наиболее эффективные подходы:

4.1. Исправление в запросах

Если проблема в запросе, модифицируйте его так, чтобы явно обрабатывать NULL:

  • 🛠 Используйте ВЫРАЗИТЬ(Поле КАК Строка) для приведения типов.
  • 🛠 Заменяйте NULL на значения по умолчанию с помощью ЗНАЧЕНИЕ(Поле, 0) или ЗНАЧЕНИЕ(Поле, "").
  • 🛠 Добавляйте проверки ГДЕ НЕ Поле ЕСТЬ NULL для критичных полей.

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

ВЫБРАТЬ

ЗНАЧЕНИЕ(Документ.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК Дата,

ЗНАЧЕНИЕ(Документ.Контрагент.Наименование, "") КАК Контрагент

ИЗ

Документ.ЗаказПокупателя КАК Документ

ГДЕ

НЕ Документ.ПометкаУдаления

4.2. Исправление в отчётах (СКД)

В настройках компоновки данных:

  1. Перейдите на закладку Параметры и проверьте, что все обязательные параметры имеют значения по умолчанию.
  2. На закладке Настройки включите опцию Игнорировать пустые строки.
  3. В выражениях полей используйте функции вроде ЕСЛИ ЗначениеЗаполнено(Поле); ТО Поле; ИНАЧЕ 0 КОНЕЦ.

4.3. Исправление при обмене данными

Проверьте:

  • 🔧 Правила обмена: все ли обязательные реквизиты заполняются.
  • 🔧 Предустановленные значения: например, для новых контрагентов может быть задан ИНН по умолчанию.
  • 🔧 Логи обмена: в них часто указывается, какое именно поле содержит NULL.

Если обмен происходит через Универсальный формат (EnterpriseData), добавьте в правила преобразование:

ЕСЛИ НЕ ЗначениеЗаполнено(Источник.ИНН) ТОГДА

Цель.ИНН = "0000000000";

ИНАЧЕ

Цель.ИНН = Источник.ИНН;

КОНЕЦЕСЛИ;

💡

Для массовой очистки NULL в справочниках можно использовать обработку «Поиск и замена значений» из стандартных поставок 1С.

5. Профилактика ошибок с NULL

Чтобы минимизировать риск появления «Есть NULL»** в будущем, следуйте этим рекомендациям:

  • 🔒 Настройте обязательность заполнения критичных реквизитов в метаданных (например, ИНН для контрагентов).
  • 🔒 Используйте значения по умолчанию для полей, которые не должны быть пустыми (например, Дата = ТекущаяДата()).
  • 🔒 Проверяйте данные перед записью в базу с помощью ЗначениеЗаполнено().
  • 🔒 Регулярно запускайте тесты целостности (например, обработку ТестированиеИИсправлениеИБ).

Особое внимание уделите обменам данными:

  • 📦 Всегда проверяйте выгружаемые данные на наличие NULL перед отправкой.
  • 📦 Используйте промежуточные обработки для валидации данных.
  • 📦 Настройте логирование ошибок в правилах обмена.

Для бухгалтерских баз критично следить за целостностью аналитики:

  • 💰 Регулярно проверяйте регистры на наличие записей с NULL в измерениях.
  • 💰 Используйте обработки для автоматического заполнения пропущенных субконто.
  • 💰 Настройте контроль остатков по ключевым аналитикам.
💡

Профилактика NULL экономит время: на исправление последствий уходит в 5–10 раз больше ресурсов, чем на предотвращение.

6. Частые ошибки при работе с NULL

Даже опытные разработчики иногда допускают ошибки, которые приводят к появлению «Есть NULL»**. Вот что делать не рекомендуется:

⚠️ Внимание: Никогда не используйте конструкцию Поле = NULL в запросах. Для проверки на NULL всегда применяйте Поле ЕСТЬ NULL или НЕ Поле ЕСТЬ NULL. Сравнение с NULL через = всегда возвращает ЛОЖЬ.

Другие распространённые ошибки:

  • Игнорирование NULL в соединениях таблиц: если в ЛЕВОМ СОЕДИНЕНИИ правая таблица содержит NULL, это может исказить результат.
  • Отсутствие обработки NULL в выражениях: например, СУММА(Поле) вернёт NULL, если все значения в поле — NULL.
  • Удаление записей без проверки ссылок: это может оставить «висячие» ссылки, которые превратятся в NULL.

Пример некорректного запроса:

// НЕПРАВИЛЬНО: сравнение с NULL через =

ВЫБРАТЬ *

ИЗ Документ.ЗаказПокупателя

ГДЕ Контрагент = NULL

Правильный вариант:

// ПРАВИЛЬНО: использование ЕСТЬ NULL

ВЫБРАТЬ *

ИЗ Документ.ЗаказПокупателя

ГДЕ Контрагент ЕСТЬ NULL

⚠️ Внимание: В некоторых версиях и СУБД поведение функций агрегации (СУММА, МАКСИМУМ) с NULL может отличаться. Например, СУММА(Поле) в PostgreSQL вернёт NULL, если все значения — NULL, а в MS SQL — ноль. Уточняйте это в документации к вашей СУБД.

7. Инструменты для автоматизированного поиска NULL

Ручной поиск NULL в большой базе может занять часы. К счастью, есть инструменты, которые упростят задачу:

Инструмент Назначение Где взять
ТестированиеИИсправлениеИБ Проверка целостности базы, включая поиск «битых» ссылок и NULL Стандартная обработка в конфигураторе
SQL Profiler (для MS SQL) Отслеживание запросов, возвращающих NULL Утилита от Microsoft
1С:Аналитика Анализ данных с визуализацией пропущенных значений Дополнительный продукт от 1С
Обработка ПоискNULL Специализированный поиск NULL в справочниках и документах Инфостарт, GitHub

Для быстрого анализа можно использовать следующий запрос (пример для MS SQL):

SELECT *

FROM ИнформационнаяБаза.dbo._Reference162 AS Контрагенты

WHERE ИНН IS NULL

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

ВЫБРАТЬ *

ИЗ Справочник.Контрагенты КАК Контрагенты

ГДЕ Контрагенты.ИНН ЕСТЬ NULL

💡

Для массовой замены NULL на значения по умолчанию используйте обработку «Групповая обработка справочников и документов» с настройкой правил заполнения.

FAQ: Частые вопросы по ошибке «Есть NULL»

Почему ошибка появляется только в отчёте, но не в самом документе?

Это связано с тем, что в документе поле может быть невидимым или иметь значение по умолчанию, которое не отображается в форме. Однако в отчёте (особенно в СКД) данные извлекаются напрямую из базы, где поле может содержать NULL. Проверьте настройки видимости полей в форме документа и источники данных отчёта.

Как найти, в каком именно поле есть NULL, если ошибка появляется в большом запросе?

Разбейте запрос на части и проверяйте каждую таблицу отдельно. Например:

ВЫБРАТЬ

ЕСТЬNULL(Поле1) КАК Поле1Null,

ЕСТЬNULL(Поле2) КАК Поле2Null

ИЗ ВашаТаблица

Так вы сможете точно определить, какое поле содержит NULL.

Можно ли полностью запретить NULL в базе 1С?

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

  • Настроить обязательность заполнения критичных полей в метаданных.
  • Использовать значения по умолчанию (например, пустую строку вместо NULL).
  • Добавлять проверки в модулях объектов перед записью.
Ошибка появляется при обмене с другой базой. Что делать?

Скорее всего, проблема в правилах обмена или в данных источника. Проверьте:

  1. Логи обмена на наличие ошибок валидации.
  2. Соответствие типов данных в полях (например, в одной базе поле — строка, в другой — число).
  3. Наличие обязательных реквизитов, которые не заполнены в исходной базе.

Если обмен происходит через EnterpriseData, добавьте в правила преобразования для замены NULL на значения по умолчанию.

После обновления конфигурации появилось много NULL. Это нормально?

Нет, это не нормально. Вероятно, при обновлении:

  • Не были перенесены данные из старых реквизитов в новые.
  • Изменилась структура таблиц, и некоторые поля остались незаполненными.
  • Произошла ошибка при выполнении постобработки обновления.

Проверьте логи обновления и при необходимости восстановите данные из резервной копии.