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