//создает документ 75 класса на основе данных файла IK
function CreateDoc75ZV(aXmlED75, aXmlZV, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost: String;
  XmlOrg, XmlAcc, Permission, RecXml, DocOsn, ZvDoc, Kbk: Variant;
  xBudgetID: string;
begin

    try
      Result := False;

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

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

      aXmlED75.setAttribute('action', 'insert');
      aXmlED75.setAttribute('BUDGET_ID', xBudgetID);//aXmlED75.getAttribute('F_BUDGET_ID'));
      aXmlED75.setAttribute('GUID_FK', aXmlED75.getAttribute('FOREIGN_KEY'));
      aXmlED75.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlED75.getAttribute('DOC_DATE'))));
      if aXmlZV.childNodes.item[0].getAttribute('SEQ') <> '0' then
        aXmlED75.setAttribute('QUEUE_KIND', aXmlZV.childNodes.item[0].getAttribute('SEQ'))
      else
        aXmlED75.setAttribute('QUEUE_KIND', GetQueueKind);
      //Exchange#2239
      if aXmlED75.getAttribute('QUEUE_KIND') = '=' then
        aXmlED75.setAttribute('QUEUE_KIND', '6');
      aXmlED75.setAttribute('EXTSTATUS_ID', 0);
      aXmlED75.setAttribute('AMOUNT', 0);
      aXmlED75.setAttribute('PAYKIND', PayKindSetAsAzk(aXmlZV.childNodes.item[0].getAttribute('VID_PL')));
      aXmlED75.setAttribute('DESCRIPTION', aXmlZV.childNodes.item[0].getAttribute('NAZN_PL'));
      aXmlED75.setAttribute('LIMITING_DATE', aXmlED75.getAttribute('DOC_DATE'));
      aXmlED75.setAttribute('ADVANCE_PAYMENT', 0);
      // определяем плательщика
      WriteLog('Заполнение данных плательщика', True);
      aXmlED75.setAttribute('PAY_TAXCODE', aXmlIK.getAttribute('INN_UBP'));
      aXmlED75.setAttribute('PAY_KPP', aXmlIK.getAttribute('KPP_UBP'));
      aXmlED75.setAttribute('PAY_NAME', aXmlIK.getAttribute('NAME_UBP_PUBP'));
      WriteLog('Поиск референса плательщика по ИНН и КПП', True);
      aXmlED75.setAttribute('PAY_ID', '');
      //поиск референса плательщика
      if Trim(aXmlIK.getAttribute('INN_UBP')) <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(aXmlIK.getAttribute('INN_UBP'),
          aXmlIK.getAttribute('KPP_UBP'), '', '', False, aXmlED75);
        if not ((XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '0')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED75.getAttribute('BUDGET_ID'))) then
        begin
          WriteLog('Не удалось найти референс плательщика по ИНН и КПП. Поиск' +
            ' референса плательщика по ИНН, КПП и коду организации');
          //Exchange#2093
          XmlOrg := GetOrgByTaxKppBudgIdCode(aXmlIK.getAttribute('INN_UBP'),
            aXmlIK.getAttribute('KPP_UBP'), aXmlED75.getAttribute('BUDGET_ID'),
            aXmlIK.getAttribute('KOD_UBP_PUBP'), '0');
        end;
        if XmlOrg.documentElement.childNodes.Length = 1 then
        begin
          XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
          aXmlED75.setAttribute('PAY_ID', XmlOrg.getAttribute('ID'));
          //чтобы не ломать общий поиск разрешения, записываем референс в шапку
          aXmlED75.setAttribute('ORG_ID', aXmlED75.getAttribute('PAY_ID'));
          WriteLog('Найден плательщик с референсом: ' + XmlOrg.getAttribute('ID'));
          // определяем счет для плательщика
          if aXmlIK.getAttribute('LS_UBP') = '' then
          begin
            WriteInfo('Не создан - не определен счет плательщика');
            Result := False;
            Exit;
          end
          else begin
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED75.getAttribute('PAY_ID'),
              aXmlIK.getAttribute('LS_UBP'), '5', '0');
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED75.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
              //Заполняем данные по счету плательщика
              aXmlED75.setAttribute('PAY_ACCOUNT', aXmlIK.getAttribute('LS_UBP'));
              //чтобы не ломать общий поиск разрешения, записываем референс в шапку
              aXmlED75.setAttribute('ORGACCOUNT_ID',aXmlED75.getAttribute('PAY_ACC_ID'));
              aXmlED75.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED75.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              aXmlED75.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('SPECUFK_ACCOUNT_NUMBER'));
              aXmlED75.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('SPECUFK_ACC_ID'));
              aXmlED75.setAttribute('PAY_BIC', XmlAcc.getAttribute('SPECBIC'));
              aXmlED75.setAttribute('PAY_B_NAME', XmlAcc.getAttribute('SPECB_NAME'));
              aXmlED75.setAttribute('PAY_CORACCOUNT', XmlAcc.getAttribute('SPECCORACCOUNT'));
              // определяем бланк расходов
              aXmlED75.setAttribute('ESTIMATE_ID', GetEstimateIdSs(aXmlED75.getAttribute('BUDGET_ID'),
                aXmlED75.getAttribute('PAY_ID'), aXmlED75.getAttribute('PAY_ACC_ID')));
              if aXmlED75.getAttribute('ESTIMATE_ID') = '' then begin
                WriteInfo('Не создан - не определен бланк расходов плательщика');
                Result := False;
                Exit;
              end;
            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);
      RecXml := aXmlZV.getElementsBytagName('ZVDOCPOL');
      if RecXml.Length = 0 then
      begin
        WriteInfo('Не создан - не найден блок с реквизитами получателя');
        Result := False;
        Exit;
      end
      else begin
        RecXml := RecXml.item[0];
        aXmlED75.setAttribute('REC_TAXCODE', RecXml.getAttribute('INN_POL'));
        aXmlED75.setAttribute('REC_KPP', RecXml.getAttribute('KPP_POL'));
        aXmlED75.setAttribute('REC_NAME', RecXml.getAttribute('NAME_POL'));
        aXmlED75.setAttribute('REC_ID', '');
        WriteLog('Поиск референса получателя по ИНН и КПП', True);
        aXmlED75.setAttribute('REC_ID', '');
        if aXmlED75.getAttribute('REC_TAXCODE') <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(RecXml.getAttribute('INN_POL'),
            RecXml.getAttribute('KPP_POL'), '', '', False, aXmlED75);
          if (XmlOrg.documentElement.childNodes.Length = 1) and
            IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
              aXmlED75.getAttribute('BUDGET_ID')) then
          begin
            XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
            aXmlED75.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
          aXmlED75.setAttribute('REC_ACCOUNT', RecXml.getAttribute('LS_POL'));
          if aXmlED75.getAttribute('REC_ID') <> '' then
          begin
            WriteLog('Поиск референса счета получателя', True);
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED75.getAttribute('REC_ID'),
              aXmlED75.getAttribute('REC_ACCOUNT'), '5, 9');
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED75.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              aXmlED75.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED75.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              aXmlED75.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              aXmlED75.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end
        else begin
          aXmlED75.setAttribute('REC_ACCOUNT', RecXml.getAttribute('BS_POL'));
          if aXmlED75.getAttribute('REC_ID') <> '' then
          begin
            WriteLog('Поиск референса счета получателя', True);
            XmlAcc := QueryXml(sqlAccByOrgId + ' and Account_Number = ? and OrgAccType_Id in (2, 3)',
              [aXmlED75.getAttribute('REC_ID'), aXmlED75.getAttribute('REC_ACCOUNT')]);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED75.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end;
        aXmlED75.setAttribute('REC_BIC', RecXml.getAttribute('BIC_BANK'));
        aXmlED75.setAttribute('REC_B_NAME', RecXml.getAttribute('NAME_BIC'));
        aXmlED75.setAttribute('REC_CORACCOUNT', RecXml.getAttribute('BS_KS_BANK'));
        //заполняем закладку "ответственные лица и чек"
        // exchange #2549
        // выборка ответственных лиц с флагом актуальности
        GetRespersonEx(aXmlED75.getAttribute('PAY_ID'),'-2' , Fio, Dolzhnost);
        aXmlED75.setAttribute('BOSS_FIO', Fio);
        aXmlED75.setAttribute('BOSS_POST', Dolzhnost);
        // exchange #2549
        // выборка ответственных лиц с флагом актуальности
        GetRespersonEx(aXmlED75.getAttribute('PAY_ID'),'-3' , Fio, Dolzhnost);
        aXmlED75.setAttribute('BUHGALT_FIO', Fio);
        aXmlED75.setAttribute('BUHGALT_POST', Dolzhnost);
        aXmlED75.setAttribute('SIGN_DATE', aXmlED75.getAttribute('DOC_DATE'));
        //заполняем вкладку Документ-основание
        DocOsn := aXmlZV.getElementsBytagName('ZVDOCOSN');
        if DocOsn.Length <> 0 then
        begin
          DocOsn := DocOsn.item[0];
          aXmlED75 := aXmlED75.appendChild(aXmlED75.ownerDocument.createElement('GROUND_DOC')).
            appendChild(aXmlED75.ownerDocument.createElement('GROUND_DOC'));
          aXmlED75.setAttribute('KIND', DocOsn.getAttribute('VID_DO'));
          aXmlED75.setAttribute('DOC_NUMBER', DocOsn.getAttribute('NOM_DO'));
          aXmlED75.setAttribute('DOC_DATE', DocOsn.getAttribute('DATE_DO'));
          if aXmlED75.getAttribute('DOC_DATE') <> '' then
            aXmlED75.setAttribute('DOC_DATE',
              DateTimeToXml(StrToDate(aXmlED75.getAttribute('DOC_DATE'))));
          aXmlED75 := aXmlED75.ownerDocument.documentElement;
        end;
        aXmlED75.setAttribute('CODE_GRBS', aXmlZV.childNodes.item[0].getAttribute('KADMD_CODE'));
        aXmlED75.setAttribute('ORG_GRBS', '');
        Kbk := QueryXml('Select Kl.* From Kadm_lines Kl Left Join kadm K on K.Id = Kl.master_id' +
          ' Where Kl.Budget_Id = ? and K.Code = ? order by Kl.Begin_Date desc', [aXmlED75.getAttribute('BUDGET_ID'),
          aXmlZV.childNodes.item[0].getAttribute('KADMD_CODE')]);
        Kbk := Kbk.ChildNodes.Item[0];
        if Kbk.ChildNodes.Length = 1 then
          aXmlED75.setAttribute('ORG_GRBS', Kbk.ChildNodes.item[0].getAttribute('DESCRIPTION'))
        else begin
          for i := 0 to Kbk.ChildNodes.Length -1 do
          begin
            Kbk := Kbk.ChildNodes.item[i];
            if Kbk.getAttribute('END_DATE') = '' then
              aXmlED75.setAttribute('ORG_GRBS', Kbk.getAttribute('DESCRIPTION'))
            else if (Work_Date >= XmlToDateTime(Kbk.getAttribute('BEGIN_DATE'))) and
              (Work_Date <= XmlToDateTime(Kbk.getAttribute('END_DATE'))) then
              aXmlED75.setAttribute('ORG_GRBS', Kbk.getAttribute('DESCRIPTION'));
            Kbk := Kbk.parentNode;
          end;
          if aXmlED75.getAttribute('ORG_GRBS') = '' then
            aXmlED75.setAttribute('ORG_GRBS', Kbk.selectSingleNode('ROW').getAttribute('DESCRIPTION'));
        end;
        // АЦК не позволяет создавать многострочные документы по счету ФК
        ZvDoc := aXmlZV.getElementsBytagName('ZVDOC');
        if ZvDoc.Length > 1 then
        begin
          WriteInfo('Не создан - Формирование многострочных заявок с типом счета' +
            ' плательщика "Лицевой счет в ФК" невозможно');
          Result := False;
          Exit;
        end
        else begin
          //заполнение строк документа
          aXmlZV := aXmlZV.ChildNodes.Item[0];
            //ищем разрешение для данной строки
          Permission := GetPermissionDoh(aXmlED75, aXmlZV);
            if VarIsNull(Permission) then
            begin
              WriteInfo('Не создан - не определено разрешение на открытие лс');
              aXmlZV := aXmlZV.parentNode.parentNode;
              Exit;
            end;
            aXmlED75.setAttribute('FUNDSOURCE_ID',  Permission.getAttribute('FUNDSOURCE_ID'));
            aXmlED75.setAttribute('RECIPIENT_ID', Permission.getAttribute('RECIPIENT_ID'));
            aXmlED75.setAttribute('ESTIMATE_ID', Permission.getAttribute('ESTIMATE_ID'));
            aXmlED75.setAttribute('RECEIVER_ID', Permission.getAttribute('RECEIVER_ID'));
            aXmlED75.setAttribute('PAYER_ID', Permission.getAttribute('PAYER_ID'));
            aXmlED75.setAttribute('TERRITORY_ID', Permission.getAttribute('TERRITORY_ID'));
            aXmlED75.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZV.getAttribute('SUM_R'), 0)]));
            aXmlED75.setAttribute('PERMISSIONLINE_ID', Permission.getAttribute('PERMISSIONLINE_ID'));
            aXmlED75.setAttribute('KFSR_CODE', Permission.getAttribute('KFSR_CODE'));
            aXmlED75.setAttribute('KCSR_CODE', Permission.getAttribute('KCSR_CODE'));
            aXmlED75.setAttribute('KVR_CODE', Permission.getAttribute('KVR_CODE'));
            // exchange #3062 - удален косгу
            // поле копируется при наличии
            CopyNodeAttributeEx( aXmlED75, 'KESR_CODE', aXmlZV, 'KESR_CODE');
  //          aXmlED75.setAttribute('KESR_CODE', Permission.getAttribute('KESR_CODE'));
            aXmlED75.setAttribute('KADMR_CODE', Permission.getAttribute('KADMR_CODE'));
            aXmlED75.setAttribute('KDR_CODE', Permission.getAttribute('KDR_CODE'));
            aXmlED75.setAttribute('KDE_CODE', Permission.getAttribute('KDE_CODE'));
            aXmlED75.setAttribute('KDF_CODE', Permission.getAttribute('KDF_CODE'));
            aXmlED75.setAttribute('FSR_ID', Permission.getAttribute('FSR_ID'));
            aXmlED75.setAttribute('KADMD_CODE', aXmlZV.getAttribute('KADMD_CODE'));
            aXmlED75.setAttribute('KD_CODE', aXmlZV.getAttribute('KD_CODE'));
            // exchange #3062 - удален косгу
            // поле копируется при наличии
            CopyNodeAttributeEx( aXmlED75, 'KESD_CODE', aXmlZV, 'KESD_CODE');
  //          aXmlED75.setAttribute('KESD_CODE', aXmlZV.getAttribute('KESD_CODE'));
            aXmlED75.setAttribute('KDD_CODE', Permission.getAttribute('KDD_CODE'));
            aXmlED75.setAttribute('KDT_CODE', Permission.getAttribute('KDT_CODE'));
            aXmlED75.setAttribute('FSD_ID', Permission.getAttribute('FSD_ID'));
        end;
      end;

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

      except
        ExceptionProc( 'CreateDoc75ZV');
    end;

end;


begin
end.
