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