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