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

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

Материал будет полезен как начинающим программистам , так и опытным специалистам, которые хотят систематизировать свои знания. Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3 (включая последние релизы 2026 года).

1. Стандартные функции платформы для проверки заполнения

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

  • 🔹 ЗначениеЗаполнено() — универсальная функция, работающая со всеми типами данных. Возвращает Истина, если значение не является пустым (для чисел — не ноль, для строк — не пустая строка, для ссылок — не Ссылка.ПустаяСсылка).
  • 🔹 ПустаяСтрока() — проверяет, является ли строковое значение пустым. Полезна для текстовых полей и реквизитов типа Строка.
  • 🔹 ТипЗнч() — помогает определить тип значения, что косвенно позволяет судить о его заполненности (например, ТипЗнч(Значение) = Тип("Неопределено")).
  • 🔹 ЕстьNull() — проверяет наличие NULL в запросах. Актуальна при работе с результатами запросов к базе данных.

Пример использования ЗначениеЗаполнено() для проверки реквизита документа:

Если НЕ ЗначениеЗаполнено(Документ.Контрагент) Тогда

Сообщить("Поле 'Контрагент' не заполнено!", СтатусСообщения.Важное);

ПрерватьОбработку();

КонецЕсли;

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

Если Документ.Количество = 0 Тогда

Сообщить("Количество не может быть нулевым!");

КонецЕсли;

📊 Какой метод проверки вы используете чаще?
Встроенные функции (ЗначениеЗаполнено, ПустаяСтрока)
Собственные процедуры
Проверка через события формы
Запросы к базе данных

2. Проверка заполнения в управляемых формах

Управляемые формы в 1С 8.3 предоставляют гибкие инструменты для контроля ввода данных. Здесь проверку можно реализовать как на уровне свойств элементов формы, так и программно через события. Рассмотрим оба подхода.

Самый простой способ — использовать свойство элемента формы Обязательное. Если установить его в Истина, платформа автоматически будет контролировать заполнение поля и выводить предупреждение при попытке сохранения. Однако этот метод имеет ограничения:

  • 🔸 Не работает для сложных условий (например, "поле А обязательно, если заполнено поле Б").
  • 🔸 Сообщение об ошибке стандартизировано и не всегда информативно для пользователя.
  • 🔸 Не позволяет реализовать кастомную логику проверки (например, проверку форматов данных).

Для более гибкого контроля используйте событие ПередЗаписьюНаСервере или ОбработкаПроверкиЗаполнения. Пример кода для проверки нескольких полей:

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

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

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

Сообщения.Добавить("Не указан контрагент!", СтатусСообщения.Ошибка);

КонецЕсли;

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

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

Сообщения.Добавить("Укажите дату документа!", СтатусСообщения.Ошибка);

КонецЕсли;

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

Установить свойство "Обязательное" для критичных полей|

Создать обработчик события "ПередЗаписьюНаСервере"|

Добавить проверку форматов данных (если нужно)|

Протестировать логику на пустых и корректных значениях-->

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

Процедура КонтрагентПриИзменении(Элемент)

ЭлементыФормы.Договор.Обязательное = (ЭлементыФормы.Контрагент.Значение <> Неопределено);

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

💡

Если вам нужно отобразить пользовательское сообщение об ошибке с подсказкой, используйте метод ПоказатьПредупреждение() вместо Сообщить(). Это позволит добавить кнопку "Справка" с развернутым объяснением.

3. Работа с обычными формами (8.2 и ранее)

В обычных формах (используемых в конфигурациях 1С 8.2 и более ранних версиях) подход к проверке заполнения полей отличается. Здесь нет событий ПередЗаписьюНаСервере, поэтому контроль реализуется через:

  • 📌 Событие ПередЗаписью на клиенте.
  • 📌 Свойство Модифицированность для отслеживания изменений.
  • 📌 Методы Значение() и УстановитьЗначение() для работы с данными формы.

Пример проверки в обычной форме:

Процедура ПередЗаписью(Отказ)

Если ЗначениеЗаполнено(ЭлементыФормы.Контрагент.Значение) = Ложь Тогда

Предупреждение("Заполните поле 'Контрагент'!", 60);

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

КонецЕсли;

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

Особенность обычных форм — необходимость явного обращения к элементам через коллекцию ЭлементыФормы. Также здесь нет автоматического контроля обязательности, поэтому всю логику приходится реализовывать вручную.

Для упрощения кода можно создать общую процедуру проверки, которую затем вызывать для разных полей:

Процедура ПроверитьЗаполнениеПолей(Отказ)

МассивПолей = Новый Массив;

МассивПолей.Добавить("Контрагент");

МассивПолей.Добавить("Договор");

МассивПолей.Добавить("Сумма");

Для Каждого Поле Из МассивПолей Цикл

Если ЗначениеЗаполнено(ЭлементыФормы[Поле].Значение) = Ложь Тогда

Предупреждение("Поле '" + Поле + "' не заполнено!");

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

КонецЕсли;

КонецЦикла;

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

Как проверить заполнение табличной части в обычной форме?

Для проверки строк табличной части используйте цикл по коллекции ЭлементыФормы.ТабличнаяЧасть.Список. Пример:

Для Каждого Строка Из ЭлементыФормы.Товары.Список Цикл

Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда

Предупреждение("Не указана номенклатура в строке " + Строка.НомерСтроки);

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

КонецЕсли;

КонецЦикла;

4. Проверка заполнения через запросы к базе данных

В некоторых случаях проверку заполнения полей удобно реализовывать непосредственно в запросах к базе данных. Это актуально, когда нужно:

  • 📊 Проверить заполненность полей в большом массиве данных (например, при формировании отчетов).
  • 📊 Отфильтровать записи по признаку заполненности определенных реквизитов.
  • 📊 Получить статистику по незаполненным полям (например, "сколько документов без указанного контрагента").

Для проверки на NULL в запросах используйте конструкцию ЗНАЧЕНИЕ ЕST NULL или функцию ЕстьNULL(). Примеры:

Задача Код запроса Пояснение
Найти документы без контрагента ВЫБРАТЬ Ссылка КАК Документ
ИЗ Документ.ЗаказПокупателя
ГДЕ Контрагент ЕST NULL
Используется для поиска "битых" документов
Проверить заполненность поля в выборке ВЫБРАТЬ
ЕстьNULL(Контрагент) КАК ПустойКонтрагент
ИЗ Документ.РеализацияТоваровУслуг
Возвращает Истина, если поле не заполнено
Фильтрация по заполненному полю ВЫБРАТЬ Ссылка
ИЗ Документ.ПоступлениеТоваров
ГДЕ НЕ Поставщик ЕST NULL
Исключает документы с пустым поставщиком

При работе с запросами Например, поле типа СправочникСсылка.Контрагенты может содержать:

  • 🔘 NULL — если поле никогда не заполнялось.
  • 🔘 Пустую ссылку — если поле очищалось программно (Ссылка.ПустаяСсылка).
  • 🔘 Значение по умолчанию — если в конфигураторе задано автозаполнение.

Чтобы учесть все случаи, комбинируйте проверки:

ВЫБРАТЬ

Ссылка КАК Документ

ИЗ

Документ.ЗаказПокупателя

ГДЕ

Контрагент ЕST NULL

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

💡

Запросы с проверкой на NULL выполняются медленнее, чем запросы с фильтрацией по непустым значениям. Если вам нужно получить только заполненные данные, всегда используйте конструкцию ГДЕ НЕ Поле ЕST NULL вместо последующей программной фильтрации.

5. Типичные ошибки и как их избежать

При проверке заполнения полей даже опытные разработчики допускают ошибки, которые приводят к некорректной работе системы. Рассмотрим наиболее распространенные из них и способы их предотвращения.

Ошибка 1: Использование = Неопределено вместо ЗначениеЗаполнено()

Многие разработчики пишут:

Если Документ.Контрагент = Неопределено Тогда

Вместо правильного:

Если НЕ ЗначениеЗаполнено(Документ.Контрагент) Тогда

Проблема в том, что Неопределено и пустое значение — не всегда одно и то же. Например, для числового поля 0 не равно Неопределено, но ЗначениеЗаполнено(0) вернет Истина.

Ошибка 2: Игнорирование типа данных

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

Если СокрЛП(Документ.Комментарий) = "" Тогда

Ошибка 3: Отсутствие проверки в транзакциях

Если проверка заполнения выполняется внутри транзакции, не забывайте откатывать изменения при ошибке:

НачатьТранзакцию();

Попытка

Если НЕ ЗначениеЗаполнено(Документ.Сумма) Тогда

ОтменитьТранзакцию();

Сообщить("Сумма не указана!");

Возврат;

КонецЕсли;

//.. остальной код

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить(ОписаниеОшибки());

КонецПопытки;

💡

Для отладки проверок используйте функцию ТипЗнч(), чтобы точно определить, что содержится в поле: Сообщить(ТипЗнч(Документ.Контрагент));. Это поможет отличить NULL от пустой ссылки или неопределенного значения.

Ошибка 4: Проверка только на клиенте

Если вы реализуете проверку только в клиентском коде (например, в обработчике кнопки), пользователь может обойти ее, сохраняя документ другими способами (например, через меню "Все функции"). Все критичные проверки должны дублироваться на сервере в событиях ПередЗаписьюНаСервере или ОбработкаПроверкиЗаполнения.

Ошибка 5: Избыточные проверки

Не стоит проверять заполнение полей, которые:

  • 🚫 Уже помечены как обязательные в метаданных.
  • 🚫 Имеют значения по умолчанию, гарантированно заполняемые платформой.
  • 🚫 Проверяются на уровне СУБД (например, через ограничения NOT NULL в SQL).
Как проверить заполнение поля в модуле объекта?

В модуле объекта (например, документа) для проверки его реквизитов используйте ключевое слово ЭтотОбъект:

Процедура ПередЗаписью(Отказ)

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

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

Сообщить("Укажите контрагента!");

КонецЕсли;

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

6. Автоматизация проверки с помощью событий

Для комплексного контроля заполнения полей целесообразно использовать события платформы. Это позволяет:

  • 🔧 Централизовать логику проверки в одном месте.
  • 🔧 Гибко настраивать условия обязательности.
  • 🔧 Выводить пользователю детализированные сообщения об ошибках.

Основные события для автоматизации:

Событие Когда происходит Пример использования
ОбработкаПроверкиЗаполнения При проверке заполнения формы (вызов метода ПроверитьЗаполнение()) Контроль обязательных полей перед сохранением
ПередЗаписьюНаСервере Перед записью объекта в базу данных Финальная проверка данных перед сохранением
ПриИзменении При изменении значения поля Динамическое управление обязательностью связанных полей
ПриАктивизацииСтроки При активизации строки табличной части Проверка заполнения текущей строки

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

// На клиенте - предварительная проверка

Процедура КонтрагентПриИзменении(Элемент)

ЭлементыФормы.Договор.Обязательное = (Элемент.Значение <> Неопределено);

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

// На сервере - финальная проверка

Процедура ПередЗаписьюНаСервере(Отказ, Транзакция)

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

Сообщения.Добавить("Не указан контрагент!", СтатусСообщения.Ошибка);

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

КонецЕсли;

Если Объект.СуммаДокумента <= 0 Тогда

Сообщения.Добавить("Сумма документа должна быть больше 0!", СтатусСообщения.Ошибка);

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

КонецЕсли;

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

Для упрощения поддержки кода вынесите логику проверки в отдельные функции:

Функция ПроверитьКонтрагент(Контрагент)

Возврат ЗначениеЗаполнено(Контрагент) И (Контрагент.ЭтоГруппа() = Ложь);

КонецФункции

Процедура ПередЗаписьюНаСервере(Отказ)

Если НЕ ПроверитьКонтрагент(Объект.Контрагент) Тогда

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

Сообщить("Укажите валидного контрагента (не группу)!");

КонецЕсли;

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

7. Продвинутые техники: проверка форматов и сложных условий

Иногда недостаточно просто проверить, заполнено ли поле — нужно убедиться, что оно заполнено корректно. Например:

  • 📝 Поле "Email" должно содержать символ @.
  • 📝 Поле "Телефон" должно соответствовать формату +7XXXXXX.
  • 📝 Поле "Дата" не должно быть раньше текущей даты.

Для таких случаев используйте регулярные выражения или специализированные функции проверки. Примеры:

Проверка email:

Функция ПроверитьEmail(Строка)

Возврат РегВыражение("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", "i").Искать(Строка);

КонецФункции

Если НЕ ПроверитьEmail(Объект.Email) Тогда

Сообщить("Некорректный формат email!");

КонецЕсли;

Проверка телефона:

Функция ПроверитьТелефон(Номер)

Возврат РегВыражение("^\+7\d{10}$").Искать(Номер);

КонецФункции

Проверка даты:

Если Объект.ДатаДокумента < ТекущаяДата() Тогда

Сообщить("Дата документа не может быть раньше сегодняшнего дня!");

КонецЕсли;

Для проверки сложных условий (например, "поле А обязательно, если поле Б равно X") используйте конструкции с логическими операторами:

Если (Объект.ТипДокумента = Перечисление.ТипыДокументов.Счет) И

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

Сообщить("Для счета необходимо указать срок оплаты!");

КонецЕсли;

Важно: при проверке форматов всегда предоставляйте пользователю понятное сообщение об ошибке с примером корректного заполнения. Например: "Укажите телефон в формате +7ХХХХХХХХХХ, где Х — цифра".

💡

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

8. Оптимизация производительности при массовых проверках

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

Используйте запросы вместо программных проверок

Запрос к базе данных с фильтрацией по NULL выполнится значительно быстрее, чем обход коллекции объектов в памяти:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка КАК Документ

|ИЗ

| Документ.РеализацияТоваровУслуг

|ГДЕ

| Контрагент ЕST NULL";

Результат = Запрос.Выполнить();

Пока НЕ Результат.Пустой() Цикл

Сообщить("Документ без контрагента: " + Результат.Следующий().Документ);

КонецЦикла;

Применяйте пакетную обработку

Если проверка все же реализуется программно, разбивайте данные на пакеты:

Выборка = Документы.РеализацияТоваровУслуг.Выбрать();

Пока Выборка.Следующий() Цикл

// Обрабатываем пакетом по 100 документов

Если Выборка.Счетчик() % 100 = 0 Тогда

Сообщить("Обработано " + Выборка.Счетчик() + " документов..");

КонецЕсли;

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

//.. обработка ошибки

КонецЕсли;

КонецЦикла;

Кэшируйте результаты проверок

Если одна и та же проверка выполняется многократно для одних и тех же данных, используйте кэширование:

Перем мКэшПроверок; // Объявляем на уровне модуля

Функция ПроверитьКонтрагент(Контрагент) Экспорт

Если мКэшПроверок = Неопределено Тогда

мКэшПроверок = Новый Соответствие;

КонецЕсли;

Если мКэшПроверок.Содержит(Контрагент) Тогда

Возврат мКэшПроверок[Контрагент];

КонецЕсли;

Результат = ЗначениеЗаполнено(Контрагент) И (Контрагент.ЭтоГруппа() = Ложь);

мКэшПроверок.Вставить(Контрагент, Результат);

Возврат Результат;

КонецФункции

Отключайте ненужные проверки

В некоторых сценариях (например, при загрузке данных из внешних источников) проверку заполнения можно временно отключить:

Процедура ЗагрузитьДанные()

ПроверитьЗаполнение = Ложь; // Флаг отключения проверок

Попытка

//.. код загрузки данных

Исключение

ПроверитьЗаполнение = Истина; // Восстанавливаем проверки

ВызватьИсключение;

КонецПопытки;

ПроверитьЗаполнение = Истина;

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

Контрагент = Объект.Контрагент;

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

вместо

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

Это сокращает количество обращений к данным.-->

⚠️ Внимание: Детали реализации событий и методов могут отличаться в зависимости от версии платформы 1С:Предприятие и конфигурации. Для критичных систем всегда тестируйте логику проверок на копии рабочей базы данных.

FAQ: Частые вопросы по проверке заполнения полей в 1С

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

Для проверки строк табличной части используйте цикл по коллекции строк. Пример для управляемой формы:

Для Каждого Строка Из Объект.Товары Цикл

Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда

Сообщить("Не указана номенклатура в строке " + Строка.НомерСтроки);

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

КонецЕсли;

КонецЦикла;

В обычных формах обращайтесь к ЭлементыФормы.ИмяТабличнойЧасти.Список.

Почему ЗначениеЗаполнено() возвращает Истина для пустой строки?

Функция ЗначениеЗаполнено() считает пустую строку ("") заполненным значением. Чтобы проверить строку на реальную пустоту, используйте:

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

или комбинируйте проверки:

Если НЕ ЗначениеЗаполнено(Объект.Комментарий) ИЛИ СокрЛП(Объект.Комментарий) = "" Тогда
Как сделать поле обязательным только при определенном условии?

Используйте событие ПриИзменении для динамического управления свойством Обязательное. Пример:

Процедура ТипДокументаПриИзменении(Элемент)

ЭлементыФормы.СрокОплаты.Обязательное = (Элемент.Значение = Перечисление.ТипыДокументов.Счет);

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

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

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

В отчетах и обработках проверка реализуется аналогично — через функции ЗначениеЗаполнено() или ПустаяСтрока(). Особенности:

  • В СКД (система компоновки данных) используйте выражения вида ВЫРАЗИТЬ(НЕ ПУСТАЯСТРОКА(Поле) КАК Число) для фильтрации.
  • В запросах от