В процессе разработки на платформе «1С:Предприятие 8.3» одной из наиболее часто встречающихся задач является контроль корректности введенных данных. Нам необходимо гарантировать, что пользователь заполнил все обязательные поля перед тем, как документ будет проведен или элемент справочника будет записан. В этой статье мы подробно рассмотрим все существующие способы проверки заполнения для различных типов данных: от классических методов до современных системных механизмов.
Начнем с самого эффективного и рекомендуемого способа — использования системной функции ЗначениеЗаполнено(). Проанализируем, почему этот метод считается универсальным. Функция принимает на вход значение любого типа и возвращает Истина, если значение отличается от «пустого» значения данного типа.
Разберем, что функция считает «пустым» для разных типов:
0 считается незаполненным.'00010101000000' (она же Дата(1, 1, 1)) считается незаполненной.Рассмотрим пример простого условия:
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда
Сообщить("Поле 'Контрагент' не заполнено!");
КонецЕсли;
Важно помнить об исключении: для типа Булево функция ЗначениеЗаполнено() всегда возвращает Истина. Это происходит потому, что и Истина, и Ложь являются конкретными значениями. Выясним причину: с точки зрения платформы, если флажок не установлен (значение Ложь), это не значит, что он «не заполнен», это значит, что выбран вариант «Нет».
Если вам нужно заставить пользователя обязательно установить флажок в положение «Да», используйте прямое сравнение:
Если Объект.СогласиеПолучено = Ложь Тогда
// Считаем, что проверка не пройдена
КонецЕсли;
Иногда в старом коде или специфических алгоритмах нам может встретиться явная проверка типов. Рассмотрим, как это реализовать без использования универсальной функции, чтобы понимать логику работы платформы.
Проверка ссылочных типов:
Для проверки ссылок можно использовать метод Пустая(). Проанализируем пример:
// Правильный способ проверки конкретной ссылки
Если СсылкаНаДоговор.Пустая() Тогда
// Ссылка не заполнена
КонецЕсли;
// Альтернативный способ через сравнение
Если СсылкаНаДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка() Тогда
// Ссылка не заполнена
КонецЕсли;
Проверка строковых данных:
Для строк существует встроенная функция ПустаяСтрока(), которая игнорирует незначащие пробелы. Посмотрим на пример:
Если ПустаяСтрока(Объект.Комментарий) Тогда
// Строка пуста или состоит только из пробелов
КонецЕсли;
Проверка даты:
С датами часто возникают ошибки при ручном написании литералов. Разберем правильный и неправильный подходы:
// НЕПРАВИЛЬНО (может зависеть от региональных настроек в некоторых случаях)
// Если ДатаДокумента = '00010101' Тогда ...
// ПРАВИЛЬНО
Если ДатаДокумента = Дата(1, 1, 1) Тогда
// Дата не заполнена
КонецЕсли;
В современных конфигурациях на управляемых формах нам не всегда нужно писать код вручную. Платформа предоставляет автоматизированный механизм. Разберем пошагово, как им пользоваться:
Теперь при попытке записи объекта платформа сама проверит это поле, подсветит его красным и выведет стандартное сообщение. Однако, если логика проверки сложная (например, поле «Склад» обязательно только для операции «Продажа»), нам на помощь приходит программный обработчик.
Этот обработчик располагается в модуле объекта (справочника или документа). Он позволяет нам динамически управлять списком проверяемых полей. Рассмотрим ситуацию, когда нам нужно добавить или исключить проверку в зависимости от условий:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Если документ закрыт для редактирования, проверку не проводим
Если Статус = Перечисления.Статусы.Закрыт Тогда
ПроверяемыеРеквизиты.Очистить();
Возврат;
КонецЕсли;
// Добавим проверку реквизита "ПричинаОтмены", если флаг "Отменен" установлен
Если Отменен Тогда
ПроверяемыеРеквизиты.Добавить("ПричинаОтмены");
Иначе
// Если не отменен, убираем из списка проверки, даже если в метаданных стоит "Выдавать ошибку"
ПорядковыйНомер = ПроверяемыеРеквизиты.Найти("ПричинаОтмены");
Если ПорядковыйНомер <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(ПорядковыйНомер);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Иногда удобно вынести проверку группы полей в отдельную процедуру, особенно если мы работаем в обычных формах или создаем внешнюю обработку. Проанализируем пример кода, который обходит структуру обязательных полей и проверяет их наличие в объекте:
Процедура ПроверитьЗаполнениеШапкиДокумента(ДокументОбъект, СтруктураОбязательныхПолей, Отказ) Экспорт
МетаданныеРеквизиты = ДокументОбъект.Метаданные().Реквизиты;
Для каждого КлючЗначение Из СтруктураОбязательныхПолей Цикл
ИмяРеквизита = КлючЗначение.Ключ;
Значение = ДокументОбъект[ИмяРеквизита];
Если НЕ ЗначениеЗаполнено(Значение) Тогда
ПредставлениеРеквизита = МетаданныеРеквизиты[ИмяРеквизита].Представление;
Сообщить("Не заполнено значение реквизита: " + ПредставлениеРеквизита);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В этом примере мы используем обращение к реквизиту по имени (через квадратные скобки) и универсальную функцию ЗначениеЗаполнено(). Это позволяет сделать код гибким и легко расширяемым.
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), мы рекомендуем использовать встроенные методы для вывода сообщений об ошибках. Вместо обычного Сообщить() лучше использовать ОбщегоНазначенияКлиентСервер.СообщитьОшибкуПользователю(). Это позволит не просто вывести текст, но и привязать ошибку к конкретному полю на форме, что значительно повышает удобство работы пользователя (UX).
Подведем итог: для большинства задач в коде 1С 8.3 идеальным выбором будет функция ЗначениеЗаполнено(). В сочетании с системным событием ОбработкаПроверкиЗаполнения она закрывает 99% потребностей разработчика в контроле данных.