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