//создает документ 75 класса на основе данных блока ZS
function CreateDoc75ZS(aXmlED75, aXmlZS, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost: String;
  XmlOrg, XmlAcc, Permission, Kbk: Variant;
  xBudgetID: string;
begin

    try
      Result := False;

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

      // exchange #3062 - перенос проверки строк ZRST в создание эд
      // проверка выполняется уже после того, как в логе указано
      // какой эд создается.
      if NOT CheckKBK_All_ZSCH2( aXmlZS, 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'))));
      aXmlED75.setAttribute('QUEUE_KIND', GetQueueKind);
      //Exchange#2239
      if aXmlED75.getAttribute('QUEUE_KIND') = '=' then
        aXmlED75.setAttribute('QUEUE_KIND', '6');
      aXmlED75.setAttribute('LIMITING_DATE', aXmlZS.getAttribute('DATE_LIM'));
      if aXmlED75.getAttribute('LIMITING_DATE') <> '' then
        aXmlED75.setAttribute('LIMITING_DATE',
          DateTimeToXml(StrToDate(aXmlED75.getAttribute('LIMITING_DATE'))));
      aXmlED75.setAttribute('EXTSTATUS_ID', 0);
      aXmlED75.setAttribute('FK_FLAG', 1);
      aXmlED75.setAttribute('AMOUNT', 0);
      aXmlED75.setAttribute('ADVANCE_PAYMENT', 0);
      aXmlED75.setAttribute('CASH_INCOME', 1);
      aXmlED75.setAttribute('SYMBCASH_ID',aXmlZS.childNodes.Item[0].getAttribute('CHECK_KAS'));
      // определяем плательщика
      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('ORGACCOUNT_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);
      WriteLog('Поиск референса получателя и референса счета получателя', True);
      //поиск референса получателя
      XmlOrg := GetOrgByCashAcc(aXmlED75.getAttribute('PAY_ACC_ID'));
      if XmlOrg.documentElement.childNodes.Length = 0 then
      begin
        WriteInfo('Не создан - не заполнен "Счет для наличных" в карточке счета для финансирования');
        Result := False;
        Exit;
      end
      else begin
        XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
        aXmlED75.setAttribute('REC_TAXCODE', XmlOrg.getAttribute('TAXCODE'));
        aXmlED75.setAttribute('REC_KPP', XmlOrg.getAttribute('KPP'));
        aXmlED75.setAttribute('REC_NAME', XmlOrg.getAttribute('ORG_DESCRIPTION'));
        aXmlED75.setAttribute('REC_ID', XmlOrg.getAttribute('ORG_ID'));
        WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ORG_ID'));
        // заполняем поля по счету блока расходования
        aXmlED75.setAttribute('REC_ACCOUNT', XmlOrg.getAttribute('ACCOUNT_NUMBER'));
        aXmlED75.setAttribute('REC_ACC_ID', XmlOrg.getAttribute('ACCOUNT_ID'));
        aXmlED75.setAttribute('REC_BIC', XmlOrg.getAttribute('BIC'));
        aXmlED75.setAttribute('REC_B_NAME', XmlOrg.getAttribute('BANK_DESCRIPTION'));
        aXmlED75.setAttribute('REC_CORACCOUNT', XmlOrg.getAttribute('CORACCOUNT'));
        WriteLog('Найден счет получателя с референсом: ' + XmlOrg.getAttribute('ACCOUNT_ID'));
      end;
      //заполняем закладку "ответственные лица и чек"
      // 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'));
      // заполнение реквизитов чека - из первого блока ZSCH1
      aXmlED75.setAttribute('CHEQUE_NUM', aXmlZS.childNodes.item[0].getAttribute('CHECK_NOM'));
      aXmlED75.setAttribute('CHEQUE_SER', aXmlZS.childNodes.item[0].getAttribute('CHECK_SER'));
      aXmlED75.setAttribute('CHEQUE_DATE', aXmlZS.childNodes.item[0].getAttribute('DATE_CHECK'));
      if aXmlED75.getAttribute('CHEQUE_DATE') <> '' then
        aXmlED75.setAttribute('CHEQUE_DATE',
          DateTimeToXml(StrToDate(aXmlED75.getAttribute('CHEQUE_DATE'))));
      aXmlED75.setAttribute('CHEQUE_ENDURANCE_DATE', aXmlZS.childNodes.item[0].getAttribute('DATE_CHECK_LIM'));
      if aXmlED75.getAttribute('CHEQUE_ENDURANCE_DATE') <> '' then
        aXmlED75.setAttribute('CHEQUE_ENDURANCE_DATE',
          DateTimeToXml(StrToDate(aXmlED75.getAttribute('CHEQUE_ENDURANCE_DATE'))));
      aXmlED75.setAttribute('CODE_GRBS', aXmlZS.selectSingleNode('ZSCH2').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'),
        aXmlZS.selectSingleNode('ZSCH2').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;
      //заполнение строк документа
      aXmlED75 := aXmlED75.appendChild(aXmlED75.ownerDocument.createElement('LINES'));
      for i := 0 to aXmlZS.ChildNodes.Length - 1 do
      begin
        aXmlZS := aXmlZS.ChildNodes.Item[i];
        if aXmlZS.NodeName = 'ZSCH2' then
        begin
          aXmlZS.setAttribute('KOD_IST_KBK', aXmlZS.getAttribute('KOD_IST'));
          //ищем разрешение для данной строки
          Permission := GetPermissionDoh(aXmlED75.parentNode, aXmlZS, True);
          if VarIsNull(Permission) then
          begin
            WriteInfo('Не создан - не определено разрешение на открытие лс');
            aXmlZS := aXmlZS.parentNode.parentNode;
            Exit;
          end;
          aXmlED75 := aXmlED75.appendChild(aXmlED75.ownerDocument.createElement('LINE'));
          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(aXmlZS.getAttribute('SUMR_KBK'), 0)]));
          aXmlED75.setAttribute('FK_FLAG', aXmlED75.parentNode.parentNode.getAttribute('FK_FLAG'));
          aXmlED75.setAttribute('LIMITING_DATE', aXmlED75.parentNode.parentNode.getAttribute('LIMITING_DATE'));
          aXmlED75.setAttribute('CHEQUE_NUM', aXmlED75.parentNode.parentNode.getAttribute('CHEQUE_NUM'));
          aXmlED75.setAttribute('CHEQUE_SER', aXmlED75.parentNode.parentNode.getAttribute('CHEQUE_SER'));
          aXmlED75.setAttribute('CHEQUE_DATE', aXmlED75.parentNode.parentNode.getAttribute('CHEQUE_DATE'));
          aXmlED75.setAttribute('CHEQUE_ENDURANCE_DATE', aXmlED75.parentNode.parentNode.getAttribute('CHEQUE_ENDURANCE_DATE'));
          //АЦК не проставляет ID счета УФК в однострочных доках
          aXmlED75.setAttribute('PAY_UFK_ACC_ID', aXmlED75.parentNode.parentNode.getAttribute('PAY_UFK_ACC_ID'));
          aXmlED75.setAttribute('DESCRIPTION_LINES', aXmlZS.getAttribute('PURPOSE'));
          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', aXmlZS, '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', aXmlZS.getAttribute('KADMD_CODE'));
          aXmlED75.setAttribute('KD_CODE', aXmlZS.getAttribute('KD_CODE'));
          // exchange #3062 - удален косгу
          // поле копируется при наличии
          CopyNodeAttributeEx( aXmlED75, 'KESD_CODE', aXmlZS, 'KESD_CODE');
  //        aXmlED75.setAttribute('KESD_CODE', aXmlZS.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'));
          aXmlED75 := aXmlED75.parentNode;
        end;
        aXmlZS := aXmlZS.parentNode;
      end;

      aXmlZS := aXmlZS.ownerDocument.documentElement;
      aXmlED75 := aXmlED75.ownerDocument;
      Result := True;
      except
        ExceptionProc( 'CreateDoc75ZS');
    end;

end;

begin
end.
