В системе имеется проверка на заполненность обязательных реквизитов справочника при сохранении. Но есть одно "но". Проверка осуществляется по элементно! Т.е. нажимаете Сохранить и система Вам говорит, что незаполнено определенный реквизит. Вы его заполняете,
снова жмете Сохранить, и опять получаете сообщение о том, что Вы забыли заполнить еще один реквизит.
Согласитесь, было бы удобно, чтобы система показывала бы полный список незаполненных обязательных реквизитов. Сейчас мы ее этому научим.
Стандартная проверка происходит еще до события "Сохранение Возможнось", т.е. любые наши проверки реквизитов пойдут уже после нее. Казалось бы, ничего с этим не поделать - системная логика и все тут. Как оказалось - только лишь казалось.
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
В результате пользователь видит такое предупреждение:

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