{~SortSPD
  разбор блока SPD на классы создаваемых документов.
  вызывается при загрузке шы IK.SPD и SP.SPD.

  exchange #3062
    объединение загрузки по IK и SP.
    добавлен параметр:
      aFileMarker - тип файла. принимает значения: IK или SP.

  exchange #3075
  ФТ-1.1	Тип формируемой строки определять из полей SPRR.DEBET,
          SPRR.KREDIT по значению с 19 по 26 знаки,
          искать соответствие в set – файле аналогично текущей
          реализации, но вместо трехзначного значения брать
          восьмизначное.

  параметр aSP_KOD_DOC определяет поле SP.KOD_DOC.
  для загрузки по IK этот параметр заполнять не нужно или указать
  в параметре пустую строку.}
procedure SortSPD( aFileMarker: string;
                   aXmlED, aXmlSPD, aXmlIK: Variant;
                   aListTypeKBK: TStringList;
                   aSP_KOD_DOC: string = '');
var
  i: Integer;
  Doc39, Doc40, Doc24, Doc35: Variant;
  xDocCreateCount: integer;
  xKBK: string;
  xF_TYPE: string;
  xXmlSPDRR: Variant;
  xSPD_NAME_DOC: string;
  xSPRR_KREDIT: string;
  xSPRR_DEBET: string;
  xIsFileSP: boolean;
  xIsFileIK: boolean;
  {---------------------------------------------------------------------------}
  { exchange #3140
    aFieldDK - поле SPRR.DEBET или SPRR.KREDIT.

    20- значное значение кода БК вычислять следующим образом:
    из полей SPRR.DEBET, SPRR.KREDIT брать значение с 1 по 17 и с 24 по 26 знаки}
  procedure DoFillKBK_( aFieldDK: string);
  begin

      try
        xKBK := Copy( aFieldDK, 1, 17);
        xKBK := xKBK + Copy( aFieldDK, 24, 3);
        except
          ExceptionProc( 'DoFillKBK_');
      end;

  end;
  {---------------------------------------------------------------------------}
  function DoCreateDoc_: variant;
  begin

      try
        Result := CreateOleObject('Microsoft.XmlDom');
        Result := Result.appendChild( aXmlED.cloneNode( False));
        except
          ExceptionProc( 'DoCreateDoc_');
      end;

  end;
  {---------------------------------------------------------------------------}
  procedure DoAppendDoc_( aDoc: Variant; aF_DEBET: boolean);
  var
    xNode: Variant;
  begin

      try
        xNode := aDoc.appendChild( xXmlSPDRR.cloneNode( False));
        if aF_DEBET
          then xNode.SetAttribute( 'F_DEBET', 'True')
          else xNode.SetAttribute( 'F_DEBET', 'False');
        xNode.SetAttribute( 'TYPE_KBK', xF_TYPE);
        xNode.SetAttribute( 'KBK', xKBK);
        except
          ExceptionProc( 'DoAppendDoc_');
      end;

  end;
  {---------------------------------------------------------------------------}
  procedure DoError_NotEncodeTypeKBK_( aFieldName: string);
  begin

      try
        // exchange #2844
        // поправлена проверка соответствия типа КБК и определения док.
        // с целью создания ЭД и подписи в журналах.
        // здесь если по типу КБК из TypeKBK.set (aListTypeKBK)
        // не будет создан ЭД,
        // то уже не праверяем какой тип определили по set файлу,
        // а просто выдаем сообщение в журнал.
        //if xXmlSPDRR.getAttribute('F_TYPE_СREDIT') = '' then
        WriteInfo(
            FORMAT( 'Не найдено соответствие типа строки=<%s> '
                   +'в файле TypeKBK.set при поиске КОСГУ по %s',
                    [ xF_TYPE,
                      aFieldName]));
        except
          ExceptionProc( 'DoError_NotEncodeTypeKBK_');
      end;

  end;
  {---------------------------------------------------------------------------}
begin

    try
      // определение флагов по какому файлу грузим/
      // так потом удобнее для кода, мнесто проверок строки на соответствие.
      xIsFileSP := FALSE;
      xIsFileIK := FALSE;
      case UPPERCASE( aFileMarker) of
        'IK': xIsFileIK := TRUE;
        'SP': xIsFileSP := TRUE;
      end;

      //----------------------------------------------------------------------
      // разбор параметров первичного документа из SPD
      PreparePayDocParams215( aXmlSPD);

      aXmlED.setAttribute('DOC_NUMBER', aXmlSPD.getAttribute('NUM_DOC'));
      aXmlED.setAttribute('DOC_DATE', aXmlSPD.getAttribute('DATE_SP'));
      aXmlED.setAttribute('NOM_SP', aXmlSPD.getAttribute('NOM_SP'));
      aXmlED.setAttribute('GUID_FK', aXmlSPD.getAttribute('GUID'));
      if xIsFileSP
        then aXmlED.setAttribute('KOD_UBP', KOD_UBP);

      // это нужно для оптимизации кода
      xSPD_NAME_DOC := LowerCase( aXmlSPD.getAttribute('NAME_DOC'));

      Doc24 := DoCreateDoc_;
      Doc35 := DoCreateDoc_;
      Doc39 := DoCreateDoc_;
      Doc40 := DoCreateDoc_;



      //----------------------------------------------------------------------
      WriteLog('Определение класса документа ...', True);
      for i := 0 to aXmlSPD.childNodes.Length - 1 do begin
        xXmlSPDRR := aXmlSPD.childNodes.Item[i];


        xSPRR_KREDIT := GetNodeAttributeEx( xXmlSPDRR, 'KREDIT');
        xSPRR_DEBET  := GetNodeAttributeEx( xXmlSPDRR, 'DEBET');


        //проверка 18-го разряда бух.счета(кредит) на 1
        if (Copy(xSPRR_KREDIT, 18, 1) <> '1') then begin
          WriteInfo(
              FORMAT( '18-й разряд счета по кредиту (%s) не равен 1',
                      [ Copy( xSPRR_KREDIT, 18, 1)]));
        end else begin
          //проверка присутствия КОСГУ кредита в файле TypeKBK.set
          // exchange #3075 фт-1.1
          xF_TYPE := FindSettingsType2( Copy( xSPRR_KREDIT, 19, 8), aListTypeKBK);
          xXmlSPDRR.setAttribute( 'F_TYPE_СREDIT', xF_TYPE);
          // заполняем кбк
          DoFillKBK_( xSPRR_KREDIT);
          case xF_TYPE of
            '10': if ((xSPD_NAME_DOC = 'объявление на взнос наличными')
                      and param_CreateDoc24)
                    then DoAppendDoc_( Doc24, False)
                    // exchange #2600
                    // по п.1.3.1.1 создавать ЭД 40го класса по расходам
                    // согласовано с АО.
                    else DoAppendDoc_( Doc40, False);

            '31': if (xSPD_NAME_DOC in
                      [ 'уведомление об уточнении вида и принадлежности платежа',
                        'внутренний внебанковский документ',
                        'справка ф. 0504833',
                        'справка ф.0504833',
                        // exchange #2911 - добавлено новое значение (небыло реализовано
                        // добавление по exchange #2848)
                        'расшифровка сумм неиспользованных (внесенных через банкомат'
                       +' или пункт выдачи наличных денежных средств) средств',
                        // exchange #2600
                        // добавлено еще одно название документа из SPD.NAME_DOC
                        'расшифровка неиспользованных средств по банковским картам'])
                    then DoAppendDoc_( Doc39, False);

            // для доходной строки по IK эд не создается, только для SP
            '20': if xIsFileIK
                    then DoError_NotEncodeTypeKBK_( 'KREDIT')
                    else
                      if (xSPD_NAME_DOC in
                            [ 'уведомление об уточнении вида и принадлежности платежа',
                              'внутренний внебанковский документ',
                              'справка ф. 0504833',
                              'справка ф.0504833',
                              // exchange #2911 - добавлено новое значение (небыло реализовано
                              // добавление по exchange #2848)
                              'расшифровка сумм неиспользованных (внесенных через банкомат'
                             +' или пункт выдачи наличных денежных средств) средств',
                              // exchange #2600
                              // добавлено еще одно название документа из SPD.NAME_DOC
                              'расшифровка неиспользованных средств по банковским картам'])
                        then DoAppendDoc_( Doc35, False);

            else DoError_NotEncodeTypeKBK_( 'KREDIT');
          end;//case//
        end;

        //===================================================================

        if (xSPD_NAME_DOC in
              [ 'уведомление об уточнении вида и принадлежности платежа',
                'внутренний внебанковский документ',
                'справка ф. 0504833',
                'справка ф.0504833']) then begin
          //проверка 18-го разряда бух.счета(дебет) на 1
          if (Copy( xSPRR_DEBET, 18, 1) <> '1') then begin
            WriteInfo(
                FORMAT( '18-й разряд счета по дебету (%s) не равен 1',
                        [ Copy( xSPRR_DEBET, 18, 1)]));
          end else begin
            //проверка присутствия КОСГУ дебета в файле TypeKBK.set
            // exchange #3075 фт-1.1
            xF_TYPE := FindSettingsType2( Copy( xSPRR_DEBET, 19, 8), aListTypeKBK);
            xXmlSPDRR.setAttribute( 'F_TYPE_DEBET', xF_TYPE);
            // exchange #3075 заполняем кбк
            DoFillKBK_( xSPRR_DEBET);
            case xF_TYPE of
              '10': DoAppendDoc_( Doc40, True);
              '31': DoAppendDoc_( Doc39, True);

              // для доходной строки по IK эд не создается, только для SP
              '20': if xIsFileSP
                      then DoAppendDoc_( Doc35, True)
                      else DoError_NotEncodeTypeKBK_( 'DEBET');

              else  DoError_NotEncodeTypeKBK_( 'DEBET');
            end;//case//
          end;
        end;

      end;//for//

      //----------------------------------------------------------------------
      xDocCreateCount := 0;

      if Doc24.childNodes.length <> 0 then begin
        WriteInfo('---==============---');
        if xIsFileIK then begin
          CreateDoc24(Doc24, aXmlIK);
          INC( xDocCreateCount);
        end;
        // загрузка SP:
        // для справки по внебанковским операциям нельзя импортировать
        // объявление на взнос наличными
        if xIsFileSP then
          if param_CreateDocuments215
            then WriteInfo(
                    'Ошибка операции: Не допускается для справки по внебанковским'
                   +' операциям импортировать объявление на взнос наличными.')
            else begin
              CreateDoc24(Doc24, aXmlIK);
              INC( xDocCreateCount);
            end;
      end;

      if Doc35.childNodes.length <> 0 then begin
        WriteInfo('---==============---');
        CreateDoc35(Doc35, aXmlIK);
        INC( xDocCreateCount);
      end;
      if Doc39.childNodes.length <> 0 then begin
        WriteInfo('---==============---');
        CreateDoc39(Doc39, aXmlIK);
        INC( xDocCreateCount);
      end;
      if Doc40.childNodes.length <> 0 then begin
        WriteInfo('---==============---');
        CreateDoc40(Doc40, aXmlIK);
        INC( xDocCreateCount);
      end;

      Doc24 := null;
      Doc39 := null;
      Doc35 := null;
      Doc40 := null;

      // exchange #2844
      // добавляем сообщение в лог, что не создано ни одного эд
      if (xDocCreateCount <= 0)
        then WriteInfo( 'Не создано ни одного ЭД по разделу SPD.');
      except
        ExceptionProc( 'SortSPD');
    end;

end;


begin
end.
