//заполнение полей документа 40 класса
procedure CreateDoc40(aXmlSPRR, aXmlIK: Variant);
var
  i: Integer;
  XmlOrg, Line: Variant;
  Est_Kind: String;
  xMsgLog: string;
  xErrors: boolean;
  xOrgID: string;
  xFound: boolean;
  xXmlDocLine: variant;
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', 40);
      SetClassDocument215( Doc, 40, 'aXmlIK');
      Doc.setAttribute('BUDGET_ID', Doc.getAttribute('F_BUDGET_ID'));
      Doc.setAttribute('DOC_NUMBER', Trim(aXmlSPRR.getAttribute('DOC_NUMBER')));
      Doc.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlSPRR.getAttribute('DOC_DATE'))));

      // бюджетополучатель
      WriteLog('Поиск референса бюджетополучателя по ИНН и КПП', True);
      if aXmlIK.getAttribute('INN_UBP') = '' then begin
        WriteInfo('Не создан - не определен референс бюджетополучателя');
        Exit;
      end;

      XmlOrg := GetOrgByTaxKpp( aXmlIK.getAttribute('INN_UBP'),
                                aXmlIK.getAttribute('KPP_UBP'),
                                '',
                                '',
                                False,
                                Doc);
      xFound := (XmlOrg.documentElement.childNodes.Length = 1);
      if xFound then begin
        xOrgID := XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID');
        if NOT HasOrgRole( xOrgID, '0')
          then xFound := FALSE
          else
            if NOT IsActual( xOrgID, Doc.getAttribute('BUDGET_ID'))
              then xFound := FALSE;
      end;
      {
      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'),
                        Doc.getAttribute('BUDGET_ID'))) then}
      if NOT xFound then begin
        WriteLog('Не удалось найти референс бюджетополучателя по ИНН и КПП. Поиск' +
          ' референса бюджетополучателя по ИНН, КПП и коду организации');
        //Exchange#2093
        XmlOrg := GetOrgByTaxKppBudgIdCode( aXmlIK.getAttribute('INN_UBP'),
                                            aXmlIK.getAttribute('KPP_UBP'),
                                            Doc.getAttribute('BUDGET_ID'),
                                            aXmlIK.getAttribute('KOD_UBP_PUBP'),
                                            '0');
      end;

      if XmlOrg.documentElement.childNodes.Length <> 1 then begin
        WriteInfo('Не создан - не определен референс бюджетополучателя');
        Exit;
      end;

      XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
      // exchange #3075 фт-1.2.2
      // сохраняем орг. = владелец бланка расходов.
      // в дальнейшем вместо обращения к атрибуту будем ссылаться на переменную.
      // это унифицирует код и требуется для проверки кбк
      xOrgID := XmlOrg.getAttribute('ID');
      Doc.setAttribute('RECIPIENT_ID', xOrgID);//XmlOrg.getAttribute('ID'));
      WriteLog(
          FORMAT( 'Найден бюджетополучатель с референсом: %s',// + XmlOrg.getAttribute('ID'));
                  [ xOrgID]));

      // определяем счет для финансирования
      if aXmlIK.getAttribute('LS_UBP') = '' then begin
        WriteInfo('Не создан - не определен счет для финансирования');
        Exit;
      end;

      Doc.setAttribute( 'ORGACCOUNT_ID',
                        GetLicAcc( xOrgID,//Doc.getAttribute('RECIPIENT_ID'),
                                   '5',
                                   aXmlIK.getAttribute('LS_UBP')));
      if Doc.getAttribute('ORGACCOUNT_ID') = '' then begin
        WriteInfo('Не создан - не определен референс счета бюджетополучателя');
        Exit;
      end;

//      Line := aXmlSPRR.childNodes.Item[0];
      // exchange #3062 - изменена проверка кбк в строке SPRR
      // exchange #3075 - фт-1.2.2
      // здесь нужно создать временный узел, в котором будет описание строки
      // после проверки кбк. это требуется, поскольку проверка строк будет
      // ниже и там будут созданы узлы строк в ЭД 40, а здесь требуется
      // найти БР (см.ниже), а для него нужны кбк из первой строки.
      xXmlDocLine := Doc.ownerDocument.createElement('LINE');
      if NOT CheckKBK_Line_SPRR( xXmlDocLine,
                                 aXmlSPRR.childNodes.Item[0],
                                 BudgetId,
                                 '',
                                 xOrgID) then begin
      // {Doc.getAttribute('RECIPIENT_ID')}) then begin
//              if CheckKBK(Line, 'KBK', BudgetId) then begin
        WriteInfo('Не создан - найдены КБК в файле, которые отсутствуют в базе АЦК.');
        Exit;
      end;

      // определяем бланк расходов
      // exchange #3062 - удален косгу при поиске в рчб
      Doc.setAttribute( 'ESTIMATE_ID',
                        GetEstimateId_3062(
                                  Doc.getAttribute('BUDGET_ID'),
                                  xOrgID,//Doc.getAttribute('RECIPIENT_ID'),
                                  Doc.getAttribute('ORGACCOUNT_ID'),
                                  xXmlDocLine));
      if Doc.getAttribute('ESTIMATE_ID') = '' then begin
        WriteInfo('Не создан - не определен бланк расходов плательщика');
        Exit;
      end;

      Doc.setAttribute(
              'DESCRIPTION',
              FORMAT( 'Создано на основании Справки ф.0504833 №%s от %s',
                      [ aXmlSPRR.getAttribute('NOM_SP'),
                        aXmlSPRR.getAttribute('DOC_DATE')]));

      //Определяем тип бланка расходов
      Est_Kind := 'EST_KIND'
                   + QueryField( 'Select EstKind_Id From Estimate Where Id = ?',
                                 [ Doc.getAttribute('ESTIMATE_ID')],
                                 'ESTKIND_ID');
      Doc.setAttribute('EST_KIND', Est_Kind);

      //инициализация сумм
      Doc.setAttribute('AMOUNT', 0.00);

      //-------------------------------------------------------------------
      // строки ЭД
      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('DOCUMENTCLASS_ID', Doc.parentNode.parentNode.getAttribute('class'));
        Doc.setAttribute('RECIPIENT_ID', Doc.parentNode.parentNode.getAttribute('RECIPIENT_ID'));
        Doc.setAttribute('ORGACCOUNT_ID', Doc.parentNode.parentNode.getAttribute('ORGACCOUNT_ID'));
        Doc.setAttribute('ESTIMATE_ID', Doc.parentNode.parentNode.getAttribute('ESTIMATE_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('FSR_ID', Copy(aXmlSPRR.getAttribute('KREDIT'), 18, 1));
        // не проверяем на наличие атрибута, т.к если попали сюда, то он есть
        if StrToBool(aXmlSPRR.getAttribute('F_DEBET')) then
        begin
          Doc.setAttribute('AMOUNT', abs(aXmlSPRR.getAttribute('SUM')));
          //Exchange #2389
          Exch2389_Update_PURPOSEFULGRANT_ID_Ex(
                    //Doc.parentNode.parentNode,
                    Doc,
                    Doc.GetAttribute('TYPE_KBK'),
                    Doc.parentNode.parentNode.GetAttribute('BUDGET_ID'),
                    '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', 0 - abs(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_RCP',
                    Doc.parentNode.parentNode.getAttribute('class'),
                    '');  // для расходов тип дохода не указывается
    {
          //Exchange #2240
          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;
        Doc.parentNode.parentNode.setAttribute('AMOUNT',
          Doc.parentNode.parentNode.getAttribute('AMOUNT') + StrToCurr(Doc.getAttribute('AMOUNT')));
        if (Doc.getAttribute('PURPOSEFULGRANT_ID') = '') and
          (isPurposeFulgrantAutoFill('40', Est_Kind)) then
          Doc.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(Doc,
            Doc.parentNode.parentNode.getAttribute('BUDGET_ID')));
        Doc.setAttribute('DIRECTION_ID', '');

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

        //1-Контролировать, 0-нет, 2-запрещать
        if isDirectionAutoFill and (isDirectionControl(Doc.getAttribute('DOCUMENTCLASS_ID'),
          Doc.parentNode.parentNode.getAttribute('EST_KIND')) <> '2') then
          Doc.setAttribute('DIRECTION_ID', DirectionAutoFill(Doc,
            Doc.parentNode.parentNode.getAttribute('BUDGET_ID')));
        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'))]));


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

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

      except
        ExceptionProc( 'CreateDoc40');
    end;

end;

begin
end.
