{~CreateDoc80
  создает документ 80 класса на основе данных файла IK.ZV
  }
function CreateDoc80(aXmlED80, aXmlZV, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost: String;
  XmlOrg, XmlAcc, RecXml, DocOsn: Variant;
  xBudgetID: string;
begin

    try
      Result := False;

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

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

      aXmlED80.setAttribute('action', 'insert');
      aXmlED80.setAttribute('BUDGET_ID', xBudgetID);//aXmlED80.getAttribute('F_BUDGET_ID'));
      aXmlED80.setAttribute('GUID_FK', aXmlED80.getAttribute('FOREIGN_KEY'));
      aXmlED80.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlED80.getAttribute('DOC_DATE'))));
      if aXmlZV.childNodes.item[0].getAttribute('SEQ') <> '0' then
        aXmlED80.setAttribute('QUEUE_KIND', aXmlZV.childNodes.item[0].getAttribute('SEQ'))
      else
        aXmlED80.setAttribute('QUEUE_KIND', GetQueueKind);
      //Exchange#2239
      if aXmlED80.getAttribute('QUEUE_KIND') = '=' then
        aXmlED80.setAttribute('QUEUE_KIND', '6');
      aXmlED80.setAttribute('EXTSTATUS_ID', 0);
      aXmlED80.setAttribute('AMOUNT', 0);
      aXmlED80.setAttribute('PAYKIND', PayKindSetAsAzk(aXmlZV.childNodes.item[0].getAttribute('VID_PL')));
      aXmlED80.setAttribute('DESCRIPTION', aXmlZV.childNodes.item[0].getAttribute('NAZN_PL'));
      //блок администратор
      WriteLog('Заполнение данных администратора', True);
      aXmlED80.setAttribute('ADMIN_TAXCODE', aXmlIK.getAttribute('INN_UBP'));
      aXmlED80.setAttribute('ADMIN_KPP', aXmlIK.getAttribute('KPP_UBP'));
      aXmlED80.setAttribute('ADMIN_NAME', aXmlIK.getAttribute('NAME_UBP_PUBP'));
      WriteLog('Поиск референса администратора по ИНН и КПП', True);
      aXmlED80.setAttribute('ADMIN_ID', '');
      //поиск референса администратора
      if Trim(aXmlIK.getAttribute('INN_UBP')) <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(aXmlIK.getAttribute('INN_UBP'),
          aXmlIK.getAttribute('KPP_UBP'), '', '', False, aXmlED80);
        if not ((XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '10')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED80.getAttribute('BUDGET_ID'))) then
        begin
          WriteLog('Не удалось найти референс администратора по ИНН и КПП. Поиск' +
            ' референса администратора по ИНН, КПП и коду организации');
          //Exchange#2093
          XmlOrg := GetOrgByTaxKppBudgIdCode(aXmlIK.getAttribute('INN_UBP'),
            aXmlIK.getAttribute('KPP_UBP'), aXmlED80.getAttribute('BUDGET_ID'),
            aXmlIK.getAttribute('KOD_UBP_PUBP'), '10');
        end;
        if XmlOrg.documentElement.childNodes.Length = 1 then
        begin
          XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
          aXmlED80.setAttribute('ADMIN_ID', XmlOrg.getAttribute('ID'));
          WriteLog('Найден администратор с референсом: ' + XmlOrg.getAttribute('ID'));
          // определяем счет для администратора
          if aXmlIK.getAttribute('LS_UBP') = '' then
          begin
            WriteInfo('Не создан - не определен счет администратора');
            Result := False;
            Exit;
          end
          else begin
            // Exchange #2040
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED80.getAttribute('ADMIN_ID'),
              aXmlIK.getAttribute('LS_UBP'), '7', '1', True);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED80.setAttribute('ADMIN_ACCOUNT_ID', XmlAcc.getAttribute('ID'));
              //Заполняем данные по счету администратора
              aXmlED80.setAttribute('ADMIN_ACCOUNT', aXmlIK.getAttribute('LS_UBP'));
              aXmlED80.setAttribute('ADMIN_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED80.setAttribute('ADMIN_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              aXmlED80.setAttribute('ADMIN_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              aXmlED80.setAttribute('ADMIN_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
              aXmlED80.setAttribute('ADMIN_BIC', XmlAcc.getAttribute('INCBIC'));
              aXmlED80.setAttribute('ADMIN_B_NAME', XmlAcc.getAttribute('INCB_NAME'));
              aXmlED80.setAttribute('ADMIN_CORACCOUNT', XmlAcc.getAttribute('INCCORACCOUNT'));
            end
            else begin
              WriteInfo('Не создан - не определен референс счета администратора');
              Result := False;
              Exit;
            end;
          end;
        end
        else begin
          WriteInfo('Не создан - не определен референс администратора');
          Result := False;
          Exit;
        end;
      end
      else begin
        WriteInfo('Не создан - не определен референс администратора');
        Result := False;
        Exit;
      end;
      // блок ГАИФДБ
      WriteLog('Заполнение данных ГАИФДБ', True);
      aXmlED80.setAttribute('ORG_ID', '');
      WriteLog('Поиск референса ГАИФДБ по коду адм. подчиненности', True);
      XmlOrg := GetOrgByKadm(XmlOrg.getAttribute('KADM_CODE'), '14');
      if XmlOrg.documentElement.childNodes.Length = 1 then
      begin
        XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
        aXmlED80.setAttribute('ORG_ID', XmlOrg.getAttribute('ID'));
        aXmlED80.setAttribute('ORG_TAXCODE', XmlOrg.getAttribute('TAXCODE'));
        aXmlED80.setAttribute('ORG_KPP', XmlOrg.getAttribute('KPP'));
        aXmlED80.setAttribute('ORG_NAME', XmlOrg.getAttribute('DESCRIPTION'));
        aXmlED80.setAttribute('ORG_KADM_CODE', XmlOrg.getAttribute('KADM_CODE'));
        WriteLog('Найден ГАИФДБ с референсом: ' + XmlOrg.getAttribute('ID'));
      end
      else begin
        WriteInfo('Не создан - не определен референс ГАИФДБ');
        Result := False;
        Exit;
      end;
      // блок получателя
      WriteLog('Заполнение данных получателя', True);
      RecXml := aXmlZV.getElementsBytagName('ZVDOCPOL');
      if RecXml.Length = 0 then
      begin
        WriteInfo('Не создан - не найден блок с реквизитами получателя');
        Result := False;
        Exit;
      end
      else begin
        RecXml := RecXml.item[0];
        aXmlED80.setAttribute('REC_TAXCODE', RecXml.getAttribute('INN_POL'));
        aXmlED80.setAttribute('REC_KPP', RecXml.getAttribute('KPP_POL'));
        aXmlED80.setAttribute('REC_NAME', RecXml.getAttribute('NAME_POL'));
        aXmlED80.setAttribute('REC_ID', '');
        WriteLog('Поиск референса получателя по ИНН и КПП', True);
        if aXmlED80.getAttribute('REC_TAXCODE') <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(RecXml.getAttribute('INN_POL'),
            RecXml.getAttribute('KPP_POL'), '', '', False, aXmlED80);
          if XmlOrg.documentElement.childNodes.Length = 1 then
          begin
            XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
            aXmlED80.setAttribute('REC_ID', XmlOrg.getAttribute('ID'));
            WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ID'));
          end
          else
            WriteLog('Референс получателя не опеределен', True);
        end
        else
          WriteLog('Референс получателя не опеределен', True);
        // заполняем поля по счету блока получатель
        if RecXml.getAttribute('LS_POL') <> '' then
        begin
          aXmlED80.setAttribute('REC_ACCOUNT', RecXml.getAttribute('LS_POL'));
          if aXmlED80.getAttribute('REC_ID') <> '' then
          begin
            WriteLog('Поиск референса счета получателя', True);
            // Exchange #2040
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED80.getAttribute('REC_ID'),
              aXmlED80.getAttribute('REC_ACCOUNT'), '7, 9', '', True);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED80.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              aXmlED80.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED80.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              // Exchange #2040
              if (GetAccType(XmlAcc.getAttribute('ID')) = '9') or
                ((RecXml.getAttribute('BS_POL') <> '') and
                (RecXml.getAttribute('BS_POL') = XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'))) then
              begin
                aXmlED80.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                aXmlED80.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
              end
              else begin
                aXmlED80.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
                aXmlED80.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
              end;
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end
        else begin
          aXmlED80.setAttribute('REC_ACCOUNT', RecXml.getAttribute('BS_POL'));
          if aXmlED80.getAttribute('REC_ID') <> '' then
          begin
            WriteLog('Поиск референса счета получателя', True);
            XmlAcc := QueryXml(sqlAccByOrgId + ' and Account_Number = ? and OrgAccType_Id = 2',
              [aXmlED80.getAttribute('REC_ID'), aXmlED80.getAttribute('REC_ACCOUNT')]);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED80.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end;
        aXmlED80.setAttribute('REC_BIC', RecXml.getAttribute('BIC_BANK'));
        aXmlED80.setAttribute('REC_B_NAME', RecXml.getAttribute('NAME_BIC'));
        aXmlED80.setAttribute('REC_CORACCOUNT', RecXml.getAttribute('BS_KS_BANK'));
      end;
      //заполняем закладку "ответственные лица и чек"
      // exchange #2549
      // выборка ответственных лиц с флагом актуальности
      GetRespersonEx(aXmlED80.getAttribute('ADMIN_ID'),'-2' , Fio, Dolzhnost);
      aXmlED80.setAttribute('RESP_FIO_BOSS_STR', Fio);
      aXmlED80.setAttribute('RESP_POST_BOSS', Dolzhnost);
      // exchange #2549
      // выборка ответственных лиц с флагом актуальности
      GetRespersonEx(aXmlED80.getAttribute('ADMIN_ID'),'-3' , Fio, Dolzhnost);
      aXmlED80.setAttribute('RESP_FIO_BUH_STR', Fio);
      aXmlED80.setAttribute('RESP_POST_BUH', Dolzhnost);
      aXmlED80.setAttribute('RESP_SIG_DATE', aXmlED80.getAttribute('DOC_DATE'));
      //заполняем вкладку Документ-основание
      DocOsn := aXmlZV.getElementsBytagName('ZVDOCOSN');
      if DocOsn.Length <> 0 then
      begin
        DocOsn := DocOsn.item[0];
        aXmlED80.setAttribute('GROUND_DOC_KIND', DocOsn.getAttribute('VID_DO'));
        aXmlED80.setAttribute('GROUND_DOC_NUMBER', DocOsn.getAttribute('NOM_DO'));
        aXmlED80.setAttribute('GROUND_DOC_DATE', DocOsn.getAttribute('DATE_DO'));
        if aXmlED80.getAttribute('GROUND_DOC_DATE') <> '' then
          aXmlED80.setAttribute('GROUND_DOC_DATE',
            DateTimeToXml(StrToDate(aXmlED80.getAttribute('GROUND_DOC_DATE'))));
      end;
      //заполняем расшифровку
      aXmlZV := aXmlZV.childNodes.item[0];
      aXmlED80.setAttribute('COUNTERAGENT_ID', aXmlED80.getAttribute('REC_ID'));
      aXmlED80.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZV.getAttribute('SUM_R'), 0)]));
      aXmlED80.setAttribute('KADMI_CODE', aXmlZV.getAttribute('KADMI_CODE'));
      aXmlED80.setAttribute('KI_CODE', aXmlZV.getAttribute('KI_CODE'));
      // exchange #3062 - удален косгу
      // поле копируется при наличие
      CopyNodeAttributeEx( aXmlED80, 'KESI_CODE', aXmlZV, 'KESI_CODE');
      //aXmlED80.setAttribute('KESI_CODE', aXmlZV.getAttribute('KESI_CODE'));
      aXmlED80.setAttribute('KDI_CODE', aXmlZV.getAttribute('KDI_CODE'));
      aXmlED80.setAttribute('FSI_ID', aXmlZV.getAttribute('FSI_ID'));

      aXmlZV := aXmlZV.ownerDocument.documentElement;
      aXmlED80 := aXmlED80.ownerDocument;
      Result := True;

      except
        ExceptionProc( 'CreateDoc80');
    end;

end;

begin
end.
