В системе имеется проверка на заполненность обязательных реквизитов справочника при сохранении. Но есть одно "но". Проверка осуществляется по элементно! Т.е. нажимаете Сохранить и система Вам говорит, что незаполнено определенный реквизит. Вы его заполняете, снова жмете Сохранить, и опять получаете сообщение о том, что Вы забыли заполнить еще один реквизит.
Согласитесь, было бы удобно, чтобы система показывала бы полный список незаполненных обязательных реквизитов. Сейчас мы ее этому научим.
Стандартная проверка происходит еще до события "Сохранение Возможнось", т.е. любые наши проверки реквизитов пойдут уже после нее. Казалось бы, ничего с этим не поделать - системная логика и все тут. Как оказалось - только лишь казалось.
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 пункт - стандартную проверку нужно включить обратно раньше, чем в закрытии карточка, а именно сразу после нашей проверки. Как показала практика в стандартной проверке кроме проверки заполненности обязательных реквизитов еще устанавливается утвержденность записи справочника. Включив ее после нашей, проверка пройдет, т.к. заполненность проверили уже мы, да еще и утвердит запись.
Во! Спасибо. Это просто сказка а не функция!
Лично в моём случае это спасение -)
Алексей, спасибо - позаимствовал)
Кстати почему то табличную часть игнорирует. Тобишь в таблице имеются незаполненные реквизиты, а функция их игнорирует. может стоит в самой функции покопаться почему в список реквизитов не попадают реквизиты табличной части?) сделал бы сам да лень, да и функция барская ;)
Дерзай, Алексей!)
Виталий, ((VarIsNull(Requisite.Value) or Requisite.Value == '')) можно заменить на Requisite.IsNull.
Дополню еще что вот этот пункт статьи
сейчас (а может и тогда) решается кодом
Авторизуйтесь, чтобы написать комментарий