{~CreateDoc5
  создает документ 5 класса на основе блока IK.ZR

  aXmlED5 - описание создаваемого эд 11го
  xXmlZR - узел из входного файла

  результат:
    =true - эд aXmlED5 создан
    =false - эд aXmlED5 не создан.

  exchange #3062
    перенос функционала проверки кбк в строках сюда.}
function CreateDoc5(aXmlED5, aXmlZR, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost: String;
  XmlOrg, XmlAcc, RecXml, DocOsn: Variant;
  xBudgetID: string;
begin

    try
      Result := FALSE;

      xBudgetID := aXmlED5.getAttribute('F_BUDGET_ID');

      // exchange #3062 - перенос проверки строк ZRST в создание эд
      // проверка выполняется уже после того, как в логе указано
      // какой эд создается.
      if NOT CheckKBK_All_ZRST( aXmlZR, xBudgetID)
        then EXIT;

      aXmlED5.setAttribute('F_PARENTCLASS', ''); //Класс документа, среди которых надо искать пару.
      aXmlED5.setAttribute('action', 'insert');
      aXmlED5.setAttribute('DECLINE', 'False');
      aXmlED5.setAttribute('BUDGET_ID', xBudgetID);//aXmlED5.getAttribute('F_BUDGET_ID'));
      aXmlED5.setAttribute('CARRY_DATE', DateTimeToXml(StrToDate(aXmlIK.getAttribute('DATE'))));
      aXmlED5.setAttribute('EXTSTATUS_ID', 0);
      aXmlED5.setAttribute('AMOUNT', 0.00);
      aXmlED5.setAttribute('PAYKIND', PayKindSetAsAzk(aXmlZR.getAttribute('VID_PL')));

      // разборка с идентификатором
      // exchange #3062 - унификация кода
      if NOT FillDepartamentalinfo_ImpIK_ZR(aXmlED5, aXmlZR)
        then EXIT;
(*
      aXmlED5.setAttribute('AUTHOR_ID', Get_Author_Id(aXmlZR.getAttribute('PAYSTATUS')));
      //Exchnge #771, если KBKD не пусто, а AUTHOR_ID пусто, то AUTHOR_ID заполняем нулем.
      if (aXmlED5.getAttribute('AUTHOR_ID') = '') and (aXmlZR.getAttribute('KDOH') <> '') then
        aXmlED5.setAttribute('AUTHOR_ID', 0);
      if aXmlED5.getAttribute('AUTHOR_ID') <> '' then
      begin
        // exchange #2791 - проверка КБК в ид.платежа
        // если проверка =false - не создаем эд.
        // при этом ошибку указываем в журнале info
        if NOT DoCheck_2791_LoadKBK0_PI_BUDGET_CODE( aXmlZR.getAttribute('KDOH'))
          then begin
            Result := False;
            EXIT;
          end;

        // exchange #3062 - удален косгу
        // всегда принимается тип = доходы
        aXmlED5.setAttribute('PI_ANAL_KIND', '1');
        {
        aXmlED5.setAttribute('PI_ANAL_KIND', GetPi_Anal_Kind(
          Copy(aXmlZR.getAttribute('KDOH'), 18, 3)));}
        aXmlED5.setAttribute('PI_BUDGET_CODE', aXmlZR.getAttribute('KDOH'));
        aXmlED5.setAttribute('PAY_OKATO', aXmlZR.getAttribute('OKATO'));
        aXmlED5.setAttribute('GROUND_ID', GetGrnd_Ground_Id(aXmlZR.getAttribute('OSN_PL')));
        aXmlED5.setAttribute('TAXPERIOD', aXmlZR.getAttribute('NAL_PER'));
        aXmlED5.setAttribute('GRND_DOC_NUMBER', aXmlZR.getAttribute('NOM_DOK'));
        aXmlED5.setAttribute('GRND_DOC_DATE', aXmlZR.getAttribute('DATE_DOK'));
        aXmlED5.setAttribute('PAYTYPE_ID', GetGrnd_PayType_Id(aXmlZR.getAttribute('TYPE_PL')));
      end
      else begin
        aXmlED5.setAttribute('PI_BUDGET_CODE', '');
        aXmlED5.setAttribute('PAY_OKATO', '');
        aXmlED5.setAttribute('TAXPERIOD', '');
        aXmlED5.setAttribute('GRND_DOC_NUMBER', '');
        aXmlED5.setAttribute('GRND_DOC_DATE', '');
      end;
      *)
      aXmlED5.setAttribute('DESCRIPTION', aXmlZR.getAttribute('PURPOSE'));
      // Блок "Плательщик"
      WriteLog('Заполнение данных плательщика', True);
      aXmlED5.setAttribute('PAY_ID', '');
      aXmlED5.setAttribute('PAY_TAXCODE', aXmlIK.getAttribute('INN_UBP'));
      aXmlED5.setAttribute('PAY_KPP', aXmlIK.getAttribute('KPP_UBP'));
      aXmlED5.setAttribute('PAY_NAME', aXmlIK.getAttribute('NAME_UBP_PUBP'));
      aXmlED5.setAttribute('PAY_ACCOUNT', aXmlIK.getAttribute('LS_UBP'));
      if aXmlED5.getAttribute('PAY_TAXCODE') <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(aXmlED5.getAttribute('PAY_TAXCODE'),
          aXmlED5.getAttribute('PAY_KPP'), '', '', False, aXmlED5);
        if (XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '0')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED5.getAttribute('BUDGET_ID')) then
        begin
          aXmlED5.setAttribute('PAY_ID',
            XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'));
          WriteLog('Найден плательщик с референсом: ' + aXmlED5.getAttribute('PAY_ID'));
          // определяем счет плательщика
          if aXmlIK.getAttribute('LS_UBP') = '' then
          begin
            WriteInfo('Не создан - не определен счет плательщика');
            Result := False;
            Exit;
          end
          else begin
            if aXmlZR.selectSingleNode('ZRST').getAttribute('KOD_IST_KBK') = 1 then
            begin
              // поиск счета без признака "Распорядительный" без учета признака "Бюджетный"
              XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED5.getAttribute('PAY_ID'),
                aXmlIK.getAttribute('LS_UBP'), '5');
              if XmlAcc.documentElement.childNodes.Length = 1 then
              begin
                XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
                aXmlED5.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
                aXmlED5.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
                aXmlED5.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
                aXmlED5.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                aXmlED5.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                aXmlED5.setAttribute('PAY_BIC', XmlAcc.getAttribute('BIC'));
                aXmlED5.setAttribute('PAY_B_NAME', XmlAcc.getAttribute('B_NAME'));
                WriteLog('Найден счет плательщика с референсом: ' + XmlAcc.getAttribute('ID'));
              end
              // если найдено нескольно, поиск производим с учетом признака "Бюджетный"
              else if XmlAcc.documentElement.childNodes.Length > 1 then
              begin
                XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED5.getAttribute('PAY_ID'),
                  aXmlIK.getAttribute('LS_UBP'), '5', '1');
                if XmlAcc.documentElement.childNodes.Length = 1 then
                begin
                  XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
                  aXmlED5.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
                  aXmlED5.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
                  aXmlED5.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
                  aXmlED5.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                  aXmlED5.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                  aXmlED5.setAttribute('PAY_BIC', XmlAcc.getAttribute('BIC'));
                  aXmlED5.setAttribute('PAY_B_NAME', XmlAcc.getAttribute('B_NAME'));
                  WriteLog('Найден счет плательщика с референсом: ' + XmlAcc.getAttribute('ID'));
                end
                else
                  WriteLog('Референс счета плательщика не опеределен', True);
              end
              else
                WriteLog('Референс счета плательщика не опеределен', True);
            end
            else begin
              // поиск счета без признака "Распорядительный", без признака "Бюджетный"
              XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED5.getAttribute('PAY_ID'),
                aXmlIK.getAttribute('LS_UBP'), '5', '0');
              if XmlAcc.documentElement.childNodes.Length = 1 then
              begin
                XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
                aXmlED5.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
                aXmlED5.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
                aXmlED5.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
                aXmlED5.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                aXmlED5.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                aXmlED5.setAttribute('PAY_BIC', XmlAcc.getAttribute('BIC'));
                aXmlED5.setAttribute('PAY_B_NAME', XmlAcc.getAttribute('B_NAME'));
                WriteLog('Найден счет плательщика с референсом: ' + XmlAcc.getAttribute('ID'));
              end
              else
                WriteLog('Референс счета плательщика не опеределен', True);
            end;
          end;
        end
        else begin
          WriteInfo('Не создан - не определен референс плательщика');
          Result := False;
          Exit;
        end;
      end
      else begin
        WriteInfo('Не создан - не определен референс плательщика');
        Result := False;
        Exit;
      end;
      // --- Получатель ---
      WriteLog('Заполнение данных получателя', True);
      aXmlED5.setAttribute('REC_ID', '');
      aXmlED5.setAttribute('REC_TAXCODE', aXmlZR.getAttribute('INN_RCP'));
      aXmlED5.setAttribute('REC_KPP', aXmlZR.getAttribute('KPP_RCP'));
      aXmlED5.setAttribute('REC_NAME', aXmlZR.getAttribute('NAME_RCP'));
      aXmlED5.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('BS_RCP'));
      aXmlED5.setAttribute('REC_BIC', aXmlZR.getAttribute('BIC_RCP'));
      aXmlED5.setAttribute('REC_B_NAME', aXmlZR.getAttribute('KS_BIC_RCP'));
      if Trim(aXmlED5.getAttribute('REC_TAXCODE')) <> '' then
      begin
        WriteLog('Поиск референса получателя по ИНН и КПП', True);
        XmlOrg := GetOrgByTaxKpp(aXmlED5.getAttribute('REC_TAXCODE'),
          aXmlED5.getAttribute('REC_KPP'), '', '', False, aXmlED5);
        if (XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '0')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED5.getAttribute('BUDGET_ID')) then
        begin
          aXmlED5.setAttribute('REC_ID',
            XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'));
          WriteLog('Найден получатель с референсом: ' + aXmlED5.getAttribute('REC_ID'));
          WriteLog('Поиск референса счета получателя', True);
          if aXmlZR.getAttribute('LS_UBP_RCP') <> '' then
          begin
            aXmlED5.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('LS_UBP_RCP'));
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED5.getAttribute('REC_ID'),
                aXmlZR.getAttribute('LS_UBP_RCP'), '5, 9');
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED5.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              aXmlED5.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('LS_UBP_RCP'));
              aXmlED5.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED5.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              if (aXmlZR.getAttribute('BS_RCP') <> '') and
                (aXmlZR.getAttribute('BS_RCP') = XmlAcc.getAttribute('SPECUFK_ACCOUNT_NUMBER')) then
              begin
                aXmlED5.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('SPECUFK_ACCOUNT_NUMBER'));
                aXmlED5.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('SPECUFK_ACC_ID'));
                aXmlED5.setAttribute('REC_BIC', XmlAcc.getAttribute('SPECBIC'));
                aXmlED5.setAttribute('REC_B_NAME', XmlAcc.getAttribute('SPECB_NAME'));
              end
              else begin
                aXmlED5.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                aXmlED5.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                aXmlED5.setAttribute('REC_BIC', XmlAcc.getAttribute('BIC'));
                aXmlED5.setAttribute('REC_B_NAME', XmlAcc.getAttribute('B_NAME'));
              end;
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end
          else begin
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED5.getAttribute('REC_ID'),
                aXmlZR.getAttribute('BS_RCP'), '2, 3');
            if XmlAcc.documentElement.childNodes.Length = 1 then
              aXmlED5.setAttribute('REC_ACC_ID', XmlAcc.documentElement.childNodes.Item[0].getAttribute('ID'))
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end
        else
          WriteLog('Референс получателя не опеределен', True);
      end
      else
        WriteLog('Референс получателя не опеределен', True);

      if (aXmlZR.selectNodes('ZRST').Length = 1) and
        (StrToBool(aXmlZR.selectNodes('ZRST').Item[0].getAttribute('F_EMPTYKBK'))) then
      begin
        // записываем сумму документа из строки в шапку
        aXmlED5.setAttribute('AMOUNT',
          Format('%.2f', [StrToCurr(aXmlZR.selectNodes('ZRST').Item[0].getAttribute('SUM_V_KBK'))]));
        //атрибут говорит о том что строк нет.
        aXmlED5.setAttribute('NOROW', 'True');
      end
      else begin
        // строки документов.
        aXmlED5 := aXmlED5.appendChild(aXmlED5.ownerDocument.createElement('PAYORDERLINE'));
        for i := 0 to aXmlZR.selectNodes('ZRST').Length - 1 do
        begin
          aXmlZR := aXmlZR.selectNodes('ZRST').Item[i];
          aXmlED5 := aXmlED5.appendChild(aXmlED5.ownerDocument.createElement('PAYORDERLINE'));
          //Если строка с неопределенным кбк, то выходим, сообщив пользователю
          if StrToBool(aXmlZR.getAttribute('F_EMPTYKBK')) then
          begin
            WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
              aXmlED5.parentNode.parentNode.getAttribute('DOC_NUMBER') + ' Дата: ' +
                aXmlED5.parentNode.parentNode.getAttribute('DOC_DATE') + ' - не создан. ' +
                'Не определен тип КБК или КБК не заполнен.', True);
            Exit;
          end;
          // предзаполнение
          FillElementBySchemaLoad(aXmlED5, aXmlZR);
          aXmlED5.parentNode.parentNode.setAttribute('AMOUNT',
            aXmlED5.parentNode.parentNode.getAttribute('AMOUNT') +
              StrToCurr(aXmlED5.getAttribute('AMOUNT')));
          AddReplaceAttrVal(aXmlZR, aXmlED5);
          // Exchange#2101 проставляем в шапку документа тип классификации
          // Anal_kind по последней строке, иначе АЦК некорректно отображает
          aXmlED5.parentNode.parentNode.setAttribute('ANAL_KIND', aXmlED5.getAttribute('ANAL_KIND'));
          aXmlED5.setAttribute('FSR_ID', aXmlZR.getAttribute('KOD_IST_KBK'));
          aXmlED5.setAttribute('DESCRIPTION', aXmlZR.getAttribute('PURPOSE_KBK'));
          aXmlED5 := aXmlED5.parentNode;
          aXmlZR := aXmlZR.parentNode;
        end;
        aXmlED5.parentNode.setAttribute('AMOUNT',
          Format('%.2f', [StrToCurr(aXmlED5.parentNode.getAttribute('AMOUNT'))]));
      end;
      aXmlED5 := aXmlED5.ownerDocument;
      aXmlED5 := aXmlED5.documentElement;
      WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
        aXmlED5.getAttribute('DOC_NUMBER') + ' Дата: ' +
        aXmlED5.getAttribute('DOC_DATE') + ' Сумма: ' +
        aXmlED5.getAttribute('AMOUNT'), True);
      // Вставка документа, проверки и прочее.
      if not VarIsNull(aXmlED5.getAttribute('NOROW')) then
        InsertDebCred(aXmlED5) //вставляем документ без строк.
      else
        Documents_DebCred(aXmlED5);
//      aXmlZR := null;

      Result := TRUE;
      except
        ExceptionProc( 'CreateDoc5');
    end;

end;

begin
end.
