/**
  * Выполняет валидацию установки {@link MetaField#FLAG_UNIQUE уникального флага}
  *
  * @param errors контейнер ошибок
  * @param newObject обновляемое МЕТА-поле
  * @param oldObject существущее МЕТА-поле или <code>NULL</code>
  */
 private void doValidateUniqueFlag(Errors errors, MetaField newObject, MetaField oldObject) {
   if (newObject.isFlagEstablished(MetaField.FLAG_UNIQUE)
       && (oldObject == null || !oldObject.isFlagEstablished(MetaField.FLAG_UNIQUE))) {
     if (!fieldService.isFieldsUnique(newObject.getId())) {
       reject(
           errors,
           new NotUniqueFieldsException(ModelUtils.createMetaFieldNamedPath(newObject)),
           newObject.getName());
     }
   }
 }
 @Override
 protected void validateNewToOld(Errors errors, MetaField newObject, MetaField oldObject) {
   super.validateNewToOld(errors, newObject, oldObject);
   // Восстанавливаем позицию МЕТА-поля
   newObject.setOrdinal(oldObject.getOrdinal());
   // Восстанавливаем старое значение первичного ключа
   if (oldObject.isFlagEstablished(MetaField.FLAG_PRIMARY)) {
     newObject.establishFlags(MetaField.FLAG_PRIMARY);
   }
   // Проверяем флаги
   doValidateFlags(errors, newObject, oldObject);
 }
 @Override
 protected void doValidateCommon(Errors errors, MetaField target) {
   super.doValidateCommon(errors, target);
   if (!errors.hasErrors()) {
     // Устанавливаем позицию поля относительно других
     int metaFieldsCount =
         getDocumentService()
             .countByCriteria(
                 createCriteriaByIDs(MetaField.DICTIONARY_ID, target.getDictionaryId()));
     target.setOrdinal(metaFieldsCount);
     // Проверяем флаги
     doValidateFlags(errors, target, null);
   }
 }
 /**
  * Выполняет валидацию установки {@link MetaField#FLAG_PRIMARY первичного флага}
  *
  * @param errors контейнер ошибок
  * @param newObject обновляемое МЕТА-поле
  * @param oldObject существущее МЕТА-поле или <code>NULL</code>
  */
 private void doValidatePrimaryFlag(Errors errors, MetaField newObject, MetaField oldObject) {
   boolean illegalChange =
       newObject.isFlagEstablished(MetaField.FLAG_PRIMARY)
           && (oldObject == null || !oldObject.isFlagEstablished(MetaField.FLAG_PRIMARY));
   illegalChange =
       illegalChange
           || !newObject.isFlagEstablished(MetaField.FLAG_PRIMARY)
               && (oldObject != null && oldObject.isFlagEstablished(MetaField.FLAG_PRIMARY));
   if (illegalChange) {
     reject(
         errors,
         new NotUniqueFieldsException(ModelUtils.createMetaFieldNamedPath(newObject)),
         newObject.getName());
   }
 }
 /**
  * Выполняет валидацию количества {@link ru.hflabs.rcd.model.document.Field значений полей}
  *
  * @param errors контейнер ошибок
  * @param metaField уникальное МЕТА-поле
  */
 private void doValidateFieldCount(Errors errors, MetaField metaField) {
   // Если МЕТА-поле помечено как уникальное и не является первичным ключем,
   // то количество полей для первичного ключа должно совпадать с количеством полей текущего
   // МЕТА-поля
   // для корректного формирования записей справочника
   if (!metaField.isFlagEstablished(MetaField.FLAG_PRIMARY)
       && metaField.isFlagEstablished(MetaField.FLAG_UNIQUE)) {
     MetaFieldNamedPath metaFieldNamedPath = ModelUtils.createMetaFieldNamedPath(metaField);
     // Получаем количество значений полей по текущему полю
     int currentFieldsCount =
         fieldService.countByCriteria(createCriteriaByIDs(Field.META_FIELD_ID, metaField.getId()));
     // Получаем количество значений полей по первичному полю
     MetaField primaryMetaField =
         getDocumentService().findPrimaryMetaFieldByNamedPath(metaFieldNamedPath, false);
     int primaryFieldsCount =
         fieldService.countByCriteria(
             createCriteriaByIDs(Field.META_FIELD_ID, primaryMetaField.getId()));
     // Проверяем количество
     if (currentFieldsCount != primaryFieldsCount) {
       reject(errors, new NotUniqueFieldsException(metaFieldNamedPath), metaField.getName());
     }
   }
 }
 @Override
 protected MetaField findUniqueByName(MetaField target) {
   return getDocumentService()
       .findUniqueByRelativeId(target.getDictionaryId(), target.getName(), false, true);
 }