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

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

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

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

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

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

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

Функция ЗначениеЗаполнено — основной инструмент

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

Типичный пример проверки перед записью документа:

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

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

Отказ = Истина;

Возврат;

КонецЕсли;

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

Проверка строк: ловушка пробелов и ПустаяСтрока

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

Надёжный шаблон для строковых реквизитов, которые пользователь мог заполнить «пустышкой»:

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

Сообщить("Наименование не заполнено!");

КонецЕсли;

Функция СокрЛП() убирает пробелы слева и справа (а также неразрывные пробелы в современных версиях платформы). Если нужно убрать и внутренние «лишние» символы, используйте СтрЗаменить() по конкретным символам — универсального «очистителя» в платформе нет.

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

Для ссылок на справочники и документы пустое значение — это пустая ссылка конкретного типа. Проверить её можно двумя способами: через ЗначениеЗаполнено() или через метод Пустая():

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

Сообщить("Договор не выбран!");

КонецЕсли;

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

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

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

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

Универсально для всех типов, включая Неопределено и NULL. Минус: число 0 и пустая дата считаются незаполненными.

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

Только для строк. Быстрее читается в коде, но требует СокрЛП для защиты от пробелов.

Ссылка.Пустая()

Только для ссылок. Наглядно, но падает с ошибкой на других типах.

Сравнение с ЗначениеЗаполнено в запросе

В запросах — сравнение с пустой ссылкой через ЗНАЧЕНИЕ() или проверка ЕСТЬ NULL.

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

Для строковых полей сравнение идёт с пустой строкой ГДЕ Заказы.Комментарий = "", но помните: строка из пробелов таким условием не отберётся. Для чисел — сравнение с нулём, для дат — с ДАТАВРЕМЯ(1,1,1).

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

Проверка на форме и в типовых механизмах

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

Если логика сложнее (поле обязательно только при определённом виде операции), используйте обработчик ОбработкаПроверкиЗаполнения в модуле объекта или формы:

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

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

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

Текст = "При возврате необходимо указать документ-основание";

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

КонецЕсли;

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

Обратите внимание на массив ПроверяемыеРеквизиты: если реквизит обязателен по свойствам объекта, но в конкретном сценарии не нужен, его можно удалить из массива — и наоборот, добавить программно.

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

Типичные ошибки и как их избежать

Самая частая ошибка — проверка строки без обрезки пробелов. Пользователь вводит пробел, проверка ЗначениеЗаполнено проходит, а в отчёте и печатной форме — пусто. Вторая по частоте — сравнение ссылки с Неопределено вместо пустой ссылки: условие ведёт себя непредсказуемо.

Третья группа ошибок связана с числами и датами. Число 0 и пустая дата считаются «незаполненными», хотя бизнес-логика может трактовать их как валидные. В таких случаях проверяйте не заполненность, а конкретное условие задачи.

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

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

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

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

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

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

Пустой реквизит
Норма

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

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

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

Строка из пробелов
Норма

Обрабатывается как пустая

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

Проверка пропускает такую строку

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

Строки с NULL корректно отбираются или отсекаются по ЕСТЬ NULL

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

Строки теряются без объяснения

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

Чем ЗначениеЗаполнено отличается от сравнения с пустым значением?

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

Почему проверка строки срабатывает, хотя пользователь «ничего не вводил»?

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

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

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

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

Переберите строки табличной части в цикле Для Каждого Строка Из Объект.Товары Цикл и внутри проверяйте ЗначениеЗаполнено(Строка.Номенклатура). В сообщении указывайте номер строки, чтобы пользователь мог быстро найти проблемное место.

Почему число 0 считается незаполненным?

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

Можно ли проверить заполнение реквизита в отчёте на СКД?

Да. В наборе данных запроса отберите записи условием сравнения с пустым значением или ЗНАЧЕНИЕ(...ПустаяСсылка), а в настройках СКД можно добавить отбор по полю с видом сравнения «Не заполнено» — пользователь сможет включать его самостоятельно без доработки отчёта.

Итог

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

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