Работа с пустыми значениями в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как начинающие, так и опытные разработчики. Ошибки, связанные с некорректной обработкой Null, Неопределено или просто незаполненных полей, могут приводить к сбоям в отчетах, неправильной работе алгоритмов и даже падению системы. При этом способы проверки пустых значений зависят от контекста: вы работаете с базой данных, обрабатываете данные формы или пишете серверный код.

В этой статье мы разберем все актуальные методы проверки пустых значений в 1С 8.3 и 1С 8.2, включая нюансы работы с разными типами данных (строками, числами, ссылками, коллекциями). Особое внимание уделим типичным ошибкам, которые допускают программисты, и покажем, как их избежать. Если вы когда-либо видели сообщение "Значение не является значением объекта" или "Поле объекта не заполнено", этот материал поможет разобраться в причинах и исправить код.

Для удобства мы структурировали информацию по уровням сложности: от базовых проверок для пользователей до продвинутых техник для разработчиков. В конце статьи вы найдете FAQ с ответами на самые частые вопросы и таблицу сравнения методов проверки.

📊 Какой версии 1С вы пользуетесь?
1С 8.3 (управляемые формы)
1С 8.2 (обычные формы)
1С 7.7
Не знаю
Другая

1. Что такое "пустое значение" в 1С?

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

Null (NULL) — специальное значение в базе данных, обозначающее отсутствие данных. В оно представлено как Null и чаще всего встречается при работе с запросами или внешними источниками (например, SQL-базами). Важно: Null и пустая строка ("") — это разные вещи!

Неопределено (Undefined) — внутреннее значение платформы , которое возвращается, когда переменная не инициализирована или метод не вернул результат. Например, если вы объявили переменную, но не присвоили ей значение:

Перем МояПеременная;

// Здесь МояПеременная = Неопределено

Пустые коллекции — массивы, списки значений или таблицы значений с нулевым количеством элементов. Например, Новый Массив() или Новый СписокЗначений() без добавленных данных.

Пустые строки — строки длиной 0 символов (""). В они считаются заполненными (не равны Null), но часто требуют отдельной обработки.

Пустые ссылки — ссылки на объекты (например, на справочники или документы), которые не указывают на реальный элемент. Такие ссылки могут возникать после удаления объекта или при ошибках заполнения.

Критическая особенность 1С: значение Null и Неопределено ведут себя по-разному в логических выражениях. Например, условие Если Null Тогда... вызовет ошибку, тогда как Если Неопределено Тогда... отработает корректно.

2. Базовые способы проверки пустых значений

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

🔹 Функция ПустоеЗначение() — самый распространенный способ. Она возвращает Истина, если значение равно Null или неопределено:

Если ПустоеЗначение(МояПеременная) Тогда

Сообщить("Переменная пустая или не определена!");

КонецЕсли;

🔹 Оператор =? — проверяет равенство Null. Удобен для запросов и работы с базой данных:

Если МояПеременная =? Null Тогда

Сообщить("Переменная содержит Null!");

КонецЕсли;

🔹 Проверка на Неопределено — используется для неинициализированных переменных:

Если МояПеременная = Неопределено Тогда

Сообщить("Переменная не инициализирована!");

КонецЕсли;

🔹 Проверка длины строки — для текстовых полей:

Если СтрДлина(МояСтрока) = 0 Тогда

Сообщить("Строка пустая!");

КонецЕсли;

📌 Важно! Функция ПустоеЗначение() не работает с пустыми строками (""). Для них нужно использовать СтрДлина() или сравнение с "".

Проверьте значение на Null с помощью `=?`|Используйте `ПустоеЗначение()` для универсальной проверки|Убедитесь, что строка не пустая с `СтрДлина()`|Проверьте инициализацию переменной на `Неопределено`-->

3. Проверка пустых значений в запросах 1С

При работе с запросами Null-значения встречаются особенно часто. Например, если в базе данных поле не заполнено, оно будет возвращаться как Null. Вот как с этим работать:

🔸 Использование Есть Null в условии:

Выбрать

Справочник.Номенклатура.Наименование Как Наименование

Из

Справочник.Номенклатура

Где

Есть Null(Справочник.Номенклатура.Артикул, "") <> ""

Этот запрос вернет только те позиции номенклатуры, у которых заполнен артикул.

🔸 Функция ВЫБОР для замены Null:

Выбрать

ВЫБОР

КОГДА Справочник.Контрагенты.ИНН Есть Null

ТОГДА ""

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

Конец Как ИНН

Из

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

🔸 Проверка в коде после выполнения запроса:

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

Если Выборка.ИНН =? Null Тогда

Сообщить("ИНН не заполнен для " + Выборка.Наименование);

КонецЕсли;

КонецЦикла;

⚠️ Внимание! В запросах оператор = Null не работает — вместо него используйте Есть Null или =? Null в коде.

Почему нельзя использовать `= Null` в условиях запроса?

В SQL (и соответственно в языке запросов 1С) сравнение с Null всегда возвращает Unknown, а не True/False. Поэтому конструкция `Где Поле = Null` не вернет ни одной записи, даже если поле действительно содержит Null. Для корректной проверки используйте `Есть Null(Поле)` или `Поле Есть Null`.

4. Работа с пустыми ссылками и объектами

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

📌 Проверка ссылок на пустоту:

Если НЕ ЗначениеЗаполнено(МояСсылка) Тогда

Сообщить("Ссылка пустая!");

КонецЕсли;

Функция ЗначениеЗаполнено() возвращает Ложь для пустых ссылок, Null и Неопределено.

📌 Проверка в формах:

Если вы работаете с управляемыми формами, используйте свойство ПустаяСсылка:

Если Объект.Контрагент.ПустаяСсылка() Тогда

Сообщить("Контрагент не выбран!");

КонецЕсли;

📌 Обработка удаленных объектов:

Иногда ссылка может указывать на удаленный объект. Чтобы это проверить:

Если НЕ МояСсылка.Пустая() И НЕ МояСсылка.ЭтоГруппа() И НЕ МояСсылка.ЭтоГруппаИлиЭлемент() Тогда

// Проверяем, существует ли объект

Попытка

Если НЕ МояСсылка.ПолучитьОбъект().Пустой() Тогда

Сообщить("Объект существует");

Иначе

Сообщить("Объект пустой или удален");

КонецЕсли;

Исключение

Сообщить("Объект не найден (возможно, удален)");

КонецПопытки;

КонецЕсли;

⚠️ Внимание! Метод ПолучитьОбъект() может вызвать исключение, если объект был удален. Всегда оборачивайте такой код в Попытка...Исключение.

Тип значения Метод проверки Пример кода Примечания
Null =? Null или ПустоеЗначение() Если МояПеременная =? Null Тогда Работает и в коде, и в запросах (с Есть Null)
Неопределено = Неопределено Если Переменная = Неопределено Тогда Только для неинициализированных переменных
Пустая строка СтрДлина() = 0 или = "" Если Строка = "" Тогда Не путать с Null!
Пустая ссылка ЗначениеЗаполнено() или ПустаяСсылка() Если НЕ ЗначениеЗаполнено(Ссылка) Тогда Для ссылок на справочники, документы и др.
Пустая коллекция Количество() = 0 Если МояТаблица.Количество() = 0 Тогда Для массивов, списков, таблиц значений

5. Продвинутые техники для разработчиков

Если вы пишете сложные обработки или интеграции, базовых методов может быть недостаточно. Вот несколько продвинутых приемов:

🛠 Использование ТипЗнч() для динамической проверки:

Иногда нужно проверить тип значения перед обработкой:

Если ТипЗнч(МояПеременная) = Тип("Null") Тогда

Сообщить("Это Null!");

ИначеЕсли ТипЗнч(МояПеременная) = Тип("Строка") И СтрДлина(МояПеременная) = 0 Тогда

Сообщить("Это пустая строка!");

КонецЕсли;

🛠 Собственная функция для универсальной проверки:

Можно написать универсальную функцию, которая будет обрабатывать все случаи:

Функция ЭтоПустоеЗначение(Значение)

Если Значение = Неопределено Тогда

Возврат Истина;

ИначеЕсли Значение =? Null Тогда

Возврат Истина;

ИначеЕсли ТипЗнч(Значение) = Тип("Строка") И СтрДлина(Значение) = 0 Тогда

Возврат Истина;

ИначеЕсли ТипЗнч(Значение) = Тип("Ссылка") И Значение.ПустаяСсылка() Тогда

Возврат Истина;

ИначеЕсли ТипЗнч(Значение) = Тип("Массив") И Значение.Количество() = 0 Тогда

Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции;

🛠 Обработка пустых значений в JSON:

При работе с ЧтениеJSON или ЗаписьJSON пустые значения могут преобразовываться неожиданно. Например, Null в JSON становится Null в , а пустой массив — это уже не Null, а объект с нулевым количеством элементов.

🛠 Оптимизация запросов с Null:

Если вам часто приходится проверять Null в запросах, используйте конструкцию ВЫБОР КОГДА...ТОГДА для замены на дефолтные значения прямо в запросе. Это ускорит обработку:

Выбрать

ВЫБОР

КОГДА Справочник.Товары.Описание Есть Null

ТОГДА ""

ИНАЧЕ Справочник.Товары.Описание

Конец Как Описание

Из

Справочник.Товары

💡

Если вам нужно часто проверять пустые значения в больших выборках, создайте общую функцию в модуле приложения и используйте ее повторно. Это сократит код и уменьшит вероятность ошибок.

6. Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при работе с пустыми значениями. Вот самые распространенные из них:

Использование = Null вместо =? Null:

Как уже упоминалось, оператор = Null не работает. Всегда используйте =? Null или ПустоеЗначение().

Путаница между пустой строкой и Null:

Это разные вещи! Пустая строка ("") — это заполненное значение, а Null — отсутствие значения. Например:

Если МояСтрока = "" Тогда // Это пустая строка

Если МояСтрока =? Null Тогда // Это Null

Игнорирование Неопределено:

Если переменная не инициализирована, она содержит Неопределено, а не Null. Проверка на Null не сработает!

Некорректная работа с пустыми ссылками:

Ссылка может быть пустой (ПустаяСсылка() = Истина), но при этом не равной Null. Всегда используйте специализированные методы для ссылок.

Забывают про Попытка...Исключение при работе с объектами:

Если вы пытаетесь получить объект по ссылке, которая может быть пустой или указывать на удаленный элемент, обязательно обрабатывайте исключения.

📌 Пример опасной конструкции:

// Так делать НЕЛЬЗЯ!

Объект = МояСсылка.ПолучитьОбъект(); // Может упасть, если ссылка пустая или объект удален

Объект.МойМетод();

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

Попытка

Если НЕ МояСсылка.ПустаяСсылка() Тогда

Объект = МояСсылка.ПолучитьОбъект();

Объект.МойМетод();

КонецЕсли;

Исключение

Сообщить("Ошибка при работе с объектом: " + ОписаниеОшибки());

КонецПопытки;

💡

Всегда проверяйте тип значения перед обработкой. Пустая строка, Null и Неопределено требуют разных подходов. Универсальная функция проверки поможет избежать ошибок.

7. Проверка пустых значений в управляемых формах

В управляемых формах 1С 8.3 работа с пустыми значениями имеет свои особенности. Вот что нужно знать:

🖥 Проверка заполненности полей:

Используйте свойство ЗначениеЗаполнено для элементов формы:

Если НЕ ЗначениеЗаполнено(ЭлементыФормы.Контрагент) Тогда

Сообщить("Выберите контрагента!");

Возврат;

КонецЕсли;

🖥 Обработка событий ПриИзменении:

Чтобы отслеживать заполнение полей в реальном времени, используйте событие ПриИзменении:

Процедура КонтрагентПриИзменении(Элемент)

Если НЕ ЗначениеЗаполнено(Элемент) Тогда

ЭлементыФормы.КнопкаСохранить.Доступность = Ложь;

Иначе

ЭлементыФормы.КнопкаСохранить.Доступность = Истина;

КонецЕсли;

КонецПроцедуры

🖥 Проверка перед записью объекта:

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

Процедура ПередЗаписью(Отказ, РежимЗаписи)

Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Сообщить("Необходимо заполнить поле 'Контрагент'!");

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

🖥 Работа с динамическими списками:

В динамических списках пустые значения могут отображаться по-разному. Чтобы скрыть пустые строки, используйте отбор:

ЭлементыФормы.МойСписок.Отбор.Добавить("Поле",

Новый ОтборКомпоновкиДанных("Поле", ВидСравнения.НеРавно, Null));

⚠️ Внимание! В управляемых формах свойство Значение элемента может возвращать Неопределено, если поле не заполнено. Всегда проверяйте это перед использованием значения.

FAQ: Ответы на частые вопросы

🔍 Почему функция ПустоеЗначение() не работает с пустыми строками?

Функция ПустоеЗначение() проверяет только Null и Неопределено. Пустая строка ("") — это инициализированное значение, поэтому для нее нужно использовать СтрДлина() = 0 или сравнение с "".

🔍 Как проверить пустое значение в отчете?

В отчетах (СКД) используйте выражение вида:

ВЫРАЗИТЬ(ЕстьNull(Поле, "") = "" КАК Число)

Или настройте условное оформление для пустых значений в настройках компоновки.

🔍 Можно ли сравнивать Null с другими значениями?

Нет, любое сравнение с Null (например, Null = Null или Null > 5) вернет Неопределено. Для проверки используйте только =? Null или ПустоеЗначение().

🔍 Как обработать пустое значение в HTTP-запросе?

При работе с HTTPСервис или HTTPЗапрос пустые значения в JSON/XML могут преобразовываться в Null или пустые строки. Всегда проверяйте тип полученных данных:

Если ТипЗнч(ОтветСервера.Поле) = Тип("Null") Тогда

// Обработка Null

ИначеЕсли ОтветСервера.Поле = "" Тогда

// Обработка пустой строки

КонецЕсли;

🔍 Почему после обновления 1С перестали работать проверки на Null?

В новых версиях 1С:Предприятие (начиная с 8.3.18+) изменилось поведение некоторых функций при работе с Null. Например, Строка(Null) теперь возвращает пустую строку, а не ошибку. Проверьте логику кода и при необходимости обновите условия.

💡

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