BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Как правильно написать плагин на событие "Запись документа" в БЭСТ5

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Как правильно написать плагин на событие "Запись документа" в БЭСТ5
 
Б5.34.32.13
В БЭСТ 4 был плагин на запись документа
Код
  Private dScrInit,dHeads, dRow:=14, dCol:=17, dWhen, dValid
     If Empty(mDoc->uDate_Ot).Or. mDoc->uDate_Ot=mDoc->Date 
    dWhen:={{||Iif(Empty(aLastIn[1]),aIn[1]:=mDoc->Date,),.T.}}
    dValid:={{||aIn[1]<=mDoc->Date}}
dScrInit:={||DispBox(dRow,dCol,dRow+2,dCol+30,Chr(201)+Chr(205)+Chr(187)+Chr(186)+Chr(188)+Chr(205)+Chr(200)+Chr(186)+'
 ',"N/W") ,;
      SayScreen('[Введите дату отгрузки]',dRow,dCol+ 3,'B/W'),;
      SayScreen("Дата отгрузки:",dRow + 1,dCol+ 2,'N/W'),;
      1}
    dHeads :={ { {dRow+1,dCol+ 18},'uDate_ot'}   }
    mDoc->(Qinput(dRow,dCol,dRow+3,dCol+30,dHeads,1,,,dWhen,dValid,,dScrInit   ,,,'RESTOFF'))
   EndIf
 Return .T.

Все работало, переношу в БЭСТ5 - не работает пишет
Ошибка "Запись(документ) уже редактируется Вами!"
Я то думал, что документ уже записан.
Уважаемые коллеги ка преодолеть это ?
 
Добавьте перед qinput вызов semafor(.F.)
А после qInput - semafor(.T.)
С уважением, Новиков Алексей.
 
Мои рекомендации нвйти время, серъезно задуматься и сделать лучше чем было.
БЭСТ-5 позволяет гораздо лучше возможности
 
Цитата
Алексей Новиков пишет:
Добавьте перед qinput вызов semafor(.F.)
А после qInput - semafor(.T.)
Помогло, Спасибо
 
Б5.34.32.13
Уважаемые коллеги, в БЭСТ 4 были написаны плагины на вход в документ, проверку перед записью и запись документа в "Реализации со склада". они делали всяки проверки и расчеты и были взаимосвязаны через глобальную переменную aGlobVars. и прекрасно работали.
Переношу плагины в БЭСТ5 проверяю работоспособность и т.д. и вдруг выясняется что событие "Перед записью" глючит, причем весьма странно. У меня перед записью проверяется много чего и все работает нормально за исключением одного.
Опишу проблему. У нас при реализации со склада есть операция (03 Реализация с фасцеха)
При этом происходит списание со склада "Фасцех" иными словами фасуем товар списываем один номенклатурный номер, приходуем на основной склад с другим ном.номером. Реализовано это было так:
на событи "перед записью" проверялась опреция 03 и если это так запускалась функция из 2-х InitList() (создаются 2 временных таблицы БД). В одном InitList()-е товар из документа в другом к этому товару каждой позиции выбирался из справочника другой товар или несколько товаров. соответственно призводятся всякие проверки и пр. После сохранения в uGlobVars[99](объявлена при входе в документ) записываются имена временных таблиц. После этого на событие "запись документа" создается документ прихода на основании таблицы 2 в БД MdocM добавлено поле uLink (С23) (Grup+nnum+partia)через которое устанавливается связь между строками прихода и расхода.
Теперь о проблеме, в БЭСТе 5 так не получается у меня.
вернее 2 InitList()-а появляются и работают в смысле заполняются и т. д. но после их завершения если возвращается .T. не вызывается функция "запись документа", если возвращается .F. при следующем нажатии F10 не вызывается не только событие "запись документа" но и событие "перед записью", документ просто сохраняется. Еще есть странность На событие"вход в документ" если вернуть .F. по идее должно быть заблокировано изменение документа в БЭСТе 4 так и было шапка документа рисовалась синим цветом и никакие попатки сохранить не работали В БЭСТе5 если на событие "Вход в документ" вернуть .F. документ позволяет изменить например количество товара или цену при нажатии F10 ничего не происходит но если нажать Esc то возникает предложение сохраниться при утвердительном ответе предлагает перформировать счет фактуру и спокойно сохраняет приэтом события перед записью с запись документа не срабатывают. Как тогда блокировать документ?
Уважаемые коллеги объясните что не так если можно.
вот листинг 2 InitList() сильно урезано в смысле проверок

Код
//Function u2Init()
 Local cInsDB1, cInsDB2, cInsIdx1, cInsIdx2, aInsStru, I, N, K, K1, J:=0 , CB:=.T.//,BB:={}
 Local aSet, aSetKey//, aScr:=WSelect()
 Local bScr, VK := Chr(10)+Chr(13)
 Local aKval, aEd, aFas, Ch:=.T.,A:={}
 Private aRef, aSortSeek1,cGr,cName,cHeads,cWhen,cGrup:='00001',cValid, _numrec:=0, aKeyFirst:=.F., DocNo:='Новый ',aKols:={},aLinks:={}
// AltD()
 If AllTrim(pCodeOper)='03' //отпуск на фасцех
   bScr:=SaveScreen()
   aSet:=SAVESET()
   aSetKey:=SaveSetKey()
//   WSelect(0)
   SetLastKey(0)
   NetUse('MLabel1',LoadPath() +'\Sclad\Mlabel.dbf')
   MLabel1->(ORDSETFOCUS('MLabel_S'))
   DBPUSH('MKART','MKART')
   DBPUSH('MGrup','Mgrup')
   DBPUSH('Mlabel','MLabel')
   DBPUSH('Spr_Part','TAG_NUM')
   DBPUSH('Mdocm','mdocm',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',Upper(MDoc->Sclad+MDoc->Vid+MDoc->Type+MDoc->CodeDoc+MDoc->NumDoc+DtoS(MDoc->Date))})
// NetUse('MDOC01',LoadPath() +'\Sclad\MDOC.dbf')
// MDOC01->(ORDSETFOCUS('MDOC'))
   NetUse('MDOCM1',LoadPath() +'\Sclad\MDOCM.dbf')
   MDOCM1->(ORDSETFOCUS('MDOCM'))   // UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))
   MDOCM1->(SetScope('UPPER(Sclad+Vid+Type+CodeDoc+NumDoc)', Upper('00000211001'+MDOC->NumDoc1)))
   MDOCM1->(DbGoTop())
//Заполняем таблицу
//AltD()
// создаем временные таблицу
     cInsDB1 := TempFile(m->GlobalTmpPath,"DBF")
     cInsDB2 := TempFile(m->GlobalTmpPath,"DBF")
     cInsIdx1:=Left(cInsDB1,Len(cInsDB1)-3)+'cdx'
     cInsIdx2:=Left(cInsDB2,Len(cInsDB2)-3)+'cdx'
     aInsStru := {{'GRUP','C',5,0},{'NNUM','C',13,0},{'PARTIA','C',5,0},{'NAME','C',25,0},{'KOL','N',19,4},{'KOL1','N',19,4},{'CENA','N',19,4},{'CENA1','N',19,2},{"LINK","C",23,0},{"STAT","N",1,0},{"NUMSTR","N",5,0},{"SERT","C",25,0},{"GTD","C",30,0},{"COUNTRY","C",25,0}}
// Stat = 0 - удалена, 1 - кол. уменьшилось, 2 - без изменений, 3 - кол. увеличелось, 4 - новая запись
     DbCreate(cInsDB1,aInsStru)
     NetUse('TMC1',cInsDB1)
     TMC1->( ORDCREATE(cInsIdx1,'TMCNUM','NUMSTR',{||NUMSTR})  )
     TMC1->( ORDCREATE(cInsIdx1,'TMC','UPPER(GRUP+NNUM+PARTIA)',{||Upper(GRUP+NNUM+PARTIA)})  )
     DbCreate(cInsDB2,aInsStru)
     NetUse('TMC2',cInsDB2)
     TMC2->( ORDCREATE(cInsIdx2,'TMC_LINK','Upper(LINK)',{||Upper(Link)})  )
     TMC2->( ORDCREATE(cInsIdx2,'TMC','UPPER(GRUP+NNUM+PARTIA)',{||Upper(GRUP+NNUM+PARTIA)})  )
     TMC2->(OrdSetFocus('TMC_LINK'))
     N = GetKolMat()
       For I = 1 To N
         AAdd(aLinks,Upper(GetMat(I,105, 5)+GetMat(I,110, 13)+GetMat(I,550,5)))
         AAdd(aKols,GetMat(I,61, 15,.t.))
         TMC1->(ADDREC())
         TMC1->GRUP:= GetMat(I,105, 5)
         TMC1->NNUM:= GetMat(I,110, 13)
         TMC1->PARTIA:= GetMat(I,550,5)
         TMC1->NAME:= GetMat(I,1, 35)
         TMC1->KOL:= GetMat(I,61, 15,.t.)
         TMC1->CENA:= GetMat(I,669, 19,.t.)
         TMC1->LINK:=Upper(GetMat(I,105, 5)+GetMat(I,110, 13)+GetMat(I,550,5))
         TMC1->Stat:=4
         TMC1->NUMSTR := I
         Iif(SPR_PART->(DbSeek(Upper(GetMat(I,105, 18)+GetMat(I,550,5)))),TMC1->Sert:=SPR_Part->SERTIFICAT,)
         Iif(SPR_PART->(DbSeek(Upper(GetMat(I,105, 18)+GetMat(I,550,5)))),TMC1->GTD:=SPR_Part->GTD,)
         Iif(SPR_PART->(DbSeek(Upper(GetMat(I,105, 18)+GetMat(I,550,5)))),TMC1->COUNTRY:=SPR_Part->COUNTRY,)
         TMC1->( F_DBUNLOCK() )
         If GetMat(I,105, 5)='00030'
           TMC2->(ADDREC())
           TMC2->GRUP:= TMC1->GRUP
           TMC2->NNUM:= TMC1->NNUM
           TMC2->PARTIA:= TMC1->PARTIA
           TMC2->NAME:= TMC1->NAME
           TMC2->KOL:= TMC1->KOL
           TMC2->CENA:= TMC1->CENA
           Iif(SPR_PART->(DbSeek(Upper(GetMat(I,105, 18)+GetMat(I,550,5)))),TMC2->CENA1:=SPR_Part->OCENA2,)
           TMC2->LINK:=TMC1->LINK
           TMC2->Stat:=4
           TMC2->Sert:=TMC1->SERT
           TMC2->GTD:=TMC1->GTD
           TMC2->COUNTRY:=TMC1->COUNTRY
           TMC2->( F_DBUNLOCK() )
         EndIf
       Next
   Mdocm1->(OrdSetFocus('MDocM_K'))
   TMC1->(DbGoTop())
   uGlobVars[99]:= cInsDB1 + ',' + cInsDB2 // передача файлов на запись через глобальную переменную
// initlist's
//задание параметров первой прямоугольной области
     DispBox(1,0,13,79,( Chr( 201 ) + Chr( 205 ) + Chr( 187 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 )+' ' ) ,"W+/B")
//задание параметров второй прямоугольной области
     DispBox(13,0,23,79,( Chr( 204 ) + Chr( 205 ) + Chr( 185 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 )+' ' ) ,"W+/B")
//     SayScreen( "==================================T======T======T==============T============",1,1,'W+/B')
     SayScreen( "          Наименование              Квал   Фас    Кол-                Цена  ",2,1,'W+/B')
//     SayScreen("&#9474;==================================&#9474;======&#9474;======&#9474;==============&#9474;==============&#9474;",3,0,'W+/B')
     SayScreen( "Группа        Н/Номер                Партия                                ",12,1,'W+/B')
//     SayScreen("&#9474;------------------------------------------------------------------------------&#9474;",11,0,'W+/B')
//SayScreen("&#9474;==============================================================================&#9474;",13,0,'W+/B')
//     SayScreen("&#9474;==================================T======T======T==============T==============&#9474;",13,0,'W+/B')
     SayScreen( "          Наименование              Квал   Фас    Кол                 Цена  ",14,1,'W+/B')
//     SayScreen("&#9474;==================================&#9474;======&#9474;======&#9474;==============&#9474;==============&#9474;",15,0,'W+/B')
//     SayScreen("&#9474;------------------------------------------------------------------------------&#9474;",21,0,'W+/B')
     SayScreen( "Группа        Н/Номер                Партия                                ",22,1,'W+/B')
     SayScreen( '[Расх. документ ' + AllTrim(MDOC->Numdoc) + ' '+ DtoC(MDOC->Date)+']',1,3,'GR+/B')
     SayScreen( '[Прих. документ ' + AllTrim(DocNo) + ' '+ DtoC(MDOC->Date1)+']',13,3,'GR+/B')
//Справочники
     cHeads:={;
          {'Группа.................... ','Grup'},;
          {'Н/номер................... ','NNum'},;
          {'Наименование.............. ','Name'},;
          {'Единица измерения......... ','ED'},;
          {'Квалиф.................... ','Marka'},;
          {'Сорт...................... ','Sort'},;
          {'Наимен.................... ','Profil'},;
          {'Вес....................... ','Razmer'};
          }
     cWhen:={{||aIn[1]:=cGrup,.F.}}
     cValid:={,{||sValid()}}
     aSortSeek1:={;
          {"- по номеру      ",{"Группа      ","Шифр         "}, {'GRUP','NNUM'},'UPPER(" "+aIn[1]+aIn[2])',,,,'Mlabel_S'},;
          {"- по наименованию",{"Группа      ","Наименование "}, {'Grup','LEFT(Name,15)'},'UPPER(" "+aIn[1]+aIn[2])',,,,'MLab_St'};
          }
     mLabel1->( MAKEREFER("sl","Номенклатурный справочник",1,{"Гр.","Шифр ","Наименование   ","Ед.","Квал.","Фас.","Доп."},{1,1,15},;
          "n/w,w+/n",{"NNUM"},{"aIn[2]"},'UPPER(" "+aIn[1]+aIn[2])',{{||Field->GRUP},{||Field->NNUM},{||Left(Field->NAME,25)},{||Left(Field->ED,5) },{||Left(Field->Marka,6)},{||Left(Field->RAZMER,6)},{||Left(Field->Sort,10)}},;
          aSortSeek1,cHeads, ,cWhen ,cValid ,;
          ,{||mlabel1->(SetScope("UPPER(Status+GRUP)",Upper(" "+aIn[1]))),.t.} ,{||aIn[4]:=Left(Field->Name,25),.t.}, , ,;
          , , , , ,;
          ,'cFind$UPPER(Name)'))
     mGrup->( MAKEREFER("sg","Cправочник групп",1,{"Группа","Наименование  "},;
          {1,1,15}, "n/w,w+/n",{"CODE"},{"aIn[1]"},'UPPER(aIn[1])',;
          {{||Field->CODE},{||Field->NAME}};
          ,,,,,,,,{||cGrup:=Field->Code,.T.},;
          ,,,,,,,,'cFind$UPPER(Name)'))
     aRef:={'SG','SL'}
// Init2(.T.)
     TMC1->(OrdSetFocus('TMCNUM'))
     TMC1->(DbGoTop())
     Do While INIT1(.T.).And.INIT2(.T.)
     EndDo
// записываем
AltD()
   MLabel1->(DbCloseArea())
   MDocm1->(DbCloseArea())
   DBPOP()
   DBPOP()
   DBPOP()
   DBPOP()
   DBPOP()
 //  WSelect(aScr)
   RestSetKey(aSetKey)
   RESTSET(aSet)
   RestScreen(,,,,bScr)
 EndIf
Return .T.
// Return LastKey()!=27


Function INIT1(lFlag)
 Private nTop,nBot,cColHead,aBlockCols,cCurProc,bDel,aHeads,aColors,aColors1
 Private bPreGet
 Private hnrowact //:=1
//altd()
 nTop:=3
 nBot:=11
 cColHead:=76
 сCurProc:={||MOVE1(lFlag,@hnRowAct,m->_numrec,RecNo())}
//Заголовки колонок реестра
 aBlockCols:={;
      {{||Left(MLabel->Name,33)},0},;
      {{||Left(MLabel->Marka,6)},34},;
      {{||Left(MLabel->Razmer,6)},41},;
      {{||Str(Field->kol,14,4)},48},;
      {{||Str(Field->Cena,14,2)},63};
      }
 bDel:={||.F.}
 aColors :={||Iif( Field->Stat = 0 ,"N+/B",Iif(Field->Stat = 1, 'R+/B',Iif(Field->Stat = 2,'W+/B',Iif(Field->Stat = 3,'G+/B','GR+/B'))))}
 aColors1:={||Iif( Field->Stat = 0 ,"N+/W",Iif(Field->Stat = 1, 'R/W',Iif(Field->Stat = 2,'N/W',Iif(Field->Stat = 3,'G/W','GR/W'))))}
//Комментарии
 If lFlag
//   ScrTitul(24, Chr(24)+Chr(25)+":Перемещение, TAb:Переключение F10:Сохранить Esc:Выход")
      SayScreen( "TAb:Переключение F10:Сохранить Esc:Выход                        ", 24,2,'N/W')

 EndIf
 TMC1->(F_SETRELATION("MLABEL","UPPER(Grup+NNum)"))
 TMC1->(InitList(nTop,nBot,cColHead,aBlockCols,сCurProc,,,,,,,,,,,,,,aColors,aColors1,,,,,,,,,hnrowact))
 Return !(LastKey()=27.Or.LastKey()=-9)
//
//Второй инитлист
Function INIT2(lFlag)
 Private mTop,mBot,mLeft,dColHead,bBlockCols,dCurProc,cDel,bHeads,mLeft,bValid,bWhen,bPost,bScrInit, bPict, bHotKey
 Private cPreGet
 Private rnRowAct //:=1
// AltD()
 mTop:=15
 mBot:=21
 mLeft:=1
//Заголовки над полями
 dColHead:=76
 dCurProc:={||MOVE2(lFlag,@rnRowAct)}
// dCurProc:={||2}
//Заголовки колонок реестра
 bBlockCols:={;
      {{||Left(MLabel->Name,33)},0},;
      {{||Left(MLabel->Marka,6)},34},;
      {{||Left(MLabel->Razmer,6)},41},;
      {{||Str(Field->kol,14,4)},48},;
      {{||Str(Field->Cena,14,2)},63};
      }
//Описание полей ввода
 bHeads:={;
      {"Группа................: ","GRUP"},;
      {"Номенклатурный номер..: ","NNUM"},;
      {"Пвртия................: ","Partia"},;
      {"Наименование..........: ","NAME"},;
      {"Количество............: ","KOL"},;
      {"Цена..................: ","Cena"},;
      {"Цена продажная без НДС: ","Cena1"}}
// bWhen:={,{||uBeforeIn()},{||.F.},{||.F.},,{||uBefore1()},{||uBefore1()}}
// bValid:={,{||uCheck2()},,,{||uCheck5()},{||uCheck6()},{||uCheck7()}}
 bPost:={||uSaveRec()}
// cDel:={||uCheckDel()}
 cDel:={||.F.}
 bPict:={,,,,'99999999999.9999','99999999999.9999','99999999999.9999'}
// bScrInit:={||uBeforeIn()}
 If lFlag
//   ScrTitul(24, Chr(17)+Chr(217)+ ":Изменить F4:Ввод новой F8:Удаление F10:Сохранить Esc:выход")
      SayScreen( "Enter:Изменить F4:Ввод новой F8:Удаление F10:Сохранить Esc:выход", 24,2,'N/W')

 EndIf
 TMC2->(SetScope('Upper(Link)',Upper(TMC1->Link)))
 TMC2->(DbGoTop())
// AltD()
 TMC2->(F_SETRELATION("MLABEL","UPPER(Grup+NNum)"))
 TMC2->(InitList(mTop,mBot,dColHead,bBlockCols,dCurProc,bHeads,m->aRef,bPict,bWhen,bValid,,cDel,bScrInit,,,bPost,,,,,,,,,,,,,,m->bHotKey))
 Return !(LastKey()=27.Or.LastKey()=-9)
Function MOVE1(_xlActiv,hnRowAct,xRec,xRec1)
 Local m1end, m1Ar
 m1End:=2
// AltD()
 m1Ar:=TMC1->( QScroll() )
 hnRowAct:=m1Ar[6]
 If LastKey()=9     // клавиша Tab
//   TMC1->(QOFF())
   SetLastKey(0)
   m1End:=0
 Else
   If LastKey()=-9
       m1End:=0
   Else
     If xRec ==NIL.Or.xRec<>xRec1
       Init2(.F.)
       m->_numrec:=xRec1
     EndIf
     If _xlActiv
       m1End:=2
       TMC1->(F_SETRELATION("MLABEL","UPPER(Grup+NNum)"))
       SayScreen( TMC1->Grup, 12,8,'N/W')
       SayScreen( TMC1->NNUM, 12,23,'N/W')
       SayScreen( TMC1->Partia, 12,45,'N/W')
       SayScreen( MLabel->ED, 2,55,'GR+/B')
//       SayScreen( Left(MLabel->NAME,25), 12,51,'N/W')
     Else
       QOff()
       m1End:=0
     EndIf
   EndIf
 EndIf
 Return m1end

Function MOVE2(_lActiv,rnRowAct)
 Local m2End,m2Ar
 m->aKeyFirst:=.T.
// AltD()
 m2Ar:=TMC2->(QScroll())
 rnRowAct:=m2Ar[6]
// SayAndWait("INIT2"+Str(LastKey()))
 If LastKey()=9.Or.!_lActiv
   TMC2->(QOFF())
   SetLastKey(0)
   m2End:=0
   TMC2->(F_SETRELATION("MLABEL","UPPER(Grup+NNum)"))
   SayScreen( TMC2->Grup, 22,8,'N/W')
   SayScreen( TMC2->NNUM, 22,23,'N/W')
   SayScreen( TMC2->Partia, 22,45,'N/W')
   SayScreen( MLabel->ED, 14,55,'GR+/B')
 Else
//Altd()
   If LastKey()=-9
       m2End:=0
   Else
     m2End:=2
     TMC2->(F_SETRELATION("MLABEL","UPPER(Grup+NNum)"))
     SayScreen( TMC2->Grup, 22,8,'N/W')
     SayScreen( TMC2->NNUM, 22,23,'N/W')
     SayScreen( TMC2->Partia, 22,45,'N/W')
     SayScreen( MLabel->ED, 14,55,'GR+/B')
   EndIf
 EndIf
 Return m2End

Function uSaveRec()
 Local I:=0, K1:="", K2:=""
//AltD()
 Iif(mLabel->(DbSeek(Upper(TMC1->GRUP+TMC1->NNUM))),K1 := mLabel->Marka,)
 Iif(mLabel->(DbSeek(Upper(TMC2->GRUP+TMC2->NNUM))),K2 := mLabel->Marka,)
 TMC2->(RecLock())
 TMC2->Link:=TMC1->Link
 If Upper(AllTrim(K1))==Upper(AllTrim(K2))
   TMC2->Sert:=TMC1->Sert
   TMC2->GTD:=TMC1->GTD
   TMC2->Country:=TMC1->Country
 EndIf
 Iif(nApp=2,TMC2->Stat:=4,)
 TMC2->(F_DBUnlock())
 I := AScan(ALinks,Upper(TMC1->Link))
 If nApp = 2
   aKols[I]:=aKols[I]-aIn[5]
 Else
   aKols[I]:=aKols[I]-aIn[5]+aLastIn[5]
 EndIf
 Return .t.

 
 
[QUOTE]Сергей Иваницкий пишет:
При этом происходит списание со склада "Фасцех" иными словами фасуем товар списываем один номенклатурный номер, приходуем на основной склад с другим ном.номером. Реализовано это было так:
на событи "перед записью" проверялась опреция 03 и если это так запускалась функция из 2-х InitList() (создаются 2 временных таблицы БД). В одном InitList()-е товар из документа в другом к этому товару каждой позиции выбирался из справочника другой товар или несколько товаров. соответственно призводятся всякие проверки и пр. После сохранения в uGlobVars[99](объявлена при входе в документ) записываются имена временных таблиц. После этого на событие "запись документа" создается документ прихода на основании таблицы 2 в БД MdocM добавлено поле uLink (С23) (Grup+nnum+partia)через которое устанавливается связь между строками прихода и расхода.
[/QUOTE]И вы все это в таком виде решили в БЭСТ-5 потянуть?
Вместо того чтобы сейчас сделать одну табличку сопоставления по возможности автоматизированную и потом кнопушу сделай цепочку накладных сама. А в папку пользователя положить контрольную таблицу связки.
Все телодвижения операторов станут примерно такими: проверить сопоставления.
И посмотреть как потом все само построится в течении пары минут - не надо ничего создавать проверять, добавлять.импортировать
ВООБЩЕ ничего !
Надо найти время и сделать нормально. Переходите на новую программу - сделайте нормальный грамотный плагин людям.
Упростите им жизнь !
Изменено: nordk - 02.06.2015 16:38:07
 
Цитата
nordk пишет:
И вы все это в таком виде решили в БЭСТ-5 потянуть?
Вместо того чтобы сейчас сделать одну табличку сопоставления по возможности автоматизированную и потом кнопушу сделай цепочку накладных сама. А в папку пользователя положить контрольную таблицу связки.
Все телодвижения операторов станут примерно такими: проверить сопоставления.
И посмотреть как потом все само построится в течении пары минут - не надо ничего создавать проверять, добавлять.импортировать
Спасибо за ответ Коенстантин, но я ничего не понял.
К сожаленнию сделать 1 табличку сопоставлений не получится, у нас товар часто фасуется под клиента и размер фасовки или наименование товара заранее неизвестно. Да шаблоны это Хорошо, но вот что делать мне с вполне работающим механизмом на БЭСТ4, почему не вызывается событие на запись документа? вот Вопрос.
 
Давайте так - это мое сугубо личное убеждение.
БЭСТ-4 и БЭСТ-5 это программы разных классов.
И старый подход это примерно как из запорожца бензиновую печку в иномарку пытаться засовывать.
Плагин адаптировать можно конечно, но почему бы не использовать всю мощь нового ?

Событие вызывается - вы можете навставлять вызовы отладчика и во всем убедиться
Копошиться над ним правильно ли ? Надо ли свои ресурсы на это это тратить - вот в чем Вопрос ?
Лично мне свое время на это жалко....даже в качестве помощи
У вас старые связки по старым индексным ключам - теперь в строках есть аналитика, а лучше просто использовать гуиды
и так далее и так далее
Надо открывать отладчик и по нему пошагово все смотреть.

Насчет не получится - вы сделали алгоритм сопоставления ?
У Вас он получился ? Раз плагин был и работал - значит получился....
Только дальше то что.
Оператор должен руками создать один документ, потом руками создать второй, залить туда строки
Куча контролей перед записью и так далее....

Вместо этого смотрите в примере как делается документ
И хотябы вот в том экране с двумя инитлистами делаете кнопку создать документы.
Вызываете функцию по которой оба документа создадутся сами без участия рук оператора
И ваша задача остается только наполнить эти инит-листы информацией и все !!!
А на запись и удаление поставить защиту по гуидам строк документов
И для сопоставления этих строк завести одну табличку из двух полей
гуид строки документа расхода и гуид строки связанного с ним документа прихода - ВСЕ
Если строка найдена во второй, то первую нельзя править и удалять
как то так

До конца мне Ваша задача не ясна
но общий путь я попытался пояснить
Понимаю что в отличии от меня впервые вы будете делать это не быстро
Но поверьте - когда в этом руку набьете и создание подобной схемы не будет занимать у вас
больше чем 2 дня - вы все прочувствуете и по другому никогда больше в товарах ничего делать не захотите
 
Еще хочу добавить.
Когда мне пришлось доводить до ума работу БЭСТ-Питания.
У меня была задача всяких разных фасовок и новых имн блюд и т.п.
Я никогда не знал что и как будет.
Я просто увязывал новое наименование с созданием номенклатурного номера, если нужно создать
Решил сам для себя в какие группы и как их буду нумеровать
Продумал эти правила.

А дальше просто создаю документ через штатный объект.
При его создании когда доходит до момента наполнения его строками - создаю перед этим нужные номенклатуры.
Вы говорите фасовка ?
А аналитика которая живет не дальше самой накладной ???
Если допустим у меня амбар зерна.
И я начинаю его фасовать всякий раз как попало.
Пример отпускаю 100 кг зерна и один мешок 50 кг, второй 20, третий 30
Чтобы я стал делать ?
1.Готовлю документ списания 100 кг зерна на фасовку
2.готовлю документ прихода фасованного зерна - ТА ЖЕ НОМЕНКЛАТУРА !!!!! только в накладной прихода в аналитику строки пишу 50
во второй 20, в третью 30
3.готовлю документ продажи клиенту такой же документ с такими же аналитиками с продажными суммами по строкам
Все документы собраны в одну пачку.
Теперь в эту пачку добавляю режим печати 3 документа и с/ф к нему
Последним действием говорю БЭСТу - "фас"
Он по моим инструкциям делает все документы - пользователь сидит минуты 3 и наблюдает за процессом или если хотите
"курит бамбук". Берет бумажку из принтера, печать, подпись и поехали.
Причем все это мне позволяет сделать с компьютера прямо в амбаре. подключенного к весам если надо. с планшета или
терминала сбора данных....
Просто совершенно другие бизнес процессы - раньше такого мы просто не могли
 
Спасибо Константин.
Меня правда интересовало больше почему не срабатывает заявленный механизм соответствующих событий, а не алгоритм программы.
Цитата
Сергей Иваницкий пишет:
Теперь о проблеме, в БЭСТе 5 так не получается у меня.
вернее 2 InitList()-а появляются и работают в смысле заполняются и т. д. но после их завершения если возвращается .T. не вызывается функция "запись документа", если возвращается .F. при следующем нажатии F10 не вызывается не только событие "запись документа" но и событие "перед записью", документ просто сохраняется.
Еще есть странность На событие"вход в документ" если вернуть .F. по идее должно быть заблокировано изменение документа в БЭСТе 4 так и было шапка документа рисовалась синим цветом и никакие попытки сохранить не работали В БЭСТе5 если на событие "Вход в документ" вернуть .F. документ позволяет изменить например количество товара или цену при нажатии F10 ничего не происходит но если нажать Esc то возникает предложение сохраниться при утвердительном ответе предлагает переформировать счет фактуру и спокойно сохраняет при этом события перед записью с запись документа не срабатывают. Как тогда блокировать документ?

Если интересно напишу в чем смысл моего плагина.
я его написал давно и операторы привыкли.
Создается обычная расходная накладная на списание с фасцеха штатными средствами БЭСТ
в общем предполагается её повторное открытие и редактирование в самых широких пределах иногда операторы списывают не ту партию или еще что-то путают и задним числом приходится исправлять отсюда проверки так как может быть расход в сопряженном документе, далее почему 2 инитлиста - просто удобно мне, можно по другому как-то организовать, но зачем? механизм вполне отлажен, создавать каждый раз новый ном. номер на мой взгляд не очень Хорошо пусть выбирают из существующего, если есть создавать приходится не часто, а справочник партий и картотека у меня создавались без участия оператора, по большому счету оператор вводит только группу, ном.номер из справочника, количество и продажную цену если не согласен с предлагаемой.
Насчет создания документа через объект уже подумывал, может так и сделаю видел пример но описания объектов не нашел может Плохо искал. Через гуид строк предложение правильное может воспользуюсь, но оно не отменяет создания дополнительного поля для связи и потом перед сохранением документа записи его строк в БД еще нет и как узнать их гуид не знаю может getmat()?

У меня просбьа попробуйте скомпилировать программу как есть и повесьте ее на событие перед записью а на событие запись что нибудь вроде

Код
altd()
SayAndWait('Ура!')
Return .T. 
Мне интересно, у меня одного такая глючня или у всех, желательно попробовать и с новым и с существующим документом.
 
А мы точно про БЭСТ-5 говорим ?
я каждый день обрабатываю события и чтобы у меня не сработал отладчик....
А вы вообще режим отладки включаете ? Может в этом дело ? Для меня это как то само собой и значения не придаю даже
 
Цитата
nordk пишет:
А мы точно про БЭСТ-5 говорим ?
Точно
Если в плагине на событие "перед записью" не использовать инитлист то все отрабатывает штатно.
Цитата
Сергей Иваницкий пишет:
Еще есть странность На событие"вход в документ" если вернуть .F. по идее должно быть заблокировано изменение документа в БЭСТе 4 так и было шапка документа рисовалась синим цветом и никакие попатки сохранить не работали В БЭСТе5 если на событие "Вход в документ" вернуть .F. документ позволяет изменить например количество товара или цену при нажатии F10 ничего не происходит но если нажать Esc то возникает предложение сохраниться при утвердительном ответе предлагает перформировать счет фактуру и спокойно сохраняет приэтом события перед записью с запись документа не срабатывают. Как тогда блокировать документ?
Тут проверил события срабатывают, просто на выбранный документ ничего не влияло, но то что документ можно изменить и сохранить -факт, хотел прикрепитьвородовские документы со скриншотами, пишет ошибка при сохранении.
Best5.docx При сохранении файла произошла ошибка.Bes5_2.docx При сохранении файла произошла ошибка.
 
Разработчикам видимо не интересно, они непогрешимы
Предлагаю всем желающим откомпилировать 2 маленьких плагина и потестировать срабатывание событий.
напомню у меня БЭСТ5.34.32.13
На открытие и запись:.

Код
altd()
Return  NoOrYes("Нажми кнопку",2,{" Да "," Нет "})=1 
на событие перед записью:

Код
// AltD()
 dbPush()
 NetUse('Mprim01',LoadPath() +'\Sclad\Mprim.dbf')
 DispBox(1,0,23,79,'' )
 SayScreen( "Наименование ",2,1,'W+/B')
 MPRIM01->(InitList(3,20,76,{{{||Mprim01->Name},0}}))
 Mprim01->(DbCloseArea())
 DBPop()
 Return .T.
Я утверждаю (по крайней мере у меня так), что событие "Запись документа" не сработает.
если закомментировать строку
Код
 //MPRIM01->(InitList(3,20,76,{{{||Left(MPrim01->Name,33)},0}})) 
то событие "Запись документа" сработает.

А если при открытии ответить "Нет" вроде как документ нельзя править, оказывается можно исправить содержимое накладной вплоть до добавления или удаленя новых позиций и сохранение происходит по клавише Esc на Вопрос можно ответить "Записать" и все записывает.
 
По поводу Инитлист
Вот последний раз пишу что БЭСТ-4 и БЭСТ-5 разные программы.
Инитлист влечет за собой переназначение событий и так далее.
Пихать его в события - последнее дело.
Не тестировал, не тестирую этот способ и тестировать не буду.

Уже столько раз на практике самым отъявленным доказательствам разбивал эти рассуждения
И показывал работу событий. нет желания тратить на это время
Хотите - ковыряйтесь ищите и помните. что теперь это класс. а не как раньше и все возможности надо восстанавливать
Включая назначенные кнопки.
В каждом случае надо сидеть и ковырять переменные.
Есть объекты - ВСЕ ! Штатный механизм и никакой отсебятины.

Что касается события "перед записью"
написал простейший код

RETURN .F.

Проще некуда
Подвесил - ни при записи, ни запись после ESC, ни запись перед печатью - все перекрыто.
Где Вы там запутались - не знаю.
Проще всего утверждать что ошибается кто то, а не я сам.... Подходите внимательнее к Вопросу пожалуйста
 
Спасибо Константин, что хоть вы пишите. Однако
Цитата
nordk пишет:
Вот последний раз пишу что БЭСТ-4 и БЭСТ-5 разные программы.
Инитлист влечет за собой переназначение событий и так далее.
Пихать его в события - последнее дело.
Не тестировал, не тестирую этот способ и тестировать не буду.
Зачем разработчик сует в сопроводительную документацию описание этой функции Initlist() могли бы написать про ограничения у меня с ними нет пока тесных отношений и как она там работает мне не ведомо.
Цитата
nordk пишет:
Есть объекты - ВСЕ ! Штатный механизм и никакой отсебятины.
Описание объектов крайне скудное programming in best-5.chm, где бы разжиться поподробней.

Цитата
nordk пишет:
Проще всего утверждать что ошибается кто то, а не я сам.... Подходите внимательнее к Вопрос у пожалуйста
Помнится Вы меня как-то тоже убеждали что я не прав пост 31.

Как обойти мою проблему с инитлистом я придумал, корявенько но работать будет, я теперь про другое, может тему открыть?

Цитата
Сергей Иваницкий пишет:
На событие"вход в документ" если вернуть .F. по идее должно быть заблокировано изменение документа, в БЭСТе 4 так и было шапка документа рисовалась синим цветом и никакие попатки сохранить не работали. В БЭСТе5 если на событие "Вход в документ" вернуть .F. документ позволяет изменить например количество товара или цену при нажатии F10 ничего не происходит но если нажать Esc то возникает предложение сохраниться при утвердительном ответе предлагает перформировать счет фактуру и спокойно сохраняет
Я тут сделал скриншотов, не знаю даже может это у меня такой глюк или "особенность"
На событие "вход в документ" написана функция.
Код
Altd()
Return .F.
 
Уважаемые коллеги, скомпилируйте ее и повесьте на событие "вход в документ"
Напомню у меня бэст 5.34.32.13 и попробуйте изменить в существующем документе например количество в любой строке. Нажмите Esc и на Вопрос "Записать откорректированный документ" ответьте записать. Мне интересно это только у меня исправленный документ сохраняется или это так и должно быть?

 
Цитата
Сергей Иваницкий пишет:
Описание объектов крайне скудное programming in best-5.chm, где бы разжиться поподробней.

Полный исходный код лежит у вас в папке БЭСТа при установке комплекса.
Подробней просто некуда.
 
Цитата
На событие "вход в документ" написана функция.

ПРИЧЕМ ТУТ ВХОД
Защиту надо ставить не на вход а на запись !!!!
 
СОбытие на вход не будет работать если у вас несколько плагинов подвешены на вход - будет работать по первому.
Если даже вы оставите один - по корректировке зайдете, заблокируется только создание нового.
\И разумеется по корректировке вы измените документ.

Такую цепочку развития я подтверждаю.

И еще раз пишу к контролю записи это не имеет никакого отношения
 
Цитата
Сергей Иваницкий пишет:
Зачем разработчик сует в сопроводительную документацию описание этой функции Initlist() могли бы написать про ограничения у меня с ними нет пока тесных отношений и как она там работает мне не ведомо.

Нет никаких ограничений !!!!
Это все равно что писать разработчику почему вы не предупреждаете что в заблокированную запись значения не вносятся...
Это область знания языка программирования.

Разработчик предоставил Вам исходный код ?
предоставил.
Там есть описание класса Initlist ?
Есть
Разработчик сделал удобным чтобы события могли быть в любом инитлист и не надо было специально под отдельный экран просить
Сделал
Должен программист уметь думать над тем что это может дать, изменить и т.п. ?
должен, потому как это не на пользователя рассчитано. а на программиста
Вам говорят что программы абсолютно разные ?
Говорят
Говорят что плагины "в лоб" не перейдут?
Говорят

Все остальное. извините это упрямство и его результаты.
 
Цитата
nordk пишет:
Если даже вы оставите один - по корректировке зайдете, заблокируется только создание нового.
Спасибо, видимо я пишу не понятно, У меня написаны плагины на вход, запись и после записи, на все три события, в них проверяются разные вещи, разумеется некоторые взаимосвязаны. На каждое событие подвешен 1 плагин.
Теперь мне необходимо чтобы ранее созданный документ при некоторых условиях нельзя было редактировать, в БЭСТЕ4 я в событии "Вход в документ" возвращал .F. и документ нельзя было изменить, в бэсте5 оказывается нельзя изменить только шапку документа, и как мне быть?
 
Я просто хочу понять

Цитата

Плагин “Вход в документ” выполняется сразу после того, как отобразится форма с документом и инициализируются все рабочие переменные, то есть непосредственно перед началом ввода/редактирования данных. Существующая переменная nApp информирует о режиме вызова: nApp=1 – режим редактирования, nApp=3 – ввод данных в новый документ. Если функция возвращает 0 (или .F.), то следующий вход в документ невозможен.
из выше сказанного я не могу войти в документ в следующий раз, а не при текущем открытии?
Как мне этими событиями пользоваться, я не смог нормально воспользоваться ни одним из них.
 
Цитата
nordk пишет:
Нет никаких ограничений !!!!
Это все равно что писать разработчику почему вы не предупреждаете что в заблокированную запись значения не вносятся...
Это область знания языка программирования.

Разработчик предоставил Вам исходный код ?
предоставил.
Там есть описание класса Initlist ?
Есть
Разработчик сделал удобным чтобы события могли быть в любом инитлист и не надо было специально под отдельный экран просить
Сделал
Должен программист уметь думать над тем что это может дать, изменить и т.п. ?
должен, потому как это не на пользователя рассчитано. а на программиста
Вам говорят что программы абсолютно разные ?
Говорят
Говорят что плагины "в лоб" не перейдут?
Говорят

Все остальное. извините это упрямство и его результаты.
Я то думал, что разработчики пишут свои функции чтобы облегчить работу тем кто ими пользуется, оказывается это не так.
 
Цитата
Сергей Иваницкий пишет:
Теперь мне необходимо чтобы ранее созданный документ при некоторых условиях нельзя было редактировать, в БЭСТЕ4 я в событии "Вход в документ" возвращал .F. и документ нельзя было изменить, в бэсте5 оказывается нельзя изменить только шапку документа, и как мне быть?

Вход в документ отвечает не за изменение а за вход в документ.
Вариантов развития несколько:
1.Обращайтесь в службу поддержки с вопросом запретить вход в принципе при событии возвращаемом .F.
По логике вещей так должно быть.
Только выражайтесь точно - вход это вход, а запись - это запись
А то у Вас тема про одно . а говорите про другое
2.Объявляете свою public переменную , управляете ее значениями во входе -.T. или .F.
и если она .F. - то в событии на запись сразу возвращать F.
 
Цитата
Сергей Иваницкий пишет:
Я то думал, что разработчики пишут свои функции чтобы облегчить работу тем кто ими пользуется, оказывается это не так.

Функции оставляйте в прошлом пожалуйста
Давайте стараться оперировать классами и методами
Именно объекты облегчают работу тем, кто ими пользуется
и последнее - разработчики пишут функции не для пользователей !!!
неумение ими пользоваться и незнания элементов программирования - не их зона ответственности
Для своих программистов они существенно облегчили работу новыми изменениями
 
Цитата
Сергей Иваницкий пишет:
Я просто хочу понять
Цитата

Плагин “Вход в документ” выполняется сразу после того, как отобразится форма с документом и инициализируются все рабочие переменные, то есть непосредственно перед началом ввода/редактирования данных. Существующая переменная nApp информирует о режиме вызова: nApp=1 – режим редактирования, nApp=3 – ввод данных в новый документ. Если функция возвращает 0 (или .F.), то следующий вход в документ невозможен.
из выше сказанного я не могу войти в документ в следующий раз, а не при текущем открытии?
Как мне этими событиями пользоваться, я не смог нормально воспользоваться ни одним из них.

С событием на вход "косяк" на мой взгляд имеет место
Единственно что переменная nApp несколько устаревшее
Документы становятся сложнее
Страницы: 1
Читают тему (гостей: 1)