1С:Предприятие 8
Система программ

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

25.06.2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПроверяемыеРеквизиты.Очистить(); 

Вторым параметром в обработчиках этих событий является параметр Отказ.

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