Как правильно описывать проверку заполнения реквизитов в коде 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Универсальный метод: функция ЗначениеЗаполнено()

Начнем с самого эффективного и рекомендуемого способа — использования системной функции ЗначениеЗаполнено(). Проанализируем, почему этот метод считается универсальным. Функция принимает на вход значение любого типа и возвращает Истина, если значение отличается от «пустого» значения данного типа.

Разберем, что функция считает «пустым» для разных типов:

  1. Числа: Значение 0 считается незаполненным.
  2. Строки: Пустая строка (даже содержащая только пробелы, если не выполнены дополнительные условия) считается незаполненной.
  3. Даты: Пустая дата '00010101000000' (она же Дата(1, 1, 1)) считается незаполненной.
  4. Ссылки: Пустая ссылка любого справочника, документа или другого объекта метаданных считается незаполненной.
  5. Тип Неопределено и NULL: Всегда считаются незаполненными.

Рассмотрим пример простого условия:


Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда
    Сообщить("Поле 'Контрагент' не заполнено!");
КонецЕсли;

Нюансы проверки типа Булево

Важно помнить об исключении: для типа Булево функция ЗначениеЗаполнено() всегда возвращает Истина. Это происходит потому, что и Истина, и Ложь являются конкретными значениями. Выясним причину: с точки зрения платформы, если флажок не установлен (значение Ложь), это не значит, что он «не заполнен», это значит, что выбран вариант «Нет».

Если вам нужно заставить пользователя обязательно установить флажок в положение «Да», используйте прямое сравнение:


Если Объект.СогласиеПолучено = Ложь Тогда
    // Считаем, что проверка не пройдена
КонецЕсли;

Классические способы проверки по типам данных

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

Проверка ссылочных типов:

Для проверки ссылок можно использовать метод Пустая(). Проанализируем пример:


// Правильный способ проверки конкретной ссылки
Если СсылкаНаДоговор.Пустая() Тогда
    // Ссылка не заполнена
КонецЕсли;

// Альтернативный способ через сравнение
Если СсылкаНаДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
    // Ссылка не заполнена
КонецЕсли;

Проверка строковых данных:

Для строк существует встроенная функция ПустаяСтрока(), которая игнорирует незначащие пробелы. Посмотрим на пример:


Если ПустаяСтрока(Объект.Комментарий) Тогда
    // Строка пуста или состоит только из пробелов
КонецЕсли;

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

С датами часто возникают ошибки при ручном написании литералов. Разберем правильный и неправильный подходы:


// НЕПРАВИЛЬНО (может зависеть от региональных настроек в некоторых случаях)
// Если ДатаДокумента = '00010101' Тогда ...

// ПРАВИЛЬНО
Если ДатаДокумента = Дата(1, 1, 1) Тогда
    // Дата не заполнена
КонецЕсли;

Системный механизм «Проверка заполнения»

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

  1. Откройте палитру свойств нужного реквизита в конфигураторе.
  2. Найдите свойство «Проверка заполнения».
  3. Установите значение «Выдавать ошибку».

Теперь при попытке записи объекта платформа сама проверит это поле, подсветит его красным и выведет стандартное сообщение. Однако, если логика проверки сложная (например, поле «Склад» обязательно только для операции «Продажа»), нам на помощь приходит программный обработчик.

Использование события ОбработкаПроверкиЗаполнения

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


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Если документ закрыт для редактирования, проверку не проводим
    Если Статус = Перечисления.Статусы.Закрыт Тогда
        ПроверяемыеРеквизиты.Очистить();
        Возврат;
    КонецЕсли;
    
    // Добавим проверку реквизита "ПричинаОтмены", если флаг "Отменен" установлен
    Если Отменен Тогда
        ПроверяемыеРеквизиты.Добавить("ПричинаОтмены");
    Иначе
        // Если не отменен, убираем из списка проверки, даже если в метаданных стоит "Выдавать ошибку"
        ПорядковыйНомер = ПроверяемыеРеквизиты.Найти("ПричинаОтмены");
        Если ПорядковыйНомер <> Неопределено Тогда
            ПроверяемыеРеквизиты.Удалить(ПорядковыйНомер);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Групповая проверка реквизитов по списку

Иногда удобно вынести проверку группы полей в отдельную процедуру, особенно если мы работаем в обычных формах или создаем внешнюю обработку. Проанализируем пример кода, который обходит структуру обязательных полей и проверяет их наличие в объекте:


Процедура ПроверитьЗаполнениеШапкиДокумента(ДокументОбъект, СтруктураОбязательныхПолей, Отказ) Экспорт
    
    МетаданныеРеквизиты = ДокументОбъект.Метаданные().Реквизиты;
    
    Для каждого КлючЗначение Из СтруктураОбязательныхПолей Цикл
        ИмяРеквизита = КлючЗначение.Ключ;
        Значение = ДокументОбъект[ИмяРеквизита];
        
        Если НЕ ЗначениеЗаполнено(Значение) Тогда
            ПредставлениеРеквизита = МетаданныеРеквизиты[ИмяРеквизита].Представление;
            Сообщить("Не заполнено значение реквизита: " + ПредставлениеРеквизита);
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

В этом примере мы используем обращение к реквизиту по имени (через квадратные скобки) и универсальную функцию ЗначениеЗаполнено(). Это позволяет сделать код гибким и легко расширяемым.

Рекомендации по использованию БСП

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

Подведем итог: для большинства задач в коде 1С 8.3 идеальным выбором будет функция ЗначениеЗаполнено(). В сочетании с системным событием ОбработкаПроверкиЗаполнения она закрывает 99% потребностей разработчика в контроле данных.

← На главную