//заполнение полей документа 39 класса
procedure CreateDoc39(aXmlSPRR, aXmlIK: Variant);
var
  i: Integer;
  XmlOrg, XmlAcc: Variant;
  xMsgLog: string;
  xErrors: boolean;
  xOrgID: string;
begin

    try
      WriteLog('Формирование документа ...', True);

      // Exchange #2335
      // поправлен текст в логе для разных классов документов
      if param_CreateDocuments215
        then xMsgLog := 'АЦК: "Справка по внебанковским операциям" № %s  Дата: %s'
        else xMsgLog := 'АЦК: "Справка по источникам" № %s  Дата: %s';
      WriteInfo( Format( xMsgLog,
                         [ aXmlSPRR.getAttribute('DOC_NUMBER'),
                           aXmlSPRR.getAttribute('DOC_DATE')]),
                 True);

      Doc := CreateOleObject('Microsoft.XmlDom');
      Doc := Doc.appendChild(aXmlSPRR.cloneNode(False));;
      Doc.setAttribute('action', 'insert');
    //  Doc.setAttribute('class', 39);
      SetClassDocument215( Doc, 39, 'aXmlIK');
      Doc.setAttribute('BUDGET_ID', aXmlSPRR.getAttribute('F_BUDGET_ID'));
      Doc.setAttribute('DOC_NUMBER', Trim(aXmlSPRR.getAttribute('DOC_NUMBER')));
      Doc.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlSPRR.getAttribute('DOC_DATE'))));
      // --- ФО/Гл. администратор ---
      Doc.setAttribute('ORG_TAXCODE', aXmlIK.getAttribute('INN_UBP'));
      Doc.setAttribute('ORG_KPP', aXmlIK.getAttribute('KPP_UBP'));
      Doc.setAttribute('ORG_NAME', aXmlIK.getAttribute('NAME_UBP_PUBP'));
      Doc.setAttribute('ORG_ACCOUNT', aXmlIK.getAttribute('LS_UBP'));
      WriteLog('Поиск референса ФО/Гл. администратор по ИНН и КПП', True);
      if Doc.getAttribute('ORG_TAXCODE') <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(Doc.getAttribute('ORG_TAXCODE'),
          Doc.getAttribute('ORG_KPP'), '', '', False, Doc);
        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'),
            Doc.getAttribute('BUDGET_ID'))) then
        begin
          WriteLog('Не удалось найти референс ФО/Гл. администратор по ИНН и КПП. Поиск' +
            ' референса ФО/Гл. администратор по ИНН, КПП и коду организации');
          //Exchange#2093
          XmlOrg := GetOrgByTaxKppBudgIdCode(Doc.getAttribute('ORG_TAXCODE'),
            Doc.getAttribute('ORG_KPP'), Doc.getAttribute('BUDGET_ID'),
            aXmlIK.getAttribute('KOD_UBP_PUBP'), '10');
        end;
        if XmlOrg.documentElement.childNodes.Length = 1 then
        begin
          XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
          Doc.setAttribute('ORG_ID', XmlOrg.getAttribute('ID'));
          WriteLog('Найден ФО/Гл. администратор с референсом: ' + XmlOrg.getAttribute('ID'));
          WriteLog('Поиск референса счета ФО/Гл. администратора', True);
          // определяем референс счета
          if Doc.getAttribute('ORG_ACCOUNT') <> '' then
          begin
            XmlAcc := GetAccAllRekByOrgIdAccNum(Doc.getAttribute('ORG_ID'),
              Doc.getAttribute('ORG_ACCOUNT'), '7', '1', True);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('ORG_ACCOUNT_ID', XmlAcc.getAttribute('ID'));
              Doc.setAttribute('ORG_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('ORG_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              Doc.setAttribute('ORG_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              Doc.setAttribute('ORG_CORACCOUNT', XmlAcc.getAttribute('INCCORACCOUNT'));
              Doc.setAttribute('ORG_BIC', XmlAcc.getAttribute('INCBIC'));
              Doc.setAttribute('ORG_B_NAME', XmlAcc.getAttribute('INCB_NAME'));
              Doc.setAttribute('ORG_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
              WriteLog('Найден счет ФО/Гл. администратора с референсом:' +
                Doc.getAttribute('ORG_ACCOUNT_ID'));
            end
            else
              WriteLog('Не найден референс счета ФО/Гл. администратора');
          end;
        end
        else
          WriteLog('Не найден референс ФО/Гл. администратора');
      end;
      Doc.setAttribute('COUNTERAGENT_ID', '');
      Doc.setAttribute('DESCRIPTION', 'Создано на основании Справки ф.0504833 №' +
        aXmlSPRR.getAttribute('NOM_SP') + ' от ' + aXmlSPRR.getAttribute('DOC_DATE'));
      //инициализация сумм в шапке
      Doc.setAttribute('AMOUNT', 0.00);
      Doc.setAttribute('OUT_AMT', 0.00);

      // exchange #3075 фт-1.2.2
      // сохраняем орг.ФО
      xOrgID := GetNodeAttributeEx( Doc, 'ORG_ID');

      //-------------------------------------------------------------------
      // строки ЭД
      Doc := Doc.appendChild(Doc.ownerDocument.createElement('LINES'));

      // exchange #3062
      // изменена проверка кбк
      // проверяются все строки на наличие ошибок, а не до первой.
      xErrors := FALSE;

      for i := 0 to aXmlSPRR.childNodes.Length - 1 do begin
        aXmlSPRR := aXmlSPRR.childNodes.Item[i];
        Doc := Doc.appendChild(Doc.ownerDocument.createElement('LINE'));
    
        //инициализация сумм в строке
        Doc.setAttribute('AMOUNT', 0.00);
        Doc.setAttribute('OUT_AMT', 0.00);
        if not VarIsNull(Doc.parentNode.parentNode.getAttribute('ORG_UFK_NAME')) then
          Doc.setAttribute('ORG_UFK_NAME', Doc.parentNode.parentNode.getAttribute('ORG_UFK_NAME'));
        Doc.setAttribute('COUNTERAGENT_ID', '');

        // exchange #3062
        if NOT CheckKBK_Line_SPRR( Doc, aXmlSPRR, BudgetId, '', xOrgID)
          then xErrors := TRUE;
        {
        Doc.setAttribute('KBK', aXmlSPRR.getAttribute('KBK'));
        Doc.setAttribute('TYPE_KBK', aXmlSPRR.getAttribute('TYPE_KBK'));
        //проверка существования кода в АЦК
        if CheckKBK(Doc, 'KBK', BudgetId) then
        begin
          WriteInfo('Не создан - найдены КБК в файле, которые отсутствуют в базе АЦК.');
          Exit;
        end;
        }

        //принудительно проставляем КИФ-по постановке
        Doc.setAttribute('FSI_ID', 1);

        // не проверяем на наличие атрибута, т.к если попали сюда, то он есть
        if StrToBool(aXmlSPRR.getAttribute('F_DEBET')) then
        begin
          Doc.setAttribute('OUT_AMT', aXmlSPRR.getAttribute('SUM'));
          //Exchange #2389
          Exch2389_Update_PURPOSEFULGRANT_ID_Ex(  //Doc.parentNode.parentNode,
                                Doc,
                                Doc.GetAttribute('TYPE_KBK'),
                                Doc.parentNode.parentNode.GetAttribute('BUDGET_ID'),
                                //BudgetId,
                                'PURPOSEFULGRANT_ID',
                                aXmlSPRR,
                                'ADD_KLASS',
                                Doc.parentNode.parentNode.getAttribute('class'),
                                '');  // для источников тип дохода не указывается
    {
          //Exchange #2240
          if (not VarIsNull(aXmlSPRR.getAttribute('ADD_KLASS')))
            and (not VarIsNull(Doc.parentNode.parentNode.getAttribute('BUDGET_ID'))) then
             Doc.setAttribute('PURPOSEFULGRANT_ID',
              GetPurposeFulgrantId(Doc.parentNode.parentNode.getAttribute('BUDGET_ID'),
                aXmlSPRR.getAttribute('ADD_KLASS')));
    }
        end
        else begin
          Doc.setAttribute('AMOUNT', aXmlSPRR.getAttribute('SUM'));
          //Exchange #2240
          //Exchange #2389
          Exch2389_Update_PURPOSEFULGRANT_ID_Ex(  //Doc.parentNode.parentNode,
                                Doc,
                                Doc.GetAttribute('TYPE_KBK'),
                                Doc.parentNode.parentNode.GetAttribute('BUDGET_ID'),
                                //BudgetId,
                                'PURPOSEFULGRANT_ID',
                                aXmlSPRR,
                                'ADD_KLASS_RCP',
                                Doc.parentNode.parentNode.getAttribute('class'),
                                '');  // для источников тип дохода не указывается
    {
          if (not VarIsNull(aXmlSPRR.getAttribute('ADD_KLASS_RCP')))
            and (not VarIsNull(Doc.parentNode.parentNode.getAttribute('BUDGET_ID'))) then
             Doc.setAttribute('PURPOSEFULGRANT_ID',
              GetPurposeFulgrantId(Doc.parentNode.parentNode.getAttribute('BUDGET_ID'),
                aXmlSPRR.getAttribute('ADD_KLASS_RCP')));
    }
        end;

        // прочие поля для документа 215
        if NOT UpdateFieldsForDocClass215( Doc, aXmlSPRR, 39)
          then EXIT;

        Doc.setAttribute('DESCRIPTION', Doc.parentNode.parentNode.getAttribute('DESCRIPTION'));
        Doc.parentNode.parentNode.setAttribute('AMOUNT',
          Doc.parentNode.parentNode.getAttribute('AMOUNT') + StrToCurr(Doc.getAttribute('AMOUNT')));
        Doc.parentNode.parentNode.setAttribute('OUT_AMT',
          Doc.parentNode.parentNode.getAttribute('OUT_AMT') + StrToCurr(Doc.getAttribute('OUT_AMT')));
        Doc.setAttribute('DESCRIPTION_LINES', aXmlSPRR.getAttribute('NAME_OPER'));
        Doc := Doc.parentNode;
        aXmlSPRR := aXmlSPRR.parentNode;
    
      end;//for//

      Doc.parentNode.setAttribute('AMOUNT',
        Format('%.2f', [StrToCurr(Doc.parentNode.getAttribute('AMOUNT'))]));
      Doc.parentNode.setAttribute('OUT_AMT',
        Format('%.2f', [StrToCurr(Doc.parentNode.getAttribute('OUT_AMT'))]));


      // exchange #3062
      if xErrors then begin
        WriteInfo('Не создан - найдены КБК в файле, которые отсутствуют в базе АЦК.');
        EXIT;
      end;

      Doc := Doc.ownerDocument.documentElement;
      //Вставка и обработка. Не проверяем на повторную загрузку. приветище АО.
      Exec_ChildDoc(Doc.getAttribute('BUDGET_ID'), '', Doc);
      aXmlSPRR := null;
      except
        ExceptionProc( 'CreateDoc39');
    end;

end;

begin
end.
