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