docs: @Override
    public final <T> void fill(final Map<String, Object> pAddParam,
      final T pEntity, final IRecordSet<RS> pSource) throws Exception {
      @SuppressWarnings("unchecked")
      IFillerObjectFields<T> filler = (IFillerObjectFields<T>)
        fillersFieldsFactory.lazyGet(pAddParam, pEntity.getClass());
      TableSql tableSql = this.tablesMap.get(pEntity.getClass().getSimpleName());
      @SuppressWarnings("unchecked")
      Collection<String> fieldsNames = (Collection<String>) pAddParam.
        get(pEntity.getClass().getSimpleName() + "neededFields");
      if (fieldsNames == null) {
        fieldsNames = tableSql.getFieldsMap().keySet();
      }
      boolean isDbgSh = this.logger.getDbgSh(this.getClass())
        && this.logger.getDbgFl() < 7031 && this.logger.getDbgCl() > 7033;
      String currentLevelNm = "currentLevel";
      @SuppressWarnings("unchecked")
      List<Integer> currentLevel = (List<Integer>) pAddParam.get(currentLevelNm);
      String deepLevelNm = "deepLevel";
      @SuppressWarnings("unchecked")
      List<Integer> deepLevel = (List<Integer>) pAddParam.get(deepLevelNm);
      @SuppressWarnings("unchecked")
      List<String> foreignFieldNms = (List<String>)
        pAddParam.get("foreignFieldNms");
      for (String fieldName : fieldsNames) {
        if (!tableSql.getFieldsMap().get(fieldName).getTypeField()
              .equals(ETypeField.DERIVED_FROM_COMPOSITE)) {
          String convName = this.fieldConverterNamesHolder.getFor(pEntity
           .getClass(), fieldName);
          IConverterByName<IRecordSet<RS>, ?> conv = this.convertersFieldsFatory
            .lazyGet(pAddParam, convName);
          if (conv != null) { // e.g. transient or composite (non-foreign) itsId
            try {
              Field field = this.fieldsRapiHolder
                .getFor(pEntity.getClass(), fieldName);
              String parName;
              String tableAlias;
              if (currentLevel.get(0) > 1) { // in TOP level
                String currForeignFieldNm = foreignFieldNms
                  .get(foreignFieldNms.size() - 1);
                tableAlias = currForeignFieldNm.toUpperCase();
              } else {
                tableAlias = "";
              }
              if (Enum.class.isAssignableFrom(field.getType())) {
                parName = tableAlias + fieldName.toUpperCase();
                pAddParam.put("fieldClass", field.getType());
              } else {
                if (tableSql.getFieldsMap().get(fieldName)
                  .getForeignEntity() != null) {
                  Integer deepLevelReq = (Integer) pAddParam.get(pEntity
                    .getClass().getSimpleName() + fieldName + deepLevelNm);
                  if (deepLevelReq != null) {
                    //sub-entities with overridden deep:
                    currentLevel.add(1);
                    deepLevel.add(deepLevelReq);
                  } //nothing for sub-entities
                  if (deepLevel.size() != currentLevel.size()) {
                    throw new Exception(
                  "Algorithm error: deepLevel.size/currentLevel.size/Entity/Field"
                    + deepLevel.size() + "/" + currentLevel.size() + "/"
                      + pEntity.getClass().getSimpleName() + "/" + fieldName);
                  }
                  parName = fieldName;
                   //table current alias for name
                  foreignFieldNms.add(fieldName);
                  // foreign entity class for factory:
                  pAddParam.put("fieldClass", field.getType());
                  pAddParam.put("entityClass", pEntity.getClass());
                  if (isDbgSh) {
                    StringBuffer sb = new StringBuffer();
                    sb.append("deepLevel size/value1/value...: " + deepLevel
                      .size() + "/");
                    for (Integer dl : deepLevel) {
                      sb.append(dl + "/");
                    }
                    sb.append("\ncurrentLevel size/value1/value...: "
                      + currentLevel.size() + "/");
                    for (Integer cl : currentLevel) {
                      sb.append(cl + "/");
                    }
                    sb.append("\nforeignFieldNms size/value1/value...: "
                      + foreignFieldNms.size() + "/");
                    for (String fln : foreignFieldNms) {
                      sb.append(fln + "/");
                    }
                    sb.append("\nForeign class/fieldNm/type: "
                      + pEntity.getClass().getSimpleName() + "/" + fieldName + "/"
                       + field.getType().getSimpleName());
                    this.logger.debug(null, FillerEntitiesFromRs.class,
                      sb.toString());
                  }
                } else {
                  parName = tableAlias + fieldName.toUpperCase();
                }
              }
              Object fieldVal = conv.convert(pAddParam, pSource, parName);
              if (isDbgSh) {
                this.logger.debug(null, FillerEntitiesFromRs.class,
                  "Converted from RS class/field/type/converter/value: "
                    + pEntity.getClass().getSimpleName() + "/" + fieldName + "/"
                      + field.getType().getSimpleName() + "/"
                        + conv.getClass().getSimpleName() + "/" + fieldVal);
              }
              filler.fill(pAddParam, pEntity, fieldVal, fieldName);
            } catch (Exception ex) {
              String msg = "Can't fill field/class: " + fieldName + "/"
                + pEntity.getClass().getCanonicalName();
              throw new ExceptionWithCode(ExceptionWithCode.SOMETHING_WRONG,
                msg, ex);
            }
          }
        }
      }
      pAddParam.remove("fieldClass");
      pAddParam.remove("entityClass");
    }