Работа с данными в 1С:Предприятие часто требует контроля заполнения полей — будь то реквизиты справочников, документов или формы ввода. Ошибки из-за пустых значений могут привести к сбоям в отчетах, некорректной работе алгоритмов или даже потере данных. В этой статье мы разберем все доступные методы проверки заполненности полей: от стандартных инструментов платформы до написания собственного кода на встроенном языке.
Особое внимание уделим нюансам, которые возникают при работе с разными типами данных (строками, числами, ссылками), а также типичным ошибкам, которые допускают разработчики. Вы узнаете, как проверять поля не только в управляемых формах, но и в обычных формах устаревших конфигураций, а также как автоматизировать контроль заполнения с помощью событий.
Материал будет полезен как начинающим программистам 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(). Примеры:
| Задача | Код запроса | Пояснение |
|---|---|---|
| Найти документы без контрагента | ВЫБРАТЬ Ссылка КАК Документ |
Используется для поиска "битых" документов |
| Проверить заполненность поля в выборке | ВЫБРАТЬ |
Возвращает Истина, если поле не заполнено |
| Фильтрация по заполненному полю | ВЫБРАТЬ Ссылка |
Исключает документы с пустым поставщиком |
При работе с запросами Например, поле типа СправочникСсылка.Контрагенты может содержать:
- 🔘
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С
Как проверить заполнение поля в табличной части документа?
Для проверки строк табличной части используйте цикл по коллекции строк. Пример для управляемой формы:
Для Каждого Строка Из Объект.Товары Цикл
Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Сообщить("Не указана номенклатура в строке " + Строка.НомерСтроки);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
В обычных формах обращайтесь к ЭлементыФормы.ИмяТабличнойЧасти.Список.
Почему ЗначениеЗаполнено() возвращает Истина для пустой строки?
Функция ЗначениеЗаполнено() считает пустую строку ("") заполненным значением. Чтобы проверить строку на реальную пустоту, используйте:
Если СокрЛП(Объект.Комментарий) = "" Тогда
или комбинируйте проверки:
Если НЕ ЗначениеЗаполнено(Объект.Комментарий) ИЛИ СокрЛП(Объект.Комментарий) = "" Тогда
Как сделать поле обязательным только при определенном условии?
Используйте событие ПриИзменении для динамического управления свойством Обязательное. Пример:
Процедура ТипДокументаПриИзменении(Элемент)
ЭлементыФормы.СрокОплаты.Обязательное = (Элемент.Значение = Перечисление.ТипыДокументов.Счет);
КонецПроцедуры
Не забудьте дублировать эту логику в серверных процедурах проверки (например, в ПередЗаписьюНаСервере).
Как проверить заполнение поля в отчете или обработке?
В отчетах и обработках проверка реализуется аналогично — через функции ЗначениеЗаполнено() или ПустаяСтрока(). Особенности:
- В СКД (система компоновки данных) используйте выражения вида
ВЫРАЗИТЬ(НЕ ПУСТАЯСТРОКА(Поле) КАК Число)для фильтрации. - В запросах от