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