Работа с пустыми значениями в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как начинающие, так и опытные разработчики. Ошибки, связанные с некорректной обработкой Null, Неопределено или просто незаполненных полей, могут приводить к сбоям в отчетах, неправильной работе алгоритмов и даже падению системы. При этом способы проверки пустых значений зависят от контекста: вы работаете с базой данных, обрабатываете данные формы или пишете серверный код.
В этой статье мы разберем все актуальные методы проверки пустых значений в 1С 8.3 и 1С 8.2, включая нюансы работы с разными типами данных (строками, числами, ссылками, коллекциями). Особое внимание уделим типичным ошибкам, которые допускают программисты, и покажем, как их избежать. Если вы когда-либо видели сообщение "Значение не является значением объекта" или "Поле объекта не заполнено", этот материал поможет разобраться в причинах и исправить код.
Для удобства мы структурировали информацию по уровням сложности: от базовых проверок для пользователей до продвинутых техник для разработчиков. В конце статьи вы найдете FAQ с ответами на самые частые вопросы и таблицу сравнения методов проверки.
1. Что такое "пустое значение" в 1С?
В 1С:Предприятие под термином "пустое значение" может скрываться несколько разных концепций, и их часто путают. Давайте разберемся, с чем именно приходится работать:
✅ Null (NULL) — специальное значение в базе данных, обозначающее отсутствие данных. В 1С оно представлено как Null и чаще всего встречается при работе с запросами или внешними источниками (например, SQL-базами). Важно: Null и пустая строка ("") — это разные вещи!
✅ Неопределено (Undefined) — внутреннее значение платформы 1С, которое возвращается, когда переменная не инициализирована или метод не вернул результат. Например, если вы объявили переменную, но не присвоили ей значение:
Перем МояПеременная;
// Здесь МояПеременная = Неопределено
✅ Пустые коллекции — массивы, списки значений или таблицы значений с нулевым количеством элементов. Например, Новый Массив() или Новый СписокЗначений() без добавленных данных.
✅ Пустые строки — строки длиной 0 символов (""). В 1С они считаются заполненными (не равны Null), но часто требуют отдельной обработки.
✅ Пустые ссылки — ссылки на объекты (например, на справочники или документы), которые не указывают на реальный элемент. Такие ссылки могут возникать после удаления объекта или при ошибках заполнения.
Критическая особенность 1С: значение Null и Неопределено ведут себя по-разному в логических выражениях. Например, условие Если Null Тогда... вызовет ошибку, тогда как Если Неопределено Тогда... отработает корректно.
2. Базовые способы проверки пустых значений
Начнем с самых простых и универсальных методов, которые работают в большинстве случаев. Эти приемы подойдут как для программистов, так и для пользователей, которые пишут небольшие обработки.
🔹 Функция ПустоеЗначение() — самый распространенный способ. Она возвращает Истина, если значение равно Null или неопределено:
Если ПустоеЗначение(МояПеременная) Тогда
Сообщить("Переменная пустая или не определена!");
КонецЕсли;
🔹 Оператор =? — проверяет равенство Null. Удобен для запросов и работы с базой данных:
Если МояПеременная =? Null Тогда
Сообщить("Переменная содержит Null!");
КонецЕсли;
🔹 Проверка на Неопределено — используется для неинициализированных переменных:
Если МояПеременная = Неопределено Тогда
Сообщить("Переменная не инициализирована!");
КонецЕсли;
🔹 Проверка длины строки — для текстовых полей:
Если СтрДлина(МояСтрока) = 0 Тогда
Сообщить("Строка пустая!");
КонецЕсли;
📌 Важно! Функция ПустоеЗначение() не работает с пустыми строками (""). Для них нужно использовать СтрДлина() или сравнение с "".
Проверьте значение на Null с помощью `=?`|Используйте `ПустоеЗначение()` для универсальной проверки|Убедитесь, что строка не пустая с `СтрДлина()`|Проверьте инициализацию переменной на `Неопределено`-->
3. Проверка пустых значений в запросах 1С
При работе с запросами Null-значения встречаются особенно часто. Например, если в базе данных поле не заполнено, оно будет возвращаться как Null. Вот как с этим работать:
🔸 Использование Есть Null в условии:
Выбрать
Справочник.Номенклатура.Наименование Как Наименование
Из
Справочник.Номенклатура
Где
Есть Null(Справочник.Номенклатура.Артикул, "") <> ""
Этот запрос вернет только те позиции номенклатуры, у которых заполнен артикул.
🔸 Функция ВЫБОР для замены Null:
Выбрать
ВЫБОР
КОГДА Справочник.Контрагенты.ИНН Есть Null
ТОГДА ""
ИНАЧЕ Справочник.Контрагенты.ИНН
Конец Как ИНН
Из
Справочник.Контрагенты
🔸 Проверка в коде после выполнения запроса:
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ИНН =? Null Тогда
Сообщить("ИНН не заполнен для " + Выборка.Наименование);
КонецЕсли;
КонецЦикла;
⚠️ Внимание! В запросах 1С оператор
В SQL (и соответственно в языке запросов 1С) сравнение с Null всегда возвращает Unknown, а не True/False. Поэтому конструкция `Где Поле = Null` не вернет ни одной записи, даже если поле действительно содержит Null. Для корректной проверки используйте `Есть Null(Поле)` или `Поле Есть Null`.= Null не работает — вместо него используйте Есть Null или =? Null в коде.
Почему нельзя использовать `= Null` в условиях запроса?
4. Работа с пустыми ссылками и объектами
Пустые ссылки — отдельная головная боль в 1С. Они возникают, когда поле должно содержать ссылку на объект (например, справочник или документ), но не содержит ее. Вот как их обрабатывать:
📌 Проверка ссылок на пустоту:
Если НЕ ЗначениеЗаполнено(МояСсылка) Тогда
Сообщить("Ссылка пустая!");
КонецЕсли;
Функция ЗначениеЗаполнено() возвращает Ложь для пустых ссылок, Null и Неопределено.
📌 Проверка в формах:
Если вы работаете с управляемыми формами, используйте свойство ПустаяСсылка:
Если Объект.Контрагент.ПустаяСсылка() Тогда
Сообщить("Контрагент не выбран!");
КонецЕсли;
📌 Обработка удаленных объектов:
Иногда ссылка может указывать на удаленный объект. Чтобы это проверить:
Если НЕ МояСсылка.Пустая() И НЕ МояСсылка.ЭтоГруппа() И НЕ МояСсылка.ЭтоГруппаИлиЭлемент() Тогда
// Проверяем, существует ли объект
Попытка
Если НЕ МояСсылка.ПолучитьОбъект().Пустой() Тогда
Сообщить("Объект существует");
Иначе
Сообщить("Объект пустой или удален");
КонецЕсли;
Исключение
Сообщить("Объект не найден (возможно, удален)");
КонецПопытки;
КонецЕсли;
⚠️ Внимание! Метод ПолучитьОбъект() может вызвать исключение, если объект был удален. Всегда оборачивайте такой код в Попытка...Исключение.
| Тип значения | Метод проверки | Пример кода | Примечания |
|---|---|---|---|
| Null | =? Null или ПустоеЗначение() |
Если МояПеременная =? Null Тогда |
Работает и в коде, и в запросах (с Есть Null) |
| Неопределено | = Неопределено |
Если Переменная = Неопределено Тогда |
Только для неинициализированных переменных |
| Пустая строка | СтрДлина() = 0 или = "" |
Если Строка = "" Тогда |
Не путать с Null! |
| Пустая ссылка | ЗначениеЗаполнено() или ПустаяСсылка() |
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда |
Для ссылок на справочники, документы и др. |
| Пустая коллекция | Количество() = 0 |
Если МояТаблица.Количество() = 0 Тогда |
Для массивов, списков, таблиц значений |
5. Продвинутые техники для разработчиков
Если вы пишете сложные обработки или интеграции, базовых методов может быть недостаточно. Вот несколько продвинутых приемов:
🛠 Использование ТипЗнч() для динамической проверки:
Иногда нужно проверить тип значения перед обработкой:
Если ТипЗнч(МояПеременная) = Тип("Null") Тогда
Сообщить("Это Null!");
ИначеЕсли ТипЗнч(МояПеременная) = Тип("Строка") И СтрДлина(МояПеременная) = 0 Тогда
Сообщить("Это пустая строка!");
КонецЕсли;
🛠 Собственная функция для универсальной проверки:
Можно написать универсальную функцию, которая будет обрабатывать все случаи:
Функция ЭтоПустоеЗначение(Значение)
Если Значение = Неопределено Тогда
Возврат Истина;
ИначеЕсли Значение =? Null Тогда
Возврат Истина;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") И СтрДлина(Значение) = 0 Тогда
Возврат Истина;
ИначеЕсли ТипЗнч(Значение) = Тип("Ссылка") И Значение.ПустаяСсылка() Тогда
Возврат Истина;
ИначеЕсли ТипЗнч(Значение) = Тип("Массив") И Значение.Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции;
🛠 Обработка пустых значений в JSON:
При работе с ЧтениеJSON или ЗаписьJSON пустые значения могут преобразовываться неожиданно. Например, Null в JSON становится Null в 1С, а пустой массив — это уже не 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) теперь возвращает пустую строку, а не ошибку. Проверьте логику кода и при необходимости обновите условия.
После обновления платформы протестируйте критические участки кода, где используются проверки на пустые значения. Особенно это касается интеграций и работы с внешними системами.