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

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

Как проверить, заполнено ли поле в 1С

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

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

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

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

Функция ЗначениеЗаполнено() — основной способ

Функция ЗначениеЗаполнено() — универсальный инструмент, который работает с любым типом данных. Она возвращает Истина, если значение заполнено, и Ложь для пустых значений: пустой строки, нуля, пустой даты (01.01.0001), пустой ссылки, Неопределено и NULL.

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

// Контрагент выбран, продолжаем обработку

Иначе

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

КонецЕсли;

Функция доступна и на клиенте, и на сервере, в том числе в тонком и веб-клиенте, что делает её предпочтительной для общего кода. Она корректно определяет пустую ссылку любого ссылочного типа без явного указания типа, что упрощает универсальные обработки.

Обратите внимание: для числа 0 и булева Ложь функция вернёт Ложь, то есть сочтёт значение незаполненным. Если ноль — легитимное значение (например, нулевой остаток или ставка 0%), проверку нужно строить иначе, иначе логика будет ошибочной.

Сравнение с пустой строкой и Неопределено

Для строковых реквизитов допустимо прямое сравнение с пустой строкой. Однако здесь есть тонкость: строка из одних пробелов формально не пуста, поэтому часто применяют СокрЛП() перед сравнением.

Если СокрЛП(Объект.Комментарий) = "" Тогда

// Строка пуста или состоит из пробелов

КонецЕсли;

Проверка на Неопределено нужна, когда переменная может быть не инициализирована — например, параметр, который не передали в процедуру, или результат поиска элемента формы. Сравнение выполняется напрямую:

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

// Параметр не передан

КонецЕсли;

Значение NULL встречается в основном в результатах запросов при левых соединениях. В коде проверка на NULL сравнением работает иначе, чем в SQL: прямое сравнение Значение = NULL в запросе не сработает как ожидается — нужна конструкция ЕСТЬ NULL.

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

В языке запросов 1С свои механизмы. Для ссылочных полей используют сравнение с пустой ссылкой через ЗНАЧЕНИЕ() или параметр, а для значений, которые могут быть NULL из-за соединений, — оператор ЕСТЬ NULL в сочетании с ВЫБОР или в условии ГДЕ.

ВЫБРАТЬ

Заказы.Ссылка,

Заказы.Менеджер

ИЗ

Документ.ЗаказКлиента КАК Заказы

ГДЕ

НЕ Заказы.Менеджер ЕСТЬ NULL

И Заказы.Менеджер <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)

Для строковых полей в запросе сравнение с пустой строкой работает, но строки с пробелами снова остаются «заполненными». Если требуется отфильтровать такие записи, проще получить данные и обработать их в коде, либо использовать ПОДОБНО с шаблоном, хотя это снижает читаемость запроса.

Типичные ошибки
01
Сравнение с NULL через знак равенства в запросе — условие никогда не выполнится, записи теряются без предупреждения
02
Проверка строки без СокрЛП() — строка из пробелов проходит как заполненная и попадает в печатную форму
03
Проверка ссылки через ПустаяСтрока() или сравнение со строкой — не работает, нужна пустая ссылка конкретного типа или ЗначениеЗаполнено()
04
Использование ЗначениеЗаполнено() для числового поля, где 0 — допустимое значение

Стандартная проверка заполнения реквизитов

Для реквизитов объектов конфигурации (документов, справочников) не всегда нужен свой код. В конфигураторе у реквизита есть свойство «Проверка заполнения»: «Не проверять», «Выдавать ошибку» и «Выдавать предупреждение». Если установлено «Выдавать ошибку», платформа сама блокирует запись объекта с пустым значением и подсвечивает поле в форме.

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

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

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

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

ТекстСообщения = "Укажите документ основание для возврата";

ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "ДокументОснование", , Отказ);

КонецЕсли;

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

Также из массива ПроверяемыеРеквизиты можно удалить реквизит, если в конкретной ситуации стандартная проверка не нужна, — через ПроверяемыеРеквизиты.Удалить() с индексом найденного элемента.

Как добавить условную проверку реквизита
  1. 1
    Откройте модуль объекта документа или справочника
  2. 2
    Создайте процедуру ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
  3. 3
    Добавьте условие с ЗначениеЗаполнено() и вывод сообщения через СообщитьПользователю()
  4. 4
    Установите Отказ = Истина (в типовых — через параметр процедуры сообщения)
  5. 5
    Запишите объект с пустым полем и убедитесь, что запись блокируется, а поле подсвечивается в форме

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

На управляемой форме проверку можно выполнять в клиентских обработчиках, например в ПередЗаписью. Для ссылочных и примитивных типов снова подходит ЗначениеЗаполнено(). Если требуется только предупредить пользователя без блокировки записи, не устанавливайте Отказ, а покажите предупреждение или вопрос.

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

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если НЕ ЗначениеЗаполнено(СтрокаТовары.Номенклатура) Тогда

Сообщить("В строке " + СтрокаТовары.НомерСтроки + " не указана номенклатура");

КонецЕсли;

КонецЦикла;

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

Сравнение способов проверки

ЗначениеЗаполнено()

Универсальный вариант для кода на клиенте и сервере. Ограничение: считает пустыми 0, Ложь и пустую дату

Сравнение с пустой строкой

Подходит для строк, где 0 и Ложь не встречаются. Требует СокрЛП() для отсечения пробелов

Свойство Проверка заполнения

Декларативный вариант без кода для обязательных реквизитов. Не поддерживает условную обязательность

ОбработкаПроверкиЗаполнения

Полный контроль и условная логика. Требует написания и сопровождения кода

Как убедиться, что проверка работает

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

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

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

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

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

Запись блокируется, поле подсвечено, текст ошибки понятен

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

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

Поле заполнено пробелами
Норма

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

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

Строка из пробелов проходит как заполненная

Нулевое числовое значение
Норма

Поведение соответствует бизнес-логике (0 допустим или нет)

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

ЗначениеЗаполнено() блокирует легитимный ноль

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

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

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

Как проверить, что ссылка пустая, если неизвестен её тип?

Используйте ЗначениеЗаполнено(Ссылка) — функция сама определит пустую ссылку любого ссылочного типа. Альтернатива — сравнение Ссылка.Пустая(), но оно требует, чтобы значение точно было ссылкой.

Почему сравнение с NULL в запросе не работает?

В языке запросов 1С (как и в SQL) сравнение с NULL через равенство всегда даёт неопределённый результат. Используйте конструкции «ЕСТЬ NULL» / «НЕ ЕСТЬ NULL» в условии ГДЕ или оператор ЕСТЬNULL() для замены значения.

Как сделать реквизит обязательным только при определённом условии?

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

Работает ли ЗначениеЗаполнено() на тонком и веб-клиенте?

Да, функция доступна во всех клиентских контекстах, поэтому её можно использовать в общих модулях с признаками «Клиент» и «Сервер» без разделения кода.

Как проверить заполненность всех строк табличной части одним сообщением?

Пройдите циклом по строкам, соберите номера строк с пустыми значениями в массив или строку и выведите одно сводное сообщение после цикла, либо выводите отдельное сообщение для каждой строки с указанием её номера — второй вариант удобнее для привязки к полям формы.

Итог

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

Основной инструмент — ЗначениеЗаполнено(): он покрывает строки, ссылки, даты и Неопределено, но считает пустыми 0 и Ложь. В запросах используйте ЕСТЬ NULL и сравнение с пустой ссылкой. Для обязательных реквизитов применяйте свойство «Проверка заполнения», а условную обязательность реализуйте в ОбработкаПроверкиЗаполнения. Всегда тестируйте проверку на пробелах, нулях и программной записи.