Страница 1 из 1

Ошибка: Текущий интерфейс не реализует OBJ-интерфейс ObjKatS

Добавлено: 24 дек 2014, 18:23
Zver
При пересборке проекта появилось такое сообщение.

Объектный интерфейс - самописный. Хотелось бы понять, что может означать такая ошибка.

Описание объектного интерфейса:

Код: Выделить всё

//******************************************************************************
//                                                      (c) корпорация Галактика
// Галактика 8.1 - Название контура
//******************************************************************************

#ifndef __KatSoprTransfer_vih__
#define __KatSoprTransfer_vih__

#Component "EPA_SOPRDOC"

#doc
  добавить описание объекта ...
#end
ObjInterface ObjKatSoprTransfer;
   procedure SaveToXML (lMarker: longint);
   procedure LoadFromXML ;
   procedure SetXML_NAME(_XML_Name: string) ;
end;

VipInterface KatSoprTransfer Implements ObjKatSoprTransfer Licensed(Free);
public:
  Procedure ParseDom;
  Function  GetSpSopr(SSAttrMap : longint; var p_bufSpSopr : type$SpSopr) : boolean;
  Procedure AddSpSoprNode(SpSoprsNode: longint);
  Function  CreateXML(lMarker : longint): boolean;
  procedure ObjKatSoprTransfer.SaveToXML(lMarker: longint);
  procedure ObjKatSoprTransfer.LoadFromXML;
  Procedure ObjKatSoprTransfer.SetXML_NAME(_XML_Name: string) ;

end;


VipInterface KatSoprTransfer_ForEp(KatSoprTransfer) Licensed(Free);
public:
  Procedure ParseDom;
  Function  GetSpSopr(SSAttrMap : longint; var p_bufSpSopr : type$SpSopr) : boolean;
  Procedure AddSpSoprNode(SpSoprsNode: longint);
  Function  CreateXML(lMarker : longint): boolean;
  procedure ObjKatSoprTransfer.SaveToXML(lMarker: longint);
  procedure ObjKatSoprTransfer.LoadFromXML;

end;

#endif
И реализация:

Код: Выделить всё


#include KatSoprTransfer.vih
#include TransferHelper.vih
#include LinkGrPl.vih
#include ExtAttr.vih
#include SystemHelper.vih
#include GetKau.vih
#include TuneAssistent.vih
#include MsgDlg.vih
#include ObjReservHelper.vih

Interface KatSoprTransfer;

Const
  SAVE_MODE  : byte = 0;
  LOAD_MODE  : byte = 1;
  FORMAT_DATE: string[10] = 'DD/MM/YYYY';
  SEPARATOR  : string[1] = ';';
end;

var
  XMLPathName : string;
  PathComent  : string;
  Action_mode : byte;
  isCanceled  : boolean;
  KatSoprNrec : comp;
  noteStatus  : word;
  noteName    : string;
  sDBName     : string;
  cDBFilial   : comp;


  domDocument                 // ссылка на дом-документ
 ,rootNode                    // ссылка на корневой узел
 ,KatSoprsNode : longint;               // ссылка на узел корневого элемента <KatSoprs>
  cDog         : comp;  // ссылка на договор

  XML_NAME     : string;

  cMnPlanReserv : comp;
#include ExtAttr.var
#include LinkGrPl.var
#include Getkau.var


create view vTransfer
from
 KatSopr
,SpSopr   (SPSOPR02)
,KatSopr  snKatSopr
,SpSopr   snSpSopr
,KatNotes
,KatNotes snKatNotes
,Dogovor
,KatMc
,ObjAccT
,ObjAccT snObjAccT
,SpecMtr
,MnPlan
where
 ((
        KatSoprNrec   == KatSopr.Nrec
   and  KAtSopr.Nrec  == SpSopr.cSopr
   and  KatSopr.cNote == KatNotes.Nrec
   and  100           == snKatNotes.Viddoc
   and  noteStatus    == snKatNotes.Status
   and  noteName      == snKatNotes.Name
   and  cDog          == Dogovor.Nrec

   and  toKatSopr     == ObjAccT.TypeOwn
   and  KatSopr.Nrec  == ObjAccT.cOwner
   and  word(1)       == ObjAccT.KindRec
   and  toZClient     == ObjAccT.TypeObj

   and cMnPlanReserv  == MnPlan.NRec
 )) ;


Procedure SaveToDsk; forward;
Procedure LoadFromDsk;  forward;


Window wSetSaveLoadPath '', Dialog, EscClose;
Show at (,,50, 5);

Screen scSetSaveLoadPath;
fields
 PathComent  : skip, {font = { bold = true}};
 XMLPathName : noProtect, PickButton;
buttons
  cmOk     ,,,;
  cmCancel ,,,;
<<
  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

      <. Продолжить .>       <. Отменить  .>
>>

end;

HandleEvent
cmInit :
{
  isCanceled := true;

  case Action_mode of
  SAVE_MODE :
  {
    PathComent := 'Сохранять данные в папку:';
    SetWindowTitle(wSetSaveLoadPath, 'Выбор пути к сохраняемым данным');
  }
  LOAD_MODE:
  {
    PathComent := 'Загружать данные из папки:';
    SetWindowTitle(wSetSaveLoadPath, 'Выбор пути к загружаемым данным');
  }
  end;

  LoadFromDsk;
}

cmOk :
{
  if (Trim(XMLPathName) = '')
  {
     Message('Необходимо выбрать путь к данным', Warning) ;
      Abort;
       Exit;
  }

  isCanceled := false;
  SaveToDsk;
  CloseWindow(wSetSaveLoadPath);
}

cmPick :
{
  Case CurField of
    #XMLPathName :
     {
       Set XMLPathName  := GetDirName('Выберите путь к данным') ;
     }

  end;
}

end;

end; // Window


Function IsAllowedGroupMC(p_KodGr: string): boolean;
var deniedGroup
   ,tmpS        : string;
    i           : integer;
{
   result := true;

   if (not ExistTune('KATSOPRTRANSFER.MASK_GROUPMC'))
      exit;

   deniedGroup := Trim(sGetTune('KATSOPRTRANSFER.MASK_GROUPMC'));

   deniedGroup += SEPARATOR; // если в настройке не поставили разделитель - ставим, иначе будет некорректно работать ExtractDelimitedWord
   for (i := 1; ; i++)
   {
     if (deniedGroup = '' or deniedGroup = SEPARATOR)
        break;

      tmpS := Trim(ExtractDelimitedWord(deniedGroup, i, SEPARATOR));

      deniedGroup := Trim(SubStr(deniedGroup, length(tmpS) + 1, length(tmpS)));

      if (tmpS = '')
         continue;

      if (Pos(tmpS, p_KodGr) = 1)
      {
         result := false;
         break;
      }
   }

}

Procedure LoadFromDsk;
{
  ReadMyDSK (XMLPathName, 'KatSoprTransfer_XMLPathName', false);

  if (Trim(XMLPathName) = '')
  {
    Set XMLPathName := GetStringParameter('Files','OutputFilesDirectory',0);
  }
}


Procedure SaveToDsk;
{
  SaveMyDSK (XMLPathName, 'KatSoprTransfer_XMLPathName' );
}

Procedure SetAttribute(element :Longint; nameAttr, valueAttr:string);
{
    XMLDOMElement_SetAttribute(element, nameAttr, valueAttr)
}

Function GetSaldoTune(cFilial: comp) : comp;
{
  result := ReservHelper :: GetSaldoDst(cFilial);
 /* case  GetCurrentBranch of
    0001000000000003h : result := 0001000000000005h; //РЭПХ
    0001000000000002h : result := 0001000000000001h; //НЗЛ
    000100000000000Ah : result := 0001000000000006h; //ЭП
    0001000000000004h : result := 000100000000000Ah; //К-Энэрго
   else
   {
      if(getFirst fastFirstRow Filials where (( GetCurrentBranch == Filials.Atl_Nrec )) = tsOK )
        Message('Текущий филиал ' + Filials.Name + ' GetCurrentBranch = ' + GetCurrentBranch );
      Message('Не удалось определить филиал');
   }
   end; */
}

Procedure AddSpSoprNode(SpSoprsNode: longint);
{
 var
   SpSoprNode : longint;

   SpSoprNode := XMLDOMDoc_CreateElement(domDocument, 'SpSopr');
   rootNode   := XMLDOMNode_AppendChild(SpSoprsNode, SpSoprNode);

   SetAttribute(SpSoprNode, 'ID'     , SpSopr.Nrec) ;
   SetAttribute(SpSoprNode, 'cMcUsl' , SpSopr.cMcUsl) ;
   SetAttribute(SpSoprNode, 'prMC'   , SpSopr.prMC) ;
   SetAttribute(SpSoprNode, 'Price'  , DoubleToStr(SpSopr.Price  , '[|-]3666666666666666666.8888888888888888')) ;
   SetAttribute(SpSoprNode, 'KolFact', DoubleToStr(SpSopr.KolFact, '[|-]3666666666666666666.8888888888888888')) ;
   SetAttribute(SpSoprNode, 'Kol'    , DoubleToStr(SpSopr.Kol    , '[|-]3666666666666666666.8888888888888888')) ;
   SetAttribute(SpSoprNode, 'Npp'    , SpSopr.Npp) ;
   SetAttribute(SpSoprNode, 'cOtpEd' , SpSopr.cOtpEd) ;

   if ( GetFirst FastFirstRow SpecMtr where
  ((
    1110             == SpecMtr.cOTable
    and SpSopr.NRec  == SpecMtr.cSpec
    and GetSaldoTune(SpSopr.Atl_branch) == SpecMtr.cSaldTune
  )) = tsOk)
  {
     //Message('Найдена запись в SpecMtr, .cObj =  ' + SpecMtr.cObj);
     SetAttribute(SpSoprNode, 'cMnplanRes', SpecMtr.cObj);
  }
    //else
     // Message('Запись в SpecMtr не найдена');
   XMLDOMNode_Release(SpSoprNode);
}

Procedure AddClaimNode(ClaimsNode: longint);
{
 var
   ClaimNode : longint;
   ClaimNode := XMLDOMDoc_CreateElement(domDocument, 'Claim');
   rootNode  := XMLDOMNode_AppendChild(ClaimsNode, ClaimNode);
   SetAttribute(ClaimNode, 'ID'     , ObjAccT.cObject) ;
   XMLDOMNode_Release(ClaimNode);
}

Procedure AddKatSoprNode;
{
 var
   KatSoprNode
 , ChildNode : longint;

   KatSoprNode := XMLDOMDoc_CreateElement(domDocument, 'KatSopr');
   rootNode    := XMLDOMNode_AppendChild(KatSoprsNode, KatSoprNode);

   SetAttribute(KatSoprNode, 'ID'     , KatSopr.Nrec) ;
   SetAttribute(KatSoprNode, 'VidSopr', KatSopr.VidSopr) ;
   SetAttribute(KatSoprNode, 'TipSopr', KatSopr.TipSopr) ;
   SetAttribute(KatSoprNode, 'dSopr'  , DateToStr(KatSopr.dSopr, FORMAT_DATE)) ;
   SetAttribute(KatSoprNode, 'nSopr'  , KatSopr.nSopr) ;
   SetAttribute(KatSoprNode, 'VhodNal', KatSopr.VhodNal);
   SetAttribute(KatSoprNode, 'OrgName', KatSopr.cOrg -> Name);

   if (getFirst KatNotes = tsOk)
    {
      SetAttribute(KatSoprNode, 'Note' , KatNotes.Status +'|'+ KatNotes.Name + '|') ;
    }

   if (getFirst SpSopr = tsOk)
    {
     ChildNode := XMLDOMDoc_CreateElement(domDocument, 'SpSoprs');
     rootNode  := XMLDOMNode_AppendChild(KatSoprNode, ChildNode);

      _Loop SpSopr
      {
         if (SpSopr.PrMc != toMc)
         {
            Message('Услуги не экспортируются!', Warning);
             continue;
         }

        AddSpSoprNode(ChildNode);
      }

      XMLDOMNode_Release(ChildNode);
   }
  if (getFirst ObjAccT = tsOk)
   {
     ChildNode := XMLDOMDoc_CreateElement(domDocument, 'Claims');
     rootNode   := XMLDOMNode_AppendChild(KatSoprNode, ChildNode);
     _Loop ObjAccT
      {
        AddClaimNode(ChildNode);
      }
     XMLDOMNode_Release(ChildNode);
   }

  XMLDOMNode_Release(KatSoprNode);
}


Function CreateXML(lMarker : longint): boolean;
var
  iCount
 ,Iterator        : word;
  node                        // вспомогательные
 ,nodeChild       : longint;  // узлы
{
  result := false;

  iCount := GetMarkerCount(lMarker);

  domDocument := XMLDOMDoc_New;

  if (domDocument = 0)
    Exit;

  node      := XMLDOMDoc_CreateProcessingInstruction(domDocument, 'xml', 'version="1.0" encoding="UTF-8" standalone="yes"');
  nodeChild := XMLDOMNode_AppendChild(domDocument, node);
  XMLDOMNode_Release(node);
  XMLDOMNode_Release(nodeChild);

  node             := XMLDOMDoc_CreateComment(domDocument, '"ЭП-Аудит". Экспорт сопроводительных документов');
  nodeChild        := XMLDOMNode_AppendChild(domDocument, node);
  XMLDOMNode_Release(node);
  XMLDOMNode_Release(nodeChild);

  KatSoprsNode    := XMLDOMDoc_CreateElement(domDocument, 'KatSoprs');
  rootNode        := XMLDOMNode_AppendChild(domDocument , KatSoprsNode);
  SetAttribute(KatSoprsNode, 'Database', SystemHelper::GetDatabaseName());
  SetAttribute(KatSoprsNode, 'Filial', GetCurrentBranch());

  StartNewVisual(vtIndicatorVisual, vfTimer, 'Создание XML-файла...', iCount);

  for (Iterator := 0; Iterator < iCount; Iterator++)
  {
     NextVisual;

     if (not GetMarker(lMarker, Iterator, KatSoprNrec))
       continue;

     if ( getFirst KatSopr = tsOk )
     {
       AddKatSoprNode;
     }

  }

  result := XMLDOMDoc_Save(domDocument, XMLPathName+XML_NAME);

  XMLDOMNode_Release(KatSoprsNode);
  XMLDOMNode_Release(rootNode);
  XMLDOMDoc_Done(domDocument);

  var  CliPath : string;

  if (IfDefServerApp)
  {
     PutSrvFileToClient(XMLPathName+XML_NAME, sGetTune('REPHLOGISTICS.PATH_FILE_KATSOPRS')+XML_NAME, true)
  }

  StopVisual('', 0);
}

Function LoadXML: boolean;
var AttrItem,
    AttrMap,
    lNodeList: longint;
    Iterator,
    iLength  : integer;
{
  result := false;

  domDocument := XMLDOMDoc_New;

  if (domDocument = 0)
    Exit;

  result := XMLDOMDoc_Load(domDocument, XMLPathName+XML_NAME);

  if (not result)
  {
    Message('Не удалось загрузить данные из xml-файла', Error)
  }
  else
  {
    result := false;

    lNodeList := XMLDOMDoc_GetElementsByTagName(domDocument, 'KatSoprs');

    if (lNodeList = 0)
    {
      Message('Неверный формат DOM-документа!'#13'' +
              'Корневой элемент "KatSoprs" не найден.', Error);
       Exit;
    }

    iLength := XMLDOMNodeList_get_Length(lNodeList);

    if ( iLength != 1)
    {
      XMLDOMNode_Release(lNodeList);
      Message('Некорректный DOM-документ:'#13'' +
              'найдено более одного корневого элемента "KatSoprs".', Error);
       Exit;

    }

    AttrMap := XMLDOMNode_get_Attributes(XMLDOMNodeList_get_Item(lNodeList, 0));
    iLength := XMLDOMNamedNodeMap_get_Length(AttrMap) ;

    sDBName   := '';
    cDBFilial := 0h;

    for (Iterator := 0; Iterator < iLength; Iterator++)
    {
      AttrItem := XMLDOMNamedNodeMap_get_Item(AttrMap, Iterator);

      if (LoCase(XMLDOMNode_get_NodeName(AttrItem)) != 'database')
        continue;

      sDBName := XMLDOMAttribute_get_NodeValue(AttrItem);
      break;
    }

    for (Iterator := 0; Iterator < iLength; Iterator++)
    {
      AttrItem := XMLDOMNamedNodeMap_get_Item(AttrMap, Iterator);

      if (LoCase(XMLDOMNode_get_NodeName(AttrItem)) != 'filial')
        continue;

      cDBFilial := comp(XMLDOMAttribute_get_NodeValue(AttrItem));
      break;
    }

    XMLDOMNode_Release(lNodeList);
    XMLDOMNode_Release(AttrMap);
    XMLDOMNode_Release(AttrItem);

    if (sDBName = '')
    {
      Message('Некорректный DOM-документ:'#13'' +
              'Не удалось определить значение атрибута Database корневого элемента', Error);
       Exit;
    }

    if (not TransferHelper::DataBaseIsPermitted(sDBName, cDBFilial))
    {
       Message('Не разрешен импорт накладных из БД "' + sDBName + '"'
                + if (cDBFilial = 0, '', ' (филиал: ' + string(cDBFilial,0,0) + ')')
                + ', не задана или задана неверно закупочная организация', Warning);
        Exit;
    }

    if (TransferHelper::GetPurchOrg(sDBName, cDBFilial) = 0)
    {
       Message('Для БД "' + sDBName + '"' + if (cDBFilial = 0, '', ' (филиал: ' + string(cDBFilial,0,0) + ')')
                 + ' не задана или задана неверно закупочная организация', Warning);
        Exit;
    }

    lNodeList := XMLDOMDoc_GetElementsByTagName(domDocument, 'KatSopr');

    if (lNodeList = 0)
    {
      Message('Нет данных для загрузки!', Information);
       Exit;
    }

    iLength := XMLDOMNodeList_get_Length(lNodeList);

    XMLDOMNode_Release(lNodeList);

    if ( iLength = 0)
    {
      Message('Нет данных для загрузки!', Information);
       Exit;
    }
    result := true;
  }
}


Function GetKatSopr(KSAttrMap : longint; var p_bufKatSopr : type$KatSopr) : boolean;
var
 iCount
,Iterator   : integer;
 AttrItem   : longint;
 AttrName
,AttrValue  : string;
 OrgName    : string;
// tuneAssist : TuneAssistent;
{
  result := false;

  ClearAdvRecord(p_bufKatSopr);

  if (KSAttrMap = 0)
    exit;

  iCount := XMLDOMNamedNodeMap_get_Length(KSAttrMap) ;

  if (iCount = 0) // в этом случае непонятно что грузить в катсопр
    exit;

  OrgName := '';

  for (Iterator := 0; Iterator < iCount; Iterator++)
  {
    AttrItem := XMLDOMNamedNodeMap_get_Item(KSAttrMap, Iterator);
    AttrName := LoCase(XMLDOMNode_get_NodeName(AttrItem));
    AttrValue:= XMLDOMAttribute_get_NodeValue(AttrItem);

    Case AttrName of

       // дата
      'dsopr'  :
          {
             p_bufKatSopr.dSopr   := StrToDate(AttrValue, FORMAT_DATE) ;
             p_bufKatSopr.dPrice  := StrToDate(AttrValue, FORMAT_DATE) ;
          }

      // номер
      'nsopr'  : p_bufKatSopr.nSopr   := AttrValue;

      // входимость налогов
      'vhodnal': p_bufKatSopr.VhodNal := word(AttrValue);

      // статус
      'note'   :
        {
          if ( tuneAssist.LoadSoprStatus != 0h )
            p_bufKatSopr.cNote := tuneAssist.LoadSoprStatus;
          else
          {
             noteStatus := word(ExtractDelimitedWord(AttrValue, 1, '|'));
             noteName   := ExtractDelimitedWord(AttrValue, 2, '|');

             if (GetFirst fastFirstRow snKatNotes  = tsOK)
             {
               p_bufKatSopr.cNote := snKatNotes.Nrec
             }
          }
        }
      'orgname' :
        {
           OrgName := AttrValue;
        }
    end;
  }

  XMLDOMNode_Release(KSAttrMap);

  // проверяем, можно ли загружать накладную с таким контрагентом
  if (not TransferHelper::OrgIsPermitted(OrgName))
  {
     Message('Накладная ' + #_SDOC(p_bufKatSopr.nSopr,p_bufKatSopr.dSopr) + ' не может быть загружена'#13''+
             'Неверный контрагент: "' + OrgName + '"', Warning
            );
      Exit;
  }

  p_bufKatSopr.Nrec      := GetNextNrec(#KatSopr, 0);
  p_bufKatSopr.VidSopr   := 101;   // приходные
  p_bufKatSopr.TipSopr   := 1;
  p_bufKatSopr.YearSopr  := Year(p_bufKatSopr.dSopr) ;

  p_bufKatSopr.cOrg      := TransferHelper::GetPurchOrg(sDBName,cDBFilial); //coGetTune('REPHLOGISTICS.PURCH_ORG') ;  // контрагент
  p_bufKatSopr.cGruzFrom := TransferHelper::GetPurchOrg(sDBName,cDBFilial); //coGetTune('REPHLOGISTICS.PURCH_ORG') ;  // грузоотправитель
  p_bufKatSopr.cOrgBase  := TransferHelper::GetPurchOrg(sDBName,cDBFilial); //coGetTune('REPHLOGISTICS.PURCH_ORG') ;  // контрагент взаиморасчетов
  p_bufKatSopr.cGruzTo   := coGetTune('MYORG') ;  // грузополучатель

  p_bufKatSopr.Descr     := sGetTune('USER.DESCR');
  p_bufKatSopr.DesGr     := sGetTune('USER.DESGR');

  p_bufKatSopr.cPayment  := coGetTune('OPER.BUY.NAKL.CPAYMENT');

  // договор из атрибута "Договор с Холдингом " собственной организации

  if (piExtAttr.ValueExists(coKatOrg,  coGetTune('MYORG'), 'Договор с Холдингом') )
  {
    cDog := piExtAttr.coGetAttr(coKatOrg, coGetTune('MYORG'), 'Договор с Холдингом');

    if (getFirst fastFirstRow Dogovor = tsOk)
    {
      p_bufKatSopr.cDogovor     := if (Dogovor.TidK = 400, Dogovor.Nrec, Dogovor.cDogovor);
      p_bufKatSopr.cAppDogovor  := if (Dogovor.TidK = 400, 0           , Dogovor.Nrec);
    }
  }

  result := true;

}

Function GetSpSopr(SSAttrMap : longint; var p_bufSpSopr : type$SpSopr) : boolean;
var
 iCount
,Iterator    : integer;
 AttrItem    : longint;
 AttrName
,AttrValue   : string;
{
  result := false;

  ClearAdvRecord(p_bufSpSopr);

  if (SSAttrMap = 0)
    exit;

  iCount := XMLDOMNamedNodeMap_get_Length(SSAttrMap) ;

  if (iCount = 0) // в этом случае непонятно что грузить в spsopr
    exit;

  for (Iterator := 0; Iterator < iCount; Iterator++)
  {
    AttrItem := XMLDOMNamedNodeMap_get_Item(SSAttrMap, Iterator);
    AttrName := LoCase(XMLDOMNode_get_NodeName(AttrItem));
    AttrValue:= XMLDOMAttribute_get_NodeValue(AttrItem);

    //Message( 'Атрибут: ' + AttrName + 'Значение ' + AttrValue );
    cMnPlanReserv := 0;

    Case AttrName of
       // ссылка на услуг / мц
      'cmcusl'  : p_bufSpSopr.cMcUsl := comp(AttrValue) ;

      // признак МЦ / услуга
      'prmc'    : p_bufSpSopr.PrMc   := word(AttrValue) ;

      // цена
      'price'   :
          {
             p_bufSpSopr.Price   := double(AttrValue);
             p_bufSpSopr.RPrice  := double(AttrValue);
          }
      //количество фактической
      'kolfact' : p_bufSpSopr.KolFact:= double(AttrValue);

      // количество
      'kol'     : p_bufSpSopr.Kol    := double(AttrValue);

      // номер по порядку
      'npp'     : p_bufSpSopr.Npp    := word(AttrValue);

      // отпускная единица измерения
      'cotped'  : p_bufSpSopr.cOtpEd := comp(AttrValue);

      // группа налогов
      'cgrnal'  : p_bufSpSopr.cGrNal := comp(AttrValue);

      //заказ, на который зарезервировано
      'cmnplanres' :
        {
          cMnPlanReserv := comp(AttrValue);
          if (getFirst FastFirstRow MnPlan = tsOK)
            if(MnPlan.Number = '002093')
              cMnPlanReserv := 0;
        }

   end;
  }

  p_bufSpSopr.Nrec := GetNextNrec(#SpSopr, 0);


  XMLDOMNode_Release(SSAttrMap);

  result := true;

}

Function GetClaim(ClaimMap : longint; var p_bufObjAccT : type$ObjAccT) : boolean;
var
 iCount
,Iterator    : integer;
 AttrItem    : longint;
 AttrName
,AttrValue   : string;
{
  result := false;

  ClearAdvRecord(p_bufObjAccT);

  if (ClaimMap = 0)
    exit;

  iCount := XMLDOMNamedNodeMap_get_Length(ClaimMap) ;

  if (iCount = 0) // в этом случае непонятно что грузить в spsopr
    exit;

  p_bufObjAccT.TypeObj := toZClient;
  p_bufObjAccT.KindRec := 1;
  p_bufObjAccT.NumSort := comp(100000);

  for (Iterator := 0; Iterator < iCount; Iterator++)
  {
    AttrItem := XMLDOMNamedNodeMap_get_Item(ClaimMap, Iterator);
    AttrName := LoCase(XMLDOMNode_get_NodeName(AttrItem));
    AttrValue:= XMLDOMAttribute_get_NodeValue(AttrItem);

    Case AttrName of
       // ссылка на услуг / мц
      'id'  : p_bufObjAccT.cObject := comp(AttrValue) ;
    end;
  }

  XMLDOMNode_Release(ClaimMap);
  result := true;
}

function SetSpSopr_defFieldsFromKatSopr(p_bufKatSopr: type$KatSopr; var p_bufSpSopr : type$SpSopr) : boolean;
{
  p_bufSpSopr.cSopr    := p_bufKatSopr.Nrec;
  p_bufSpSopr.VidSopr  := p_bufKatSopr.VidSopr;
  p_bufSpSopr.dSopr    := p_bufKatSopr.dSopr;


  // 08.11.10 14:47:17 проверка на архивную МЦ
  if (p_bufSpSopr.PrMc = toMc)
  {
    var b_check : boolean;

    do
    {
      if (getFirst KatMc where ((p_bufSpSopr.cMcUsl == KatMc.Nrec))
            != tsOk
          )
       {
          p_bufSpSopr.cMcUsl := 0;
          break;
       }
      else
       {
           if (/*KatMc.isArch != 0 or*/ (not IsAllowedGroupMC(KatMc.kGroupMC))) //Убрали проверку на архивность 31.03.2014
            {
                var l_cMcUsl : comp;
                var s : string;
                l_cMcUsl := 0;

                //s := if (not IsAllowedGroupMC(KatMc.kGroupMC), ' ссылается на МЦ с запрещенной группой'#13'', ' ссылается на архивную МЦ'#13'');
                if (not IsAllowedGroupMC(KatMc.kGroupMC))
                  s := ' ссылается на МЦ с запрещенной группой'#13'';

                if (Message('Поз. спец-ии №'  + p_bufSpSopr.Npp + s          +
                            'Наименование: "' + if (length(KatMc.Name) > 25, SubStr(KatMc.Name, 1, 25) + '...', KatMc.Name)  + '"'#13'' +
                            'Баркод: "'       + KatMc.Barkod                 + '"'#13''    +
                            'Обозначение: "'  + if (length(KatMc.Obozn) > 25, SubStr(KatMc.Obozn, 1, 25) + '...', KatMc.Obozn)  + '"'#13'' +
                            'Код группы:  "'  + KatMc.kGroupMC  + '"'#13#13'' +
                            'Заменить МЦ? (иначе пропустить)', Confirmation + YesNo
                      ) != cmYes)
                {
                    p_bufSpSopr.cMcUsl := 0;
                    break;
                }
                else
                {
                    iGetKau.GetCodeKau(cgiNo, cgKau_KatMC, l_cMcUsl);
                    p_bufSpSopr.cMcUsl := l_cMcUsl;
                    continue;
                }
            }
           break; // выход, если все проверки прошли
       }
     }
     while (true)
   }
   result := p_bufSpSopr.cMcUsl > 0;
}

Procedure ReCalcNalUch(_cSopr: comp);
{
   if (boGetTune('Oper.NalUch') )
   {
     var sumNalUch, sumNalUchUsl : double;

     _Loop snSpSopr where ((_cSopr == snSpSopr.cSopr))
     {
       RunInterface(L_Sklad::ViewNalUch, snSpSopr.nRec, sumNalUch, sumNalUchUsl, false);
       snSpSopr.priceN:= sumNalUch/snSpSopr.kolFact;
       snSpSopr.vPriceN:= sumNalUchUsl/snSpSopr.kolFact;
       update current snSpSopr;
     }
   }
}


Procedure InsertSpSopr(p_itemNode: longint; p_bufKatSopr: type$KatSopr);
var
 p_nodeList : longint;
 p_count    : word;
 p_bufSpSopr: type$SpSopr;
{
  ClearAdvRecord(p_bufSpSopr);
  p_nodeList :=  XMLDOMNode_get_ChildNodes(p_itemNode);

  if (p_nodeList = 0)
    exit;

  p_count := XMLDOMNodeList_get_Length(p_nodeList);

  if (p_count = 0 ) // нет позиций спецификации
   {
     XMLDOMNode_Release(p_nodeList);
     exit;
   }

  var i : integer;
  // создаем позиции SpSopr
  for (i := 0; i < p_count; i++)
  {
    p_itemNode := XMLDOMNodeList_get_Item(p_nodeList, i);

    if (XMLDOMNode_get_NodeName (p_itemNode) != 'SpSopr' )
    {
      XMLDOMNode_Release(p_itemNode);
       exit;
    }
    else
      if (GetSpSopr( XMLDOMNode_get_Attributes(p_itemNode), p_bufSpSopr))
      {
        if (not SetSpSopr_defFieldsFromKatSopr(p_bufKatSopr, p_bufSpSopr))
            exit;

        snSpSopr.buffer := p_bufSpSopr;
        if (insert current snSpSopr != tsOk)
           #Log('Ошибка вставки в SpSopr')

       // Message('Вставляем запись в таблицу SpecMtr, cMnPlanReserv = ' + cMnPlanReserv);
        if( cMnPlanReserv != 0 )
          insert into SpecMtr set
                      SpecMtr.cObj      := cMnPlanReserv
                     ,SpecMtr.cOTable   := 1110
                     ,SpecMtr.cSpec     := p_bufSpSopr.NRec
                     ,SpecMtr.cSaldTune := GetSaldoTune(SpecMtr.Atl_Branch);
      }
    XMLDOMNode_Release(p_itemNode);
  }
}

Procedure InsertObjAccT(p_itemNode: longint; p_bufKatSopr: type$KatSopr);
var
 p_nodeList  : longint;
 p_count     : word;
 p_bufObjAccT: type$ObjAccT;
{
  ClearAdvRecord(p_bufObjAccT);
  p_nodeList :=  XMLDOMNode_get_ChildNodes(p_itemNode);

  if (p_nodeList = 0)
    exit;

  p_count := XMLDOMNodeList_get_Length(p_nodeList);

  if (p_count = 0 )
   {
     XMLDOMNode_Release(p_nodeList);
     exit;
   }

  var i : integer;

  for (i := 0; i < p_count; i++)
  {
    p_itemNode := XMLDOMNodeList_get_Item(p_nodeList, i);

    if (XMLDOMNode_get_NodeName (p_itemNode) != 'Claim' )
    {
      XMLDOMNode_Release(p_itemNode);
       exit;
    }
    else
      if (GetClaim( XMLDOMNode_get_Attributes(p_itemNode), p_bufObjAccT))
      {
        p_bufObjAccT.TypeOwn := toKatSopr;
        p_bufObjAccT.cOwner  := p_bufKatSopr.Nrec;
        p_bufObjAccT.VidSopr := p_bufKatSopr.VidSopr;

        snObjAccT.buffer := p_bufObjAccT;
        if (insert current snObjAccT != tsOk)
           #Log('Ошибка вставки в ObjAccT')
      }
    XMLDOMNode_Release(p_itemNode);
  }
}

Procedure ParseDom;
 var KSNodeList
    ,SSNodeList
    ,ItemNode
    ,KSChildNodes   : longint;
 var	
     iCountKS
    ,iCountSS
    ,Iterator    : integer;
 var
    bufKatSopr   : type$KatSopr;
    bufSpSopr    : type$SpSopr;
{

   KSNodeList := XMLDOMDoc_GetElementsByTagName(domDocument, 'KatSopr') ;

   iCountKS := XMLDOMNodeList_get_Length(KSNodeList);

   StartNewVisual(vtIndicatorVisual, vfTimer, 'Идет разбор DOM-документа...', iCountKS);

   for (Iterator := 0; Iterator < iCountKS ; Iterator++)
   {
     NextVisual;

     ItemNode := XMLDOMNodeList_get_Item(KSNodeList, Iterator);

     if (ItemNode = 0)
       continue;

     if ( GetKatSopr( XMLDOMNode_get_Attributes(ItemNode), bufKatSopr) )
     {
       // ищем в базе накладную с таким номером и датой, если есть - спрашиваем, чего делать
       if ( RecordExists KatSopr where ((
                                            101              == KatSopr.VidSopr
                                        and bufKatSopr.dSopr == KatSopr.dSopr
                                        and bufKatSopr.nSopr == KatSopr.nSopr
                                     ))
             = tsOk
          )
         if (Message('Уже существует накладная №'+ bufKatSopr.nSopr +
                     ' от ' + DateToStr(bufKatSopr.dSopr, FORMAT_DATE)+'.'#13'' +
                     'Все равно загрузить?'
                     , Confirmation | YesNo
                     ) != cmYes
             )
               continue;

       snKatSopr.buffer := bufKatSopr;

       if (insert current snKatSopr <> tsOk)
       {
          Message('Ошибка вставки KatSopr');
       }
       else
       {
         KSChildNodes := XMLDOMNode_get_ChildNodes(ItemNode);
         XMLDOMNode_Release(ItemNode);

         if (KSChildNodes = 0) // нет спецификации и ссылок на заявки
           continue;

         iCountSS := XMLDOMNodeList_get_Length(KSChildNodes);

         if (iCountSS > 2 ) // дочерних узлов больше двух, чего быть не может
          {
            XMLDOMNode_Release(KSChildNodes);
            continue;
          }

         var i : integer;
         for (i := 0; i < iCountSS; i++)
          {
             ItemNode := XMLDOMNodeList_get_Item(KSChildNodes, i);
             case (XMLDOMNode_get_NodeName (ItemNode)) of
              'SpSoprs' : InsertSpSopr (ItemNode, snKatSopr.buffer);
              'Claims'  : InsertObjAccT(ItemNode, snKatSopr.buffer);
             end;
             XMLDOMNode_Release(ItemNode);
          }
         XMLDOMNode_Release(KSChildNodes) ;

         // кооректируем накладные

         iGrPl.InsSpGrPlD_Default(snKatSopr.VidSopr, snKatSopr.nRec, snKatSopr.cOrg);

         var resultCheckSum : boolean;
         RunInterface(
             iChkSum
             ,snKatSopr.Nrec                      //сопроводительный документ
             ,0                                   //по всем позициям
             ,FALSE                               //выполнить только пересчет позиции (true)
             ,if (snKatSopr.cVal = 0, 10, 20)     //метод пересчета суммы в валюте по текущему курсу
             ,resultCheckSum                      //резутьтат выполнения (был ли пересчет) [возвращаемый]
         );
         // пересчет для налогового учета
         //ReCalcNalUch(snKatSopr.Nrec);
       }

     }
   }
   StopVisual('', 0);
   XMLDOMNode_Release(KSNodeList);
   XMLDOMDoc_Done(domDocument);
}

procedure ObjKatSoprTransfer.SaveToXML(lMarker: longint);
var
  iCount
 ,Iterator : word;
{
  Action_mode := SAVE_MODE;

  if (lMarker = 0) // ссылка на маркер нулевая
     Exit;

  if (GetMarkerCount(lMarker) = 0) // ничего не выбрано
     Exit;

  XMLPathName := if (IfDefServerApp()
                    , ConvertClientPathToSrv (sGetTune('REPHLOGISTICS.PATH_FILE_KATSOPRS'))
                    , sGetTune('REPHLOGISTICS.PATH_FILE_KATSOPRS')
                    );

  if (Trim(XMLPathName) = '')
    RunWindowModal(wSetSaveLoadPath);

  if (isCanceled)
    Exit;

  if (not VerifyPathName(XMLPathName, true))
  {
    Message('Указанный путь не существует.', Error);
     Exit;
  }

  if (CreateXML(lMarker))
  {
    Message('Файл успешно создан!', Information);
  }
  else
  {
    Message('Не удалось создать файл!', Error);
  }

}

procedure ObjKatSoprTransfer.LoadFromXML;
{
  Action_mode := LOAD_MODE;

  XMLPathName := sGetTune('REPHLOGISTICS.PATH_FILE_KATSOPRS');

  if (Trim(XMLPathName) = '')
    RunWindowModal(wSetSaveLoadPath);

  if (isCanceled)
    Exit;

  if (not VerifyPathName(XMLPathName, false))
  {
    Message('Указанный путь не существует.', Error);
     Exit;
  }

  if (not FileExist (XMLPathName + XML_NAME) )
  {
    Message('По указанному пути нет данных для загрузки накладных.'#13''+
             'Файл "'+XMLPathName + XML_NAME+'" не найден.', Information);
     Exit;
  }

  if (IfDefServerApp())
  {
     if (GetFileFromClient(XMLPathName+XML_NAME, true) != 0)
      {
         Message('Файл не найден'#13'' + XMLPathName+XML_NAME, Warning);
          Exit;
      }

     XMLPathName := ConvertClientPathToSrv (sGetTune('REPHLOGISTICS.PATH_FILE_KATSOPRS'));

  }

  if (not LoadXML)
    exit;

  ParseDom;

  if (boGetTune('REPHLOGISTICS.NEEDDEL_FILE_KATSOPRS'))
  {
    DeleteFile(XMLPathName + XML_NAME) ;
  }

  Message('Загрузка накладных завершена', Information);

}

Procedure ObjKatSoprTransfer.SetXML_NAME(_XML_Name : string) ;
{
  XML_NAME := _XML_Name;
}

HandleEvent
cmOnVipLoad:
 {
    XML_NAME := 'KatSoprTransfer_' + SystemHelper::GetDataBaseName() + '.xml'
 }
end

end.

Re: Ошибка: Текущий интерфейс не реализует OBJ-интерфейс Obj

Добавлено: 24 дек 2014, 19:31
Den
Быстрее всего что то с компонентной принадлежностью

Re: Ошибка: Текущий интерфейс не реализует OBJ-интерфейс Obj

Добавлено: 25 дек 2014, 00:27
edward_K
Component "EPA_SOPRDOC" должно быть либо в проекте перед компиляцмей фейса либо перед interface в самом фейсе. А вообще это где выдалось? В логе компиляции? Мож вы функции не все реализовали?

Re: Ошибка: Текущий интерфейс не реализует OBJ-интерфейс Obj

Добавлено: 25 дек 2014, 11:20
Zver
Эдвард, огромное спасибо, действительно необходимо было задать при сборке проекта компонент #Component "EPA_SOPRDOC".

:)

Сообщение выдавалось в логе компиляции.