Собственная проверка заполненонсти обязательных реквизитов справочников.

13 10

В системе имеется проверка на заполненность обязательных реквизитов справочника при сохранении. Но есть одно "но". Проверка осуществляется по элементно! Т.е. нажимаете Сохранить и система Вам говорит, что незаполнено определенный реквизит. Вы его заполняете, снова жмете Сохранить, и опять получаете сообщение о том, что Вы забыли заполнить еще один реквизит.

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

Стандартная проверка происходит еще до события "Сохранение Возможнось", т.е. любые наши проверки реквизитов пойдут уже после нее. Казалось бы, ничего с этим не поделать - системная логика и все тут. Как оказалось - только лишь казалось.

1. Отключим системную проверку заполненности реквизитов. В событии "Карточка / Открытие" добавляем:

if not VarIsClear(Object.View)
  Object.Rules.Rules(CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID).Enabled = FALSE
endif

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

2. Нашу проверку прописываем в событие "Карточка / Сохранение возможность":

ReqList = РИТНезаполненныеОбязательныеРеквизиты(Object)
if ReqList.Count > 0
  Message = ''               
  foreach ReqName in ReqList
    Message = Format('%s%s%s'; arrayof(Message; CR; ReqName))
  endforeach
  Raise(CreateException(''; 'Незаполнены обязательные реквизиты:' & CR & Message; ecWarning))
endif

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

3. Включим системную проверку обратно (в ней устанавливается утвержденность записи). В событие "Карточка / Сохранение возможность", сразу после нашей проверки:

Object.Rules.Rules(CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID).Enabled = TRUE

Упомянутая в коде функция РИТНезаполненныеОбязательныеРеквизиты():
1 параметр Obj вариантный

ReqList = CreateStringList()
Index = 1
while Index <= Obj.RequisiteCount
  Requisite = Obj.RequisiteByIndex(Index-1)
  if (Requisite.Required and (VarIsNull(Requisite.Value) or Requisite.Value == ''))
    ReqList.Add(Requisite.Title) 
  endif
  Index = Index + 1
endwhile
Result = ReqList

В результате пользователь видит такое предупреждение:

 

Еще одной особенностью такой проверки является то, что пользователь не может сохранить неутвержденную запись. Хотя при необходимости генерацию исключения можно заменить на соответствующий диалог.

Мария Макарцева

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

Николай Перфильев

Не работает Смех

Выдаёт ошибку в функции на строке 5. 

Николай Перфильев

значение переменной ReqList не определено.

Алена Рунова

Ошибка возникает, так как не создан список, необходимо добавить строку ReqList = CreateStringList() в самом начале функции.

 

Алексей Долгих

Алена правильно дополнила, скопировал на 1 строчку меньше. Дополнил. Исправил также 3 пункт - стандартную проверку нужно включить обратно раньше, чем в закрытии карточка, а именно сразу после нашей проверки. Как показала практика в стандартной проверке кроме проверки заполненности обязательных реквизитов еще устанавливается утвержденность записи справочника. Включив ее после нашей, проверка пройдет, т.к. заполненность проверили уже мы, да еще и утвердит запись.

Николай Перфильев

Во! Спасибо. Это просто сказка а не функция! 

Лично в моём случае это спасение -) Круто!

Адик Крымгужин

Алексей, спасибо - позаимствовал)

Адик Крымгужин

Кстати почему то табличную часть игнорирует. Тобишь в таблице имеются незаполненные реквизиты, а функция их игнорирует. может стоит в самой функции покопаться почему в список реквизитов не попадают реквизиты табличной части?) сделал бы сам да лень, да и функция барская ;)

Дерзай, Алексей!)

Виталий Сологуб
ReqList = CreateStringList()

Index = 1
while Index <= Obj.RequisiteCount
  Requisite = Obj.RequisiteByIndex(Index-1)
  if (Requisite.Required and (VarIsNull(Requisite.Value) or Requisite.Value == ''))
    ReqList.Add(Requisite.Title) 
  endif
  Index = Index + 1
endwhile

DDSNumber = 1
while DDSNumber <= 30
  if Obj.DetailExists(DDSNumber)
      DataSet = Obj.DetailDataSet(DDSNumber)
      Index = 1
      while Index <= DataSet.RequisiteCount
        Requisite = DataSet.RequisiteByIndex(Index-1)
        if (Requisite.Required)
            EmptyFound = false
            DataSet.First
            while not DataSet.EOF and not EmptyFound 
                if ((VarIsNull(Requisite.Value) or Requisite.Value == ''))
                  ReqList.Add(Requisite.Title) 
                  EmptyFound = true
                endif
                DataSet.Next
            endwhile
        endif
        Index = Index + 1
      endwhile
  endif
  DDSNumber = DDSNumber + 1
endwhile

Result = ReqList

 

Александр Чугунов

Виталий, ((VarIsNull(Requisite.Value) or Requisite.Value == '')) можно заменить на Requisite.IsNull.
Дополню еще что вот этот пункт статьи 

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

сейчас (а может и тогда) решается кодом

Object.Rules.Rules(CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID).Severe = true

 

Авторизуйтесь, чтобы написать комментарий