Разработка и Конфигурация · 10 мин
Как в 1С написать код проверки на пустое значение
Как написать код проверки на пустое значение в 1С: ЗначениеЗаполнено, ПустаяСтрока, Неопределено, NULL в запросах. Примеры кода, типичные ошибки и FAQ.
В 1С «пустое значение» — это не одно состояние, а целое семейство: пустая строка, ноль, пустая ссылка, Неопределено, NULL в запросе, пустая дата. Начинающий разработчик часто пишет проверку вида Если Значение = "" Тогда и получает ошибку или ложный результат, потому что реальное значение оказалось пустой ссылкой или NULL. Поэтому корректная проверка начинается с понимания типа данных, который вы анализируете.
Основной инструмент — встроенная функция ЗначениеЗаполнено(). Она возвращает Истина, если значение заполнено, и Ложь — если оно пустое для своего типа: пустая строка, ноль, пустая дата, пустая ссылка, Неопределено. В большинстве прикладных задач достаточно конструкции Если Не ЗначениеЗаполнено(Реквизит) Тогда с последующим действием — сообщением, отказом или подстановкой значения по умолчанию.
Но у ЗначениеЗаполнено() есть ограничения: она не работает с NULL из запросов и не всегда подходит, когда нужно различать «пустая строка» и «строка из пробелов». Ниже разобраны все основные способы проверки с готовыми фрагментами кода, которые можно переносить в конфигуратор.
Универсальная проверка через ЗначениеЗаполнено()
Функция ЗначениеЗаполнено(Значение) — первый кандидат в любой ситуации. Она корректно обрабатывает примитивные типы (число, строка, дата, булево), ссылки на объекты и значение Неопределено. Пустым считается значение по умолчанию для типа: 0 для числа, пустая строка, дата '00010101', пустая ссылка соответствующего вида.
Если Не ЗначениеЗаполнено(Контрагент) Тогда
Сообщить("Не указан контрагент");
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(НомерДоговора) Тогда
// выполняем действия с заполненным номером
КонецЕсли;
Типовой сценарий — валидация перед записью документа или элемента справочника. В обработчике ПередЗаписью или ОбработкаПроверкиЗаполнения проверяйте обязательные реквизиты и вызывайте Отказ = Истина, если значение пустое. Это защищает базу от «битых» данных независимо от того, как создаётся объект — из формы, обмена или загрузки.
Если Не ЗначениеЗаполнено(Объект.Склад) Тогда
Отказ = Истина;
Сообщить("Поле Склад обязательно для заполнения");
КонецЕсли;Важный нюанс: ЗначениеЗаполнено() вернёт Ложь для числа 0. Если ноль — допустимое рабочее значение (например, количество может быть нулевым осознанно), проверяйте именно заполненность поля ввода, а не само число, либо используйте признак «указано/не указано» отдельным реквизитом.
Проверка строк: ПустаяСтрока и тонкости пробелов
Для строк есть специализированная функция ПустаяСтрока(Строка). Она возвращает Истина, если строка не содержит значащих символов — при этом пробелы и неразрывные пробелы считаются незначащими. Это удобно для проверки пользовательского ввода, где человек мог ввести несколько пробелов вместо текста.
Если ПустаяСтрока(Комментарий) Тогда
Комментарий = "Без комментария";
КонецЕсли;
Разница с ЗначениеЗаполнено() принципиальна: строка из трёх пробелов для ПустаяСтрока() — пустая, а для ЗначениеЗаполнено() — заполненная. Перед сравнением строк на равенство часто применяют СокрЛП(), чтобы отсечь пробелы по краям: Если СокрЛП(Наименование) = "" Тогда. Такая связка надёжна при обработке данных из файлов и внешних систем.
Для строк неограниченной длины и полей типа ХранилищеЗначения дополнительно проверяйте, что значение вообще инициализировано, иначе обращение может вернуть Неопределено. Комбинация Если ЗначениеЗаполнено(Поле) И Не ПустаяСтрока(Поле) Тогда покрывает оба случая.
Проверка ссылочных значений и Неопределено
Пустая ссылка — это не отсутствие объекта, а специальное значение конкретного вида ссылки. Проверить её можно двумя способами: через ЗначениеЗаполнено() или методом Пустая(): Если Документ.Пустая() Тогда. Второй вариант чуть быстрее и явно показывает намерение, но применим только к ссылкам.
Значение Неопределено возникает, когда переменной не присвоено значение, реквизит составного типа не заполнен или функция не вернула результат. Проверка — прямое сравнение: Если Результат = Неопределено Тогда. Типичная ситуация — поиск элемента через НайтиПоКоду() или НайтиПоНаименованию(): если элемент не найден, возвращается пустая ссылка, а вот Найти() в таблице значений возвращает Неопределено.
НайденнаяСтрока = ТаблицаТоваров.Найти(Артикул, "Артикул");
Если НайденнаяСтрока = Неопределено Тогда
Сообщить("Товар с артикулом " + Артикул + " не найден");
КонецЕсли;
Не путайте пустую ссылку с «битой» ссылкой на удалённый объект. Битая ссылка формально заполнена, но объект в базе отсутствует — проверяется запросом или попыткой получить объект с обработкой исключения. ЗначениеЗаполнено() такую ситуацию не выявит.
Проверка пустых значений в запросах: NULL и ЕСТЬNULL
В языке запросов 1С действуют правила, отличные от встроенного языка. Здесь существует NULL — результат левого соединения без совпадений или отсутствующего значения. ЗначениеЗаполнено() в запросе недоступна; вместо неё используются операторы ЕСТЬ NULL, ЕСТЬ НЕ NULL и функция ЕСТЬNULL().
ВЫБРАТЬ
ЕСТЬNULL(Остатки.Количество, 0) КАК Количество
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки КАК Остатки
ПО Товары.Ссылка = Остатки.Номенклатура
ГДЕ
ЕСТЬNULL(Остатки.Количество, 0) = 0
Для проверки пустой ссылки в запросе используется литерал ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Условие выглядит так: ГДЕ Документ.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Пустую дату проверяют через ЗНАЧЕНИЕ(ДатаВремя(1,1,1)) или сравнением с датой '00010101'.
Помните: сравнение NULL = NULL в запросе не даёт Истина. Всегда оборачивайте потенциально пустые поля соединений в ЕСТЬNULL() перед сравнением или арифметическими операциями, иначе результат условия будет неопределённым и строки «потеряются» из выборки.
Проверка таблиц, коллекций и реквизитов объекта
Для табличных частей и таблиц значений «пустота» означает отсутствие строк. Проверка выполняется через количество: Если Объект.Товары.Количество() = 0 Тогда. Для массивов и списков значений аналогично — Массив.Количество() = 0. Перед обходом коллекции циклом такая проверка позволяет сразу сообщить пользователю о проблеме, а не молча ничего не сделать.
Если нужно проверить, существует ли реквизит у объекта вообще (например, в универсальной обработке для разных видов документов), используйте метаданные: Объект.Метаданные().Реквизиты.Найти("Склад") — вернёт Неопределено, если реквизита нет. Только после этого обращайтесь к значению, иначе получите ошибку исполнения.
- 1Определите тип проверяемого значения: строка, число, ссылка, дата, коллекция или поле запроса
- 2Для смешанных и ссылочных типов примените ЗначениеЗаполнено()
- 3Для строк с пользовательским вводом используйте ПустаяСтрока() или СокрЛП()
- 4Для результата поиска в коллекциях проверьте на Неопределено
- 5В запросах замените NULL через ЕСТЬNULL() и проверяйте ЕСТЬ NULL
- 6Протестируйте код на пустом, заполненном и граничном (пробелы, 0) значениях
Типичные ошибки при проверке пустых значений
Самая частая ошибка — сравнение разнотипных значений. Выражение Если Дата = "" Тогда не выявит пустую дату: пустая дата — это '00010101', а не пустая строка. Аналогично сравнение ссылки с Неопределено не сработает для пустой ссылки. Всегда сверяйте проверку с фактическим типом реквизита в конфигураторе.
Вторая группа ошибок — игнорирование контекста исполнения. Код, корректный на сервере, может не работать на клиенте (например, прямые запросы к базе), а проверка в модуле формы отличается от проверки в модуле объекта. Перед записью логики уточните, где будет исполняться код, и доступны ли там нужные методы.
Как проверить, что код работает правильно
После написания проверки протестируйте её минимум на трёх наборах данных: заведомо пустое значение, заведомо заполненное и граничный случай (строка из пробелов, ноль, пустая ссылка нужного вида). Быстрый способ — внешняя обработка или консоль кода, где можно выполнить фрагмент и вывести результат через Сообщить().
Для запросов используйте консоль запросов: выполните запрос на реальных данных и убедитесь, что строки с NULL обрабатываются так, как задумано. Проверьте, что итоговые суммы не «теряют» позиции из-за необработанных NULL в условиях соединения.
Как проверить результат
Срабатывает ветка обработки пустого значения
Код проходит дальше или падает с ошибкой
ПустаяСтрока() возвращает Истина
Значение считается заполненным
ЕСТЬNULL подставляет значение по умолчанию
Строки пропадают из результата запроса
Частые вопросы
Чем ЗначениеЗаполнено отличается от ПустаяСтрока?
ЗначениеЗаполнено() работает с любым типом и считает пустым значение по умолчанию для типа, но строка из пробелов для неё заполнена. ПустаяСтрока() работает только со строками и считает пробелы незначащими символами, поэтому лучше подходит для проверки пользовательского ввода.
Как проверить пустую дату в 1С?
Сравните значение с датой '00010101': Если Дата = '00010101000000' Тогда. В запросе используйте ЗНАЧЕНИЕ(ДатаВремя(1,1,1)). Функция ЗначениеЗаполнено() также корректно определяет пустую дату.
Почему ЗначениеЗаполнено не работает с полем из запроса?
Поля левого соединения могут содержать NULL — особое значение языка запросов, которое ЗначениеЗаполнено() не обрабатывает корректно. Обработайте поле функцией ЕСТЬNULL() ещё в тексте запроса, тогда в коде придёт обычное значение.
Как проверить, что табличная часть документа пустая?
Используйте метод Количество(): Если Объект.Товары.Количество() = 0 Тогда. Эта же конструкция подходит для таблиц значений, массивов и списков значений.
Что вернёт Найти(), если элемент не найден?
Метод Найти() у таблиц значений, массивов и структур возвращает Неопределено. Проверяйте результат прямым сравнением: Если Результат = Неопределено Тогда. У справочников НайтиПоКоду() и НайтиПоНаименованию() возвращают пустую ссылку, а не Неопределено.
Можно ли проверить пустое значение без программирования?
Да. Для обязательных реквизитов достаточно включить свойство «Проверка заполнения» — «Выдавать ошибку» в палитре свойств реквизита в конфигураторе. Платформа сама будет блокировать запись с пустым значением, и писать код не потребуется.
Что важно запомнить
Выбор проверки зависит от типа: ЗначениеЗаполнено() — универсальный вариант, ПустаяСтрока() — для строк, сравнение с Неопределено — для результатов поиска, ЕСТЬNULL и ЕСТЬ NULL — для запросов. Всегда тестируйте код на пустых, заполненных и граничных значениях.