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

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

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

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

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

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

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

Какие значения в 1С считаются пустыми

Понятие пустого значения зависит от типа данных. Для строки пустым считается значение "" (строка нулевой длины), для числа — 0, для даты — '00010101' (1 января года 1), для булева — Ложь. Для ссылочных типов (справочники, документы, перечисления) существует специальное «пустое значение» соответствующего типа — пустая ссылка, которая не указывает ни на один объект базы данных.

Отдельно стоят значения Неопределено и NULL. Неопределено означает, что переменной не присвоено значение или реквизит не инициализирован. NULL встречается в основном в результатах запросов — например, когда левое соединение не нашло связанную запись. Смешивать эти состояния с пустыми значениями конкретных типов нельзя: сравнение Неопределено с пустой строкой даст Ложь, хотя логически значение не заполнено.

Для составных типов (когда реквизит может хранить значения разных типов) пустым считается значение, приведённое к типу по умолчанию. Это частая причина неожиданного поведения проверок: реквизит выглядит заполненным в форме, но функция проверки возвращает Ложь из-за несоответствия типов.

Универсальная проверка через ЗначениеЗаполнено()

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

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

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

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

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

КонецЕсли;

Обратите внимание на логику: функция возвращает Истина при заполненном значении, поэтому для проверки «не заполнено» используется отрицание НЕ. Частая ошибка новичков — написать условие без отрицания и получить сообщение об ошибке как раз тогда, когда реквизит заполнен корректно.

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

Проверка отдельных типов: строки, ссылки, даты

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

Строки

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

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

// строка пустая или содержит только пробелы

КонецЕсли;

Если нужно проверить именно длину содержательного текста, предварительно примените СокрЛП() для удаления пробелов по краям и сравните результат с пустой строкой.

Ссылочные типы

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

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

Сообщить("Не указан склад");

КонецЕсли;

Альтернатива — сравнение с пустой ссылкой конкретного типа: Объект.Склад = Справочники.Склады.ПустаяСсылка(). Этот вариант нужен, когда переменная может содержать Неопределено: метод Пустая() у Неопределено вызовет ошибку выполнения, а сравнение отработает корректно. ЗначениеЗаполнено() в этой ситуации тоже безопаснее прямого вызова метода.

Даты

Пустая дата проверяется сравнением с '00010101' либо через ЗначениеЗаполнено(). Прямое сравнение с пустой строкой для даты — ошибка: типы не совпадают, и результат будет непредсказуемым в зависимости от контекста.

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

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

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

Если НЕ ЗначениеЗаполнено(Договор) Тогда

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

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

КонецЕсли;

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

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

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

Порядок проверки реквизитов документа
  1. 1
    Определите, какие реквизиты обязательны по логике учёта
  2. 2
    Для стандартных обязательных реквизитов включите свойство «Проверка заполнения» в конфигураторе
  3. 3
    Для условно обязательных реквизитов добавьте проверку в ОбработкаПроверкиЗаполнения через ЗначениеЗаполнено()
  4. 4
    Проверьте заполненность табличных частей через Количество() и цикл по строкам
  5. 5
    Запишите тестовый документ с пустыми реквизитами и убедитесь, что система выдаёт понятные сообщения

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

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

ВЫБРАТЬ

Продажи.Номенклатура

ИЗ

РегистрНакопления.Продажи КАК Продажи

ГДЕ

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

Особое внимание уделите левым соединениям: если связанная запись не найдена, поле придёт со значением NULL, а не с пустой ссылкой. Сравнение NULL с пустой ссылкой даст NULL (неопределённый результат), и условие не сработает. Корректный вариант — ГДЕ Таблица.Поле ЕСТЬ NULL или функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) для подмены пустоты конкретным значением.

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

Типичные ошибки при проверке заполнения

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

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

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

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

Типичные ошибки
01
Сравнение даты или ссылки с пустой строкой — проверка всегда даёт неверный результат из-за несовпадения типов
02
Вызов Пустая() у значения Неопределено — исключение и аварийное прерывание кода
03
ЗначениеЗаполнено() для числа, где ноль допустим — корректные документы не записываются
04
Проверка только в форме — программная запись и обмены обходят валидацию
05
Забытое отрицание НЕ — сообщение об ошибке появляется при заполненном реквизите

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

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

Проверяйте не только сам факт отказа в записи, но и текст сообщения: пользователь должен понимать, какое именно поле нужно заполнить. Сообщение вида «Ошибка заполнения» без указания реквизита приводит к лишним обращениям к разработчику и потере времени.

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

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

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

Пустое значение
Норма

Запись отклоняется с понятным сообщением о конкретном поле

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

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

Заполненное значение
Норма

Документ записывается без сообщений

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

Появляется ложное сообщение об ошибке — вероятно, перепутано отрицание НЕ

Ноль в числовом поле
Норма

Поведение соответствует логике учёта

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

Осознанный ноль блокируется проверкой ЗначениеЗаполнено()

Программная запись объекта
Норма

Проверка в модуле объекта срабатывает и без формы

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

Объект записывается с пустыми реквизитами в обход формы

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

Итог

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

Используйте ЗначениеЗаполнено() как универсальную проверку, ПустаяСтрока() — для строк, Пустая() — для ссылок, ЕСТЬ NULL — в запросах. Учитывайте, что 0 и Ложь считаются пустыми значениями, а критичную валидацию размещайте в модуле объекта, а не только в форме.

Частые вопросы

Чем отличается Неопределено от пустой ссылки?

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

Почему ЗначениеЗаполнено() возвращает Ложь для числа 0?

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

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

Сравните количество строк с нулём: Если Объект.Товары.Количество() = 0. Если дополнительно нужно, чтобы в каждой строке были заполнены ключевые колонки, пройдите по строкам циклом и проверьте каждую значимую колонку через ЗначениеЗаполнено().

Что лучше: автоматическая проверка заполнения или код в модуле объекта?

Если реквизит обязателен всегда, достаточно свойства «Проверка заполнения» в конфигураторе — платформа сама откажет в записи и подсветит поле. Код в ОбработкаПроверкиЗаполнения нужен, когда обязательность зависит от условий: вида операции, значений других реквизитов или статуса документа.

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

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

Достаточно ли проверки заполнения в форме документа?

Нет. Проверка в форме срабатывает только при интерактивной записи пользователем. Программная запись, обмен данными, загрузка из файлов и внешние обработки записывают объект минуя форму. Валидацию, важную для целостности данных, дублируйте или полностью размещайте в модуле объекта.