К статье
Практический материал

Разработка и Конфигурация · 13 мин

1С: значение не заполнено — как проверить правильно

Как проверить, заполнено ли значение в 1С: функция ЗначениеЗаполнено(), проверка пустых ссылок, строк, дат и чисел, ПустоеЗначение в запросах и типичные ошибки.

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

В языке 1С нет универсального значения NULL для всех типов данных — у каждого типа своё «пустое» состояние. Поэтому проверка заполненности зависит от того, что именно проверяется: ссылка на объект базы, примитивный тип, результат запроса или реквизит формы. Универсальным инструментом служит функция ЗначениеЗаполнено(), но у неё есть ограничения и тонкости, которые важно понимать.

Ниже разобраны основные способы проверки: встроенная функция, прямые сравнения для конкретных типов, проверки в запросах, работа с NULL из соединений таблиц и типичные ошибки, которые приводят к ложным срабатываниям.

Функция ЗначениеЗаполнено(): как работает и когда применять

Встроенная функция ЗначениеЗаполнено(Значение) возвращает булево значение: Истина, если значение заполнено, и Ложь, если оно пустое. Она универсальна и подходит для большинства типов данных: ссылок, строк, чисел, дат, булевых значений.

Пример типичного использования в модуле объекта или формы:

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

Сообщить("Не заполнен контрагент!");

Возврат;

КонецЕсли;

Функция считает незаполненными: пустые ссылки любых объектных типов, пустые строки (в том числе строки из одних пробелов — они приводятся к пустым), число 0, дату '00010101', Неопределено и NULL. Именно универсальность делает её основным инструментом проверки реквизитов перед записью документа или выполнением обработки.

Однако есть нюанс: для числа 0 функция вернёт Ложь, хотя ноль может быть вполне осмысленным значением — например, нулевое количество или нулевая ставка. В таких случаях универсальную проверку применять нельзя, нужно анализировать контекст или использовать Неопределено как признак отсутствия значения.

Проверка пустых ссылок на справочники и документы

Для ссылочных типов (справочники, документы, перечисления, планы счетов) существует специализированный метод Пустая(), который работает быстрее универсальной функции и однозначно показывает, что ссылка не установлена:

Если Номенклатура.Пустая() Тогда

// Ссылка не выбрана

КонецЕсли;

Альтернативный способ — сравнение с пустой ссылкой конкретного типа через менеджер объекта:

Если Склад = Справочники.Склады.ПустаяСсылка() Тогда

// Склад не указан

КонецЕсли;

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

Частая ситуация — реквизит составного типа, который может хранить ссылки разных видов. Здесь ЗначениеЗаполнено() надёжнее, чем сравнение с пустой ссылкой одного конкретного справочника: сравнение с «чужой» пустой ссылкой даст Ложь даже для незаполненного значения другого типа, и проверка пройдёт мимо.

Проверка строк, чисел и дат

Примитивные типы проверяются прямым сравнением, и часто это нагляднее, чем универсальная функция:

  • Строка: Если ПустаяСтрока(Наименование) Тогда — специальная функция ПустаяСтрока() корректно обрабатывает и строки из пробелов, и неразрывные пробелы;
  • Число: Если Количество = 0 Тогда — с учётом того, что ноль может быть легальным значением;
  • Дата: Если ДатаОплаты = '00010101' Тогда или Если НЕ ЗначениеЗаполнено(ДатаОплаты) Тогда;
  • Булево: Ложь считается незаполненным только функцией ЗначениеЗаполнено() — прямое сравнение здесь корректнее, если Ложь осмысленно.

Для строк важно помнить о пробелах: пользователь мог ввести несколько пробелов вместо значения, и визуально поле выглядит пустым, но строка технически содержит символы. Функция ПустаяСтрока() решает эту проблему, а СокрЛП() помогает очистить значение перед сохранением.

Для дат пустое значение — это начало календаря '00010101' (или '00010101000000' для даты со временем). Сравнение с этой константой — самый читаемый способ проверки, особенно когда значение приходит из внешних источников, где дата могла быть передана как строка.

СсылкаПустая ссылка объекта

Проверка: Ссылка.Пустая() или ЗначениеЗаполнено()

Строка"" или только пробелы

Проверка: ПустаяСтрока(Строка)

Число0

Проверка: сравнение с 0, ЗначениеЗаполнено() вернёт Ложь

Дата'00010101'

Проверка: сравнение с константой или ЗначениеЗаполнено()

ПрочееНеопределено, NULL

Проверка: сравнение с Неопределено, в запросах — ЕСТЬ NULL

Проверка заполненности в запросах

В языке запросов 1С функция ЗначениеЗаполнено() недоступна — там действуют свои механизмы. Для ссылок используется сравнение с пустой ссылкой через функцию ЗНАЧЕНИЕ():

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)

Для дат в запросе сравнение выполняется с литералом ДАТАВРЕМЯ(1,1,1), для строк — с пустой строкой, для чисел — с нулём. Условия комбинируются стандартными операторами И / ИЛИ.

NULL в результатах соединений

Отдельный случай — левые соединения таблиц. Если для записи основной таблицы не нашлось пары в присоединяемой, все её поля будут содержать NULL, а не пустые значения соответствующих типов. Сравнение такого поля с пустой ссылкой даст Ложь, что приводит к ошибкам логики.

Правильная проверка — оператор ЕСТЬ NULL:

ГДЕ

Остатки.КоличествоОстаток ЕСТЬ NULL

Для подстановки значения по умолчанию вместо NULL применяется функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию). В коде после выгрузки результата запроса NULL проверяется оператором Если Значение = NULL Тогда — либо той же ЗначениеЗаполнено(), которая NULL тоже считает незаполненным.

Типичные ошибки
01
Сравнение NULL из левого соединения с пустой ссылкой — условие никогда не сработает, нужен оператор ЕСТЬ NULL
02
Проверка числа через ЗначениеЗаполнено, когда 0 — допустимое значение: легальные нули отбрасываются как ошибка
03
Проверка строки сравнением с "" без учёта пробелов — строка из пробелов проходит как заполненная
04
Сравнение составного реквизита с пустой ссылкой одного типа — незаполненное значение другого типа не определяется

Неопределено и значения по умолчанию

Значение Неопределено — особое состояние переменной, которой не присвоено ничего. Оно встречается в параметрах процедур, в реквизитах составного типа, в результатах функций, которые могут «не вернуть» значение. Проверяется прямым сравнением:

Если ПараметрОтбора = Неопределено Тогда

ПараметрОтбора = Новый Структура;

КонецЕсли;

Типовой приём — объявление необязательных параметров процедур и функций со значением по умолчанию Неопределено с последующей проверкой в теле. Это позволяет вызывать метод с разным набором аргументов и не ломать существующие вызовы при расширении функциональности.

При работе со структурами полезен метод Свойство("ИмяКлюча", Значение): если ключ отсутствует, переменная останется равной Неопределено, и это можно проверить до обращения. Прямое обращение к несуществующему свойству структуры вызовет исключение, поэтому проверка обязательна.

bsl
Если НЕ ЗначениеЗаполнено(Объект.Договор) Тогда
    ТекстСообщения = НСтр("ru = 'Поле ""Договор"" не заполнено'");
    ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.Договор");
    Отказ = Истина;
КонецЕсли;

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

На практике чаще всего проверка заполненности нужна в обработчике ОбработкаПроверкиЗаполнения — при записи документа или элемента справочника. Для стандартных реквизитов с признаком «Проверка заполнения: Выдавать ошибку» платформа выполняет контроль автоматически, и дублировать его в коде не нужно.

Собственные проверки добавляют, когда логика сложнее: реквизит обязателен только при определённом виде операции, либо нужно проверить заполненность табличной части, либо контролируется сочетание нескольких полей:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если ВидОперации = Перечисления.ВидыОпераций.Возврат

И НЕ ЗначениеЗаполнено(ДокументОснование) Тогда

ОбщегоНазначения.СообщитьПользователю(

"Не указан документ-основание", , "ДокументОснование", "Объект", Отказ);

КонецЕсли;

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

Массив ПроверяемыеРеквизиты позволяет и исключать стандартные проверки: методом Удалить() убирают реквизит, который в данном сценарии не обязателен. Это корректнее, чем снимать признак проверки в конфигураторе глобально.

Как добавить проверку заполненности реквизита
  1. 1
    Определите, подходит ли стандартная проверка: установите у реквизита «Проверка заполнения — Выдавать ошибку» в конфигураторе
  2. 2
    Если логика условная — добавьте проверку в ОбработкаПроверкиЗаполнения через ЗначениеЗаполнено()
  3. 3
    Выведите сообщение через ОбщегоНазначения.СообщитьПользователю с привязкой к полю и установите Отказ = Истина
  4. 4
    Протестируйте: запись с пустым полем должна блокироваться, с заполненным — проходить
  5. 5
    Проверьте граничные случаи: пробелы в строке, ноль в числе, NULL из запроса

Частые ошибки и ограничения

Главная ловушка — смешение понятий «пустое значение», NULL и Неопределено. Это три разных состояния: пустая ссылка существует в базе как значение определённого типа, NULL приходит только из запросов и означает отсутствие данных, Неопределено — отсутствие присвоенного значения у переменной. Проверки для них разные, и взаимозаменяемы они только частично через ЗначениеЗаполнено().

Вторая ошибка — проверка заполненности после обращения к свойству. Если переменная содержит Неопределено, то вызов Переменная.Пустая() вызовет исключение: у Неопределено нет методов. Сначала проверяют на Неопределено, потом обращаются к методам.

Третья группа ошибок — производительность. Вызов ЗначениеЗаполнено() внутри цикла по тысячам строк работает медленнее, чем прямые сравнения. В массовых обработках, где тип значения известен заранее, лучше использовать специализированные проверки: Пустая() для ссылок, ПустаяСтрока() для строк.

Проверка результата и контрольные точки

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

Для запросов проверку выполняют в консоли запросов: выборка с условием на пустую ссылку должна вернуть именно те документы, где поле не заполнено. Если запрос с соединением возвращает неожиданные строки, проверьте, не сравнивается ли NULL с пустым значением вместо ЕСТЬ NULL.

Контрольные точки

Как проверить результат

Запись с пустым обязательным полем
Норма

Запись заблокирована, сообщение указывает на конкретное поле

Тревожный признак

Объект записывается без значения или падает с критической ошибкой

Запрос с левым соединением
Норма

Пустые строки отфильтрованы через ЕСТЬ NULL

Тревожный признак

Сравнение с пустой ссылкой не отбирает строки с NULL

Числовой реквизит со значением 0
Норма

Ноль обрабатывается согласно логике учёта

Тревожный признак

ЗначениеЗаполнено отбраковывает легальный ноль

Итог

Что важно запомнить

Универсальный инструмент — ЗначениеЗаполнено(), но для ссылок быстрее метод Пустая(), для строк — ПустаяСтрока(), а в запросах используются ЗНАЧЕНИЕ(...ПустаяСсылка) и ЕСТЬ NULL. Помните о трёх разных «пустых» состояниях (пустое значение, NULL, Неопределено) и о том, что ноль функция считает незаполненным.

Часто задаваемые вопросы

Чем ЗначениеЗаполнено() отличается от метода Пустая()?

ЗначениеЗаполнено() — универсальная функция для любых типов, включая строки, числа и даты. Метод Пустая() существует только у ссылочных типов и работает быстрее, но применим лишь к ссылкам. Если тип значения известен и это ссылка, предпочтительнее Пустая().

Почему сравнение поля запроса с пустой ссылкой не находит пустые строки после левого соединения?

Потому что при отсутствии связанной записи поле содержит NULL, а NULL не равен никакому значению, включая пустую ссылку. Используйте условие «Поле ЕСТЬ NULL» или функцию ЕСТЬNULL() с подстановкой пустой ссылки.

ЗначениеЗаполнено(0) возвращает Ложь — как проверить число, если ноль допустим?

Не используйте ЗначениеЗаполнено для таких чисел. Проверяйте на Неопределено, если значение может быть не присвоено, либо храните признак заполненности отдельно. Ноль — осмысленное значение, и отличить его от «не введено» можно только по контексту.

Как проверить, что строка не состоит только из пробелов?

Функцией ПустаяСтрока(Строка) — она возвращает Истина для пустой строки и для строки из пробельных символов. Альтернатива — сравнение СокрЛП(Строка) = "", но ПустаяСтрока читается лучше и работает быстрее.

Можно ли использовать ЗначениеЗаполнено() в языке запросов?

Нет, в запросах эта функция недоступна. Используйте сравнения: с ЗНАЧЕНИЕ(Тип.ПустаяСсылка) для ссылок, с ДАТАВРЕМЯ(1,1,1) для дат, с пустой строкой и нулём для примитивов, а также ЕСТЬ NULL для результатов соединений.

Что вернёт ЗначениеЗаполнено() для Неопределено и NULL?

В обоих случаях — Ложь: функция считает эти состояния незаполненными. Это удобно для универсальных проверок, но если нужно различать NULL и Неопределено между собой, используйте прямые сравнения.