Почему массив ПроверяемыеРеквизиты пуст и как правильно настроить проверку заполнения в 1С

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

При разработке на платформе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с ситуацией, когда стандартный механизм проверки заполнения реквизитов ведет себя неочевидно. Казалось бы, в свойствах элементов формы установлено значение "Выдавать ошибку", вызван метод ПроверитьЗаполнение(), но в модуле объекта массив ПроверяемыеРеквизиты оказывается абсолютно пустым. Проанализируем, почему это происходит, и разберем архитектурные особенности платформы, которые важно понимать для решения подобных задач.

Разберем причину: Реквизиты формы vs Реквизиты объекта

Основная причина проблемы кроется в области видимости и принадлежности данных. В управляемом приложении 1С существует четкое разделение между данными объекта (справочника, документа, обработки) и данными формы. Рассмотрим ситуацию подробнее:

  1. Реквизиты объекта: Это поля, которые описаны в дереве метаданных (в конфигураторе снаружи формы). Они сохраняются в базе данных или являются частью структуры внешней обработки. Именно их "видит" модуль объекта в процедуре ОбработкаПроверкиЗаполнения.
  2. Реквизиты формы: Это временные переменные, существующие только пока открыто окно формы. Модуль объекта ничего не знает об их существовании, если они не связаны с данными объекта.

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

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

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

  1. Создание реквизитов в объекте: Перейдите в дерево метаданных вашей внешней обработки (или другого объекта) и добавьте необходимые реквизиты там.
  2. Использование основного реквизита формы: В управляемой форме всегда есть основной реквизит (обычно с именем Объект и выделенный жирным шрифтом). Этот реквизит является "проекцией" данных вашего объекта на форму.
  3. Привязка элементов управления: Разберем, как отобразить эти данные. Вместо того чтобы создавать новые реквизиты в форме, раскройте ветку Объект в списке реквизитов формы и перетащите нужные поля в левое окно (Элементы формы).
  4. Проверка свойства "ПутьКДанным": Проанализируем свойства созданных элементов. У поля ввода в свойстве ПутьКДанным должно быть указано, например, Объект.ИмяВашегоРеквизита. Это гарантирует, что данные, введенные пользователем, записываются именно в структуру объекта.

Работа с процедурой ОбработкаПроверкиЗаполнения

Теперь, когда данные связаны правильно, рассмотрим, как работает стандартный обработчик в модуле объекта. Эта процедура вызывается платформой автоматически при выполнении метода Записать() или при явном вызове ПроверитьЗаполнение() из кода формы.

Проанализируем пример кода в модуле объекта:


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

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

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

Вызов проверки из модуля формы

Посмотрим на ситуацию со стороны интерфейса. Часто требуется проверить заполнение не перед записью, а по нажатию какой-то кнопки. Рассмотрим, как это сделать правильно в модуле управляемой формы:


&НаКлиенте
Процедура ВыполнитьДействие(Команда)
    
    // Вызов стандартной проверки. 
    // Она инициирует ОбработкаПроверкиЗаполнения в модуле объекта.
    Если Не ПроверитьЗаполнение() Тогда
        Возврат; // Проверка не пройдена, прерываем выполнение
    КонецЕсли;
    
    // Если проверка пройдена, продолжаем работу
    ВыполнитьСервернуюОперацию();
    
КонецПроцедуры

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

Как подсветить поле с ошибкой программно

Для качественного пользовательского интерфейса недостаточно просто вывести текст ошибки. Нужно, чтобы система "подсветила" красным конкретное поле. Для этого в процедуре проверки (даже в модуле объекта) следует использовать объект СообщениеПользователю. Выясним, как связать сообщение с элементом формы:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле 'Период' заполнено некорректно!";
Сообщение.Поле = "Объект.Период"; // Указываем путь к данным
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

Отказ = Истина; // Сигнализируем системе, что проверка не пройдена

Использование свойства Поле и метода УстановитьДанные() позволяет платформе сопоставить ошибку с конкретным визуальным элементом на форме, даже если проверка происходит на сервере в модуле объекта.

Резюме для юного падавана

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

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

← На главную