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

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

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

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

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

Главная сложность в том, что «пустое» значение в 1С — не одно состояние, а целое семейство: пустая строка, пустая ссылка конкретного типа, Неопределено, NULL в запросе, ноль для чисел и пустая дата. Универсальное сравнение с пустой строкой работает не всегда, поэтому нужно выбирать способ проверки под тип реквизита и контекст выполнения — серверный код, запрос или управляемая форма.

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

Функция ЗначениеЗаполнено — универсальный способ

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

Функция корректно обрабатывает все основные типы: для строки пустым считается "", для числа — 0, для даты — '00010101', для булево — Ложь, для ссылок — пустая ссылка соответствующего типа, для Неопределено и NULL — сами эти значения. Это избавляет от необходимости писать отдельную логику под каждый тип.

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

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

КонецЕсли;

Важный нюанс: для числового реквизита значение 0 считается незаполненным. Если ноль — легитимное рабочее значение (например, нулевая ставка или нулевой остаток), ЗначениеЗаполнено даст ложное срабатывание контроля. В таких случаях логику проверки нужно строить иначе — например, через отдельный признак заполненности или проверку на Неопределено до присвоения.

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

Для реквизитов ссылочного типа (справочники, документы, перечисления) есть второй способ — явное сравнение с пустой ссылкой конкретного типа. Он удобен, когда нужно подчеркнуть тип проверки или когда реквизит составного типа и требуется проверить не только заполненность, но и вид значения.

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

// реквизит не заполнен

КонецЕсли;

Если Объект.СтавкаНДС = Перечисления.СтавкиНДС.ПустаяСсылка() Тогда

// перечисление не выбрано

КонецЕсли;

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

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

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

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

ИЛИ Реализация.Комментарий = ""

ИЛИ Реализация.СуммаДокумента = 0

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

ГДЕ

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) = 0

Проверка на управляемой форме

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

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

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

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

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

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

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

"Укажите документ-основание возврата", ,

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

КонецЕсли;

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

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

Проверка табличной части и строки таблицы

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

Если Объект.Товары.Количество() = 0 Тогда

Сообщить("Не заполнена табличная часть ""Товары""");

КонецЕсли;

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

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

Неопределено, NULL и составные типы

Значение Неопределено встречается, когда переменной не присвоено значение, функция не вернула результат или реквизит составного типа очищен. Проверка выполняется прямым сравнением: Если Значение = Неопределено Тогда. Функция ЗначениеЗаполнено также вернёт Ложь для Неопределено, поэтому в большинстве случаев отдельная проверка не нужна.

NULL приходит только из запросов — при левом соединении без совпадений или при обращении к реквизиту через разыменование, где ссылка битая. В коде после выборки из запроса NULL проверяется сравнением Если Поле = NULL Тогда или функцией ЗначениеЗаполнено, которая для NULL тоже возвращает Ложь.

Для реквизитов составного типа (например, «Документ.Основание» с несколькими видами документов) ЗначениеЗаполнено работает корректно, а вот сравнение с пустой ссылкой одного конкретного типа — нет. Если нужно проверить и заполненность, и вид значения, сначала проверяют тип через ТипЗнч(Значение), затем заполненность.

Маршрут решения

Какой способ проверки выбрать

Проверка в модуле объекта или общем модуле, тип любойИспользуйте ЗначениеЗаполнено(Реквизит)
Нужно подчеркнуть конкретный тип ссылкиСравните с ПустаяСсылка() соответствующего менеджера
Проверка в тексте запросаСравнение с ЗНАЧЕНИЕ(...ПустаяСсылка), "" или 0; для соединений — ЕСТЬ NULL
Реквизит обязателен всегдаВключите свойство «Проверка заполнения» в конфигураторе вместо кода
Числовой реквизит, где 0 — допустимое значениеНе используйте ЗначениеЗаполнено; проверяйте Неопределено или отдельный признак

Частые ошибки и как их распознать

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

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

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

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

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

Запись объекта с пустым реквизитом
Норма

Появляется сообщение, запись блокируется, поле подсвечено

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

Объект записывается без предупреждений — проверка не срабатывает

Запись с заполненным реквизитом
Норма

Запись проходит без лишних сообщений

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

Контроль срабатывает на заполненном значении — неверное условие

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

Поведение соответствует задуманному (0 принят или отклонён осознанно)

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

0 отклоняется, хотя является рабочим значением

FAQ

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

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

Почему проверка «Реквизит = ""» не работает для справочника?

Пустая ссылка справочника — это не пустая строка, а специальное значение ссылочного типа. Сравнение разнотипных значений возвращает Ложь, поэтому условие никогда не выполняется. Используйте ЗначениеЗаполнено или сравнение с Справочники.Имя.ПустаяСсылка().

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

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

ЗначениеЗаполнено возвращает Ложь для нуля — как проверить числовой реквизит?

Если ноль — допустимое значение, проверяйте не заполненность, а факт ввода: например, храните в реквизите Неопределено до заполнения (составной тип) или добавьте отдельный булев признак. Либо осознанно примите, что 0 трактуется как «не заполнено».

Можно ли проверить заполненность без программирования?

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

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

Через количество строк: Если Объект.Товары.Количество() = 0. У табличной части нет «пустого значения», поэтому ЗначениеЗаполнено для неё не применяется. Для результата запроса аналогичная роль у метода Результат.Пустой().

Итог

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

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