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

TXO API

Добавлено: 02 дек 2005, 17:55
Sheinina
Ситуация следующая:
по приходной накладной надо сформировать проводки так, чтобы:
- счет/субсчет по дебету определялся складом, на который приходуется
- субсчет по кредиту определялся партией
- КАУ1 дебета определялось из пользовательской аналитики в соответствии с партией
- КАУ2 кредита определялось из каталога МЦ в соответствии со складом оприходования (есть некая виртуальная связь склад - матценность).
Большая просьба, не выяснять, почему так криво поставлен учет. Объяснить все равно не смогу, принимаем как данность.
Пытаюсь написать ТХО АРИ.

Добавление в меню:

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

VipInterface TxoMenu_SlideIn implements ObjTxoMenuPlugin;
Interface TxoMenu_Slidein;
create view;
procedure OnMakeMenu(hMenu : ObjTxoMenuServer);
{   
    hMenu.AddTxoMenu(mnuFlUserKau, 0, 0,    'separator', '');
    hMenu.AddTxoMenu(mnuFlUserKau, 0,6002, '<авто - текст/слайд>', '<Из КАУ 152>');
    hMenu.AddTxoMenu(mnuFlUserKau,0,6003, '<авто - № издания>',  '<По KatMC>');
    hMenu.AddTxoMenu(mnuFlSchSub,  0, 0,    'separator', '');
    hMenu.AddTxoMenu(mnuFlSchSub,  0,6000 , '<авто - номер № или в РП>',  '<режим №>');
    hMenu.AddTxoMenu(mnuFlSchSub,  0,6001 , '<авто - откуда>',   '<режим источника>');
}
procedure OnSetEnableMenu(hMenu : ObjTxoMenuServer; TiDkGal, SysOper : word);
{
   // определить доступность добавленных нами режимов формирования счета и аналитики
   //

   if TidkGal=word(101)
   {
      hMenu.EnableMenu(mnuFlUserKau, 0, 6002);
      hMenu.EnableMenu(mnuFlUserKau, 0, 6003);
      hMenu.EnableMenu(mnuFlSchSub,  0, 6000);
      hMenu.EnableMenu(mnuFlSchSub,  0, 6001);
   }
   else
   {
      hMenu.DisableMenu(mnuFlUserKau, 0, 6002);   
      hMenu.DisableMenu(mnuFlUserKau, 0, 6003);   
      hMenu.DisableMenu(mnuFlSchSub,  0, 6000);  
      hMenu.DisableMenu(mnuFlSchSub,  0, 6001);   
   }
}
end.
В самой реализации TXO view-ха и процедура StoreCycles:

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

create view SlideIn
var
  CurSoprDoc  : comp;
  sumPr       : double;
as select
  *
from
  sklorder, sporder, katparty

where
((
// ордера, склады и партии
    CurSoprDoc     == sklorder.csopr
and Sklorder.nrec  == sporder.csklorder
and sklorder.cpodr == katpodr.nrec
and sporder.cparty == katparty.nrec
))
;

procedure StoreCycles(hTxo: longint; buf: TTxoApiInfoDoc);
{
  //установим ограничения на логическую таблицу
  set CurSoprDoc := buf.cSoprDoc;

  s_sch_deb:=''; s_subsch_deb:=''; s_sch_kr:=0; s_subsch_kr:='';
  all_correct:=false;

  if (getfirst Sklorder = tsOK) then
     if (getfirst katpodr = tsOK) then
        if (getfirst katparty = tsOK) then  
           all_correct:=substr(katpodr.kod,1,4)='1602';
  if all_correct then {
     _loop sklorder {
        _loop sporder {
           // формирование счетов и субсчетов
           s_sch_deb:=Schet_debet(...);
           s_subsch_deb:=SubSch_Debet(...);
           s_sch_kr:=Schet_Kredit(...); 
           s_subSch_kr:=SubSch_Kredit(...);    

           TXOBodyClear(hTxo);
           TxoBodyAddSchet(hTxo, 6000, s_sch_deb, s_subsch_deb);
           TxoBodyAddSchet(hTxo, 6001, s_sch_kr, s_subsch_kr);

           // формируем КАУ по партии и МЦ
           if instr('что-то там', katpodr.name)=0 then {
              if RunInterface('Sel_KAU_MC',katpodr.kod,katpodr.name,ckau_MC)<> cmCancel then {
                 if katparty.kod=own_slide then 
                    TXOBodyAddKau(htxo,0,tbl_kau_20,ckau_slide);
                 if katparty.kod=own_text then
                    TXOBodyAddKau(htxo,0,tbl_kau_20,ckau_text);
                 TXOBodyAddKau(htxo,0,cgKau_KatMC,ckau_mc);
              }
           }
           //для 'что-то там' КАУ не формируется
           // формирование суммы
           sum_pr:=sporder.kol*sporder.srprice;
           TXOBodySetSum(htxo,sum_pr,0,sporder.kol);
           TXOBodyInsert(htxo);          
        }
     }
  }
}
Интерфейс Sel_KAU_MC нужен для выбора МЦ в аналитику, т.к. формализовать полностью связь МЦ <-> склад невозможно.

Настройка ТХО:

Дебет: счет <режим №> субсчет <режим №>
Кредит: счет <режим источника> субсчет <режим источника>
Алгоритм - &VIP_[Obj:"мой интерфейс"]
Циклическая обработка счет/субсчет, КАУ152, Материальные ценности

Проблемы:
- КАУ не формируется категорически
- при оприходовании на 2 разных склада выдается ошибка "Проводка не сформирована, т.к. не определен счет по дебету"

Все константы описаны, все функции отрабатывают (строчки с TXODebugMSG я сознательно убрала)
Где и чего я напортачила, подскажите, пожалуйста :oops:

Добавлено: 02 дек 2005, 20:59
Seybukan
VipInterface TxoMenu_SlideIn implements ObjTxoMenuPlugin;
Interface TxoMenu_Slidein;
Будет работать тока для нециклических обработок!
Пишите в режимы формирования аналитики 0-9.

Добавлено: 05 дек 2005, 11:59
Sheinina
Так в том и проблема, что мне надо, чтобы работало для циклических. Накладная ПРИНЦИПИАЛЬНО имеет право быть для нескольких складов!

Добавлено: 05 дек 2005, 14:11
Seybukan
Пишите через режимы 0-9:
TxoBodyAddKau(hTxo,wFlKau_Mode0,cgKau_KatPodr,Buldo.Podr);
TxoBodyAddKau(hTxo,wFlKau_Mode1,cgKau_KatPodr,Cur_cPodr);
TxoBodyAddSchet(hTxo,wFlKau_Mode0,Cur_Schet,Buldo.SubSch);
Без использования VipInterface TxoMenu_SlideIn implements ObjTxoMenuPlugin;

Добавлено: 05 дек 2005, 14:12
Seybukan
Константы wFlKau_Mode(0-9) это режимы 160-169.

Добавлено: 05 дек 2005, 14:41
Sheinina
Уточняю вводные:
счет/субсчет дебета определяется складом оприходования
КАУ1 дебета - партией
КАУ2 дебета - склада

счет/субсчет кредита - партией
в программе:

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

              if instr('ЧТО-ТО ТАМ', UPCASE(katpodr.name))=0 then {
                 if RunInterface('Sel_KAU_MC',num_naz,katpodr.kod,katpodr.name,ckau_MC)<> cmCancel 
                 then {
                    if katparty.kod=own_slide then 
                       TXOBodyAddKau(htxo,wFlKau_Mode0,tbl_kau_20,ckau_slide);
                    if katparty.kod=own_text then
                       TXOBodyAddKau(htxo,wFlKau_Mode0,tbl_kau_20,ckau_text);
                    TXOBodyAddKau(htxo,0,cgKau_KatMC,ckau_mc);
                 }
              }
              //для 'ЧТО-ТО ТАМ' КАУ не формируется
              TxoBodyAddSchet(hTxo, wFlKau_Mode0, s_sch_deb, s_subsch_deb);
              TxoBodyAddSchet(hTxo, wFlKau_Mode1, s_sch_kr, s_subsch_kr);
              // формирование суммы
              sum_pr:=sporder.kol*sporder.srprice;
              TXOBodySetSum(htxo,sum_pr,0,sporder.kol);
              TXOBodyInsert(htxo);          
В протоколе

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

 Ошибка       Проводка не сформирована, так как не определен счет по дебету!
И чего делать?

Добавлено: 06 дек 2005, 20:39
Seybukan
Значит s_sch_deb; s_subsch_deb не определены!

Добавлено: 06 дек 2005, 20:47
Sheinina
Определены! Вот кусочек протокола:

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

 135  Start                                                                          
 146   SP                                                                             

 155   000015 05/12/2005                                                              
 157   1602010101 Тексты                                         
 163   Дебет: 420/01 Кредит: 497/02   
 173   Выбрали МЦ                                                                     
 220  Заносим сумму 120.00                                                           

 155   000089 05/12/2005                                                              
 157   1602010100 Слайды                             
 163  Дебет: 420/01 Кредит: 497/10                                                   
 173   Выбрали МЦ                                                                     
 220  Заносим сумму 100.00                                                           
 Ошибка       Проводка не сформирована, так как не определен счет по дебету!                 

Добавлено: 06 дек 2005, 20:50
Seybukan
Циклическая счет субсчет точно стоит?

Добавлено: 07 дек 2005, 11:55
Sheinina
Точно:)
ТХО настроена так:
Дебет <авто> <авто>
Кредит <авто> <авто>
Алгоритм в НДЕ &VIP_[Obj:"SLIDEWHITE"]
Циклическая обработка
Счет/субсчет КАУ152 МЦ

Добавлено: 08 дек 2005, 11:41
Seybukan
Надо так:
Дебет <Режим 0><Режим 0>
Кредит <Режим 1><Режим 1>

Добавлено: 08 дек 2005, 11:43
Алексей
Верно, у вас же в коде написано у самой:
TxoBodyAddSchet(hTxo,wFlKau_Mode1, s_sch_kr, s_subsch_kr);

Добавлено: 08 дек 2005, 12:26
Sheinina
Поняла, простите бестолковку. Просто уже обалдела я совсем от этого "механизма" :eek: Только вот никак не понимаю, как КАУ в проводку впихнуть. Вроде как все написала...
Причем уже от безисходности пробовала и :

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

    TXOBodyAddKau(htxo,0,152,ckau_slide);
    TXOBodyAddKau(htxo,0,cgKau_KatMC,ckau_mc);
и

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

    TXOBodyAddKau(htxo,wFlKau_Mode0,152,ckau_slide);
    TXOBodyAddKau(htxo,wFlKau_Mode0,cgKau_KatMC,ckau_mc);

Не встает КАУ, хоть убейся... Что ей от меня нужно? :shock:

Добавлено: 08 дек 2005, 12:40
Seybukan
Поскольку счета стоят автоматом, поэтому не понятно какое КАУ пихать.
Для этого вам необходимо режим редактирования ТХО включить "полный" по Alt+S.
И дебет будет уже не слева, а сверху! :)
Вообщем теперь есть возможность указать каталог аналитики и режим ее формирования!
Причем не важно на каком уровне вы его зададите.
Это сделано для того, если у вас могут определяться например по Дебету счета с разными аналитиками на КАУ1 или КАУ2 или там еще где.
Ну например Сч. 10 КАУ1 МЦ Сч. 08 КАУ1 Карточка ОС
То в таком алгоритме (авто счет субсчет) надо явно указать каталоги МЦ и Карточка ОС!

Добавлено: 08 дек 2005, 12:56
Sheinina
Счета я поставила <режим 0> и <режим 1> соответственно по дебету и по кредиту (как Вы рекомендовали в предыдущем совете).
Попыталась в режиме "полный" поставить по дебету КАУ1 "152 группа" (авто)
КАУ2 "Материальные ценности" (авто) - все равно не формируются.
и в интерфейсе:

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

              if instr('РП', UPCASE(katpodr.name))=0 then {
                 if RunInterface('Sel_KAU_MC',num_naz,katpodr.kod,katpodr.name,ckau_MC,nkau_MC)<> cmCancel then {
                    TxoDebugMsg(hTxo, 'SlideWhite 173', 'Выбрали МЦ');
                    if katparty.kod=own_slide then {
                       TXOBodyAddKau(htxo,0,152,ckau_slide);
                    }
                    if katparty.kod=own_text then {
                       TXOBodyAddKau(htxo,0,152,ckau_text);
                    }
                    TXOBodyAddKau(htxo,wFlKau_Mode0,cgKau_KatMC,ckau_mc);
                 }
              }
              //для РП КАУ не формируется
              // формирование суммы
              sum_pr:=sporder.kol*sporder.srprice;
              TXOBodySetSum(htxo,sum_pr,0,sporder.kol);
              TXOBodyInsert(htxo);          
Блин, проще интерфейсом в таблицу оборотов напихать все нужное, чем эту заразу освоить... А у меня еще и проводки в зависимости от параметров накладной по 3 планам счетов должны формироваться...