13.10.2010

Где разместить собственный алгоритм, проверяющий заполнены реквизиты формы или нет?

Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта (см. Как перед записью накладной проверить, что реквизит Поставщик заполнен?). Такая проверка выполняется при интерактивном вводе объекта, перед его записью.

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

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

Для этого у него есть два события. Одно событие – Обработка проверки заполнения на сервере – можно обработать в модуле формы. Другое событие – Обработка проверки заполнения – можно обработать в модуле прикладного объекта.

У формы, как правило, есть основной реквизит (редактируемый объект) и могут быть реквизиты, не относящиеся к редактируемому объекту, а являющиеся лишь частью формы:

Поэтому серверное событие формы Обработка проверки заполнения на сервере предназначено для проверки заполнения тех реквизитов формы, которые не относятся к редактируемому объекту. Это данные только формы, у формы могут быть свои причины и алгоритмы для проверки этих данных.

Напротив, событие объекта Обработка проверки заполнения предназначено для для того, чтобы проверить реквизиты основного реквизита формы.

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

Поэтому существует несколько сценариев того, как разработчик может встроить свой алгоритм в механизм проверки заполнения:

  1. Самостоятельно проверить заполненность всех реквизитов и очистить массив ПроверяемыеРеквизиты, чтобы платформа не выполняла их проверку.
  2. Проверить часть реквизитов самостоятельно, удалить их из массива ПроверяемыеРеквизиты, а оставшиеся оставить на проверку платформе.
  3. Добавить в массив ПроверяемыеРеквизиты какие-то реквизиты, чтобы платформа проверила и их тоже.
  4. Вообще отказаться от проверки заполненности реквизитов, очистив массив.

Все эти сценарии реализуются довольно просто.

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

Копировать в буфер обмена
Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда

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

КонецЕсли;
                
// Проверка остальных реквизитов
// ...
                
// Очистить массив проверяемых реквизитов, чтобы платформа
// не выполняла их автоматическую проверку.
ПроверяемыеРеквизиты.Очистить();

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

Копировать в буфер обмена

Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда
                
     Сообщение = Новый СообщениеПользователю;
     Сообщение.Текст = "Необходимо заполнить поставщика!";
     Сообщение.Поле = "Поставщик";
     Сообщение.УстановитьДанные(ЭтотОбъект);
     Сообщение.Сообщить();
                
     Отказ = Истина;
                
     // Удалить поставщика из массива проверяемых реквизитов.
     ИндексПоляПоставщик = ПроверяемыеРеквизиты.Найти("Поставщик");
                
     Если ИндексПоляПоставщик <> Неопределено Тогда

          ПроверяемыеРеквизиты.Удалить(ИндексПоляПоставщик);

     КонецЕсли;
                
КонецЕсли;

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

Копировать в буфер обмена
ПроверяемыеРеквизиты.Добавить("Комментарий");

А очистить массив проверяемых реквизитов, чтобы ничего не проверять ни самому, ни платформе, можно так:

Копировать в буфер обмена
ПроверяемыеРеквизиты.Очистить();

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