Нужно написать свой алгоритм

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Sytin
Постоянный обитатель
Сообщения: 159
Зарегистрирован: 28 сен 2005, 19:48
Откуда: mos
Контактная информация:

Нужно написать свой алгоритм

Сообщение Sytin »

Необходимо написать алгоритм, который будет вызываться из
"ХозОперации - Настройка - Настройка ХозОпераций - Управление договорами - Пункт календарного плана - Алгоритм в валюте (2 поле)"
Мне посоветовали реализовать при помощи TxoAPI (раньше с ним не работал). Хочу для начала подключить демо пример. Компилируется он у меня нормально, но при подключении ресурсника, алгоритм не появляется в реестре. Подскажите, что я не так делаю...

Prj.prj

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

#define __TxoApiBuildDemos__
#define ComponentVersion
#define Atl51

#include ..\INC\galnet.inc end;
#include ..\INC\glovars.inc


#make "..\Demo1.vip"
Demo1.vip

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

//------------------------------------------------------------------------------
//                                                      (c) Корпорация ГАЛАКТИКА
//------------------------------------------------------------------------------
// Система       : ГАЛАКТИКА
// Проект        : Бухгалтерский контур
// Версия        : 8.0
// Назначение    : Пример использования TXO API
// Ответсвенный  : Ларин Михалил Николаевич
//------------------------------------------------------------------------------

#ifdef __TxoApiBuildDemos__

#include TxoApi.vih

// Указываем, что наш интерфейс реализует расчет идентификатора ТХО
VipInterface Txo_KatSoprDemo
  Implements ObjTxoIdentPlugin
  #ifdef Atl51
  #Licensed_Free
  #end
;

// Простой интерфейс для обработки накладной
Interface Txo_KatSoprDemo (,hcTXOWVIPParam);

// Логическая таблица, описывает стуктуру накладной
create view DemoView
var
  CurTiDkGal : word;
  CurSoprDoc : comp;
  P1         : String;
  P2         : String;
as select
  *
from
  Katsopr,
  SpSopr
where
((
  CurSoprDoc == KatSopr.Nrec    and
  CurSoprDoc == SpSopr.cSopr
));


function GetInfo : string;
{
   GetInfo := 'Пример использования TXO API для накладных';
}

function ParamMaster : string;
{
   Message(''#3'здесь должен быть вызов окошка, чтобы помочь пользователю'#13+
           ''#3'заполнить строку дополнительных параметров идентификатора:'#13+
           ''#3'[Param1:"xxx"][Param2:"yyy"]');
   ParamMaster := '[Param1:"xxx"][Param2:"yyy"]';
}


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

   TxoAllowRecallStoreCycles(hTxo);
   
   // заполнить нециклическую аналитику
   if (getfirst KatSopr = tsOk)
   {
      TxoHeadAddKau(hTxo, 0,1,KatSopr.cOrg);     // организация
      TxoHeadAddKau(hTxo, 0,2,KatSopr.cPodrTo);  // подразделение

   }

   // построить выгрузку циклов
   _loop SpSopr
   {
      // очистить промежуточный буффер
      TxoBodyClear(hTxo);

      // закачать значение КАУ
      if(SpSopr.PrMC = 1)
        TxoBodyAddKau(hTxo, 0, 4, SpSopr.cMcUsl); // МЦ
      else
        TxoBodyAddKau(hTxo, 0, 5, SpSopr.cMcUsl); // Услуга
      TxoBodyAddKau(hTxo, 0, 10, SpSopr.cParty);  // Партия МЦ

      // закачать суммы
      TxoBodySetSum(hTxo, SpSopr.Price*SpSopr.Kol,SpSopr.VPrice*SpSopr.Kol, SpSopr.Kol);

      // добавить в выгрузку
      TxoBodyInsert(hTxo);
   }
}
end.

#endif
TxoApi.vih

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

//********************************************************************************
//                                                        (c) корпорация Галактика
// Галактика 5.82 - Бухгалтерский контур
// Базовая функциональность TXO API
//********************************************************************************


#ifndef __TXOAPI_VIH__
#define __TXOAPI_VIH__

#ifdef ComponentVersion
#Component "F_TxoApi"
#end

/*********************************************************************************
   TXO API (application programming interface) дает возможность сторонним разработчикам
   оперативно расширять вычислительные возможности идентификаторов ТХО.

   Для реализации своих специфических расчетов нужно написать свой VipInterface,
   который будет реализовывать функции объектного интерфейса ObjTxoIdentPlugin.

      VipInterface MyInterface implements ObjTxoIdentPlugin;

   Чтобы все заработало, нужно написать реализацию функции StoreCycles, которая будет
   закачивать данные в ТХО при помощи специальных сервисных функций: TxoBodyAddKau,
   TxoBodySetSum, TxoBodyInsert.

   Чтобы использовать это в расчетах ТХО, нужно в шаблоне ТХО в формуле написать
   идентификатор:
                           &VIP_[OBJ:"MyInterface"]

   Идентификатор &VIP может быть как циклическим (&VIP_[OBJ:"MyInterface"]),
   так и нециклическим (&VIP[OBJ:"MyInterface"])
*********************************************************************************/

// Данные о текущем сеансе разноски ТХО



type TTxoApiInfoDoc = record
    cSoprHoz   : comp;        // Журнал хозопераций
    TiDkGal    : word;        // Тип документа системный
    TiDk       : word;        // Тип документа пользовательский
    cSoprDoc   : comp;        // Документ

    cHozOper   : comp;        // ТХО
    cPlansSch  : comp;        // Регистр учета
    KodReg     : word;        // Код регистра учета
    cObor      : comp;        // Шаблон ТХО

    DatOb     : date;         // Дата проводки
    cValut    : comp;         // Валюта проводки
    dBeginFp  : date;         // Начало периода документа
    dEndFp    : date;         // Конец периода документа
  end;

// TTxoInfoCloSch -Дополнительная информация о текущем состоянии сеанса
// закрытия счетов. Если в порядке закрытия счетов установлено
// "рассчитывать исходящее сальдо=Да", то bufCloSch заполняется
// из рассчитанного сальдо. Если сальдо не/ рассчитывается, то
// в bufCloSch переносится информация из настрои
// порядка закрытия счетов.
type TTxoInfoCloSch = record
    cPlansSch   : comp;    // Ссылка на план счетов закрываемого счета.
    Schet       : tSchet3; // Код плана счетов + закрываемый счет
    DbSchet     : tSchet19;// Закрываемый счет без кода плана счетов
    SubSch      : tSubSch; // Субсчет закрываемого счета
    wKau_1      : word;    // код КАУ1 закрываемого счета
    wKau_2      : word;    // код КАУ2 закрываемого счета
    wKau_3      : word;    // код КАУ3 закрываемого счета
    wKau_4      : word;    // код КАУ4 закрываемого счета
    wKau_5      : word;    // код КАУ5 закрываемого счета
    wKau_6      : word;    // код КАУ6 закрываемого счета
    cKau_1      : comp;    // Значение КАУ1 закрываемого счета
    cKau_2      : comp;    // Значение КАУ2 закрываемого счета
    cKau_3      : comp;    // Значение КАУ3 закрываемого счета
    cKau_4      : comp;    // Значение КАУ4 закрываемого счета
    cKau_5      : comp;    // Значение КАУ5 закрываемого счета
    cKau_6      : comp;    // Значение КАУ6 закрываемого счета
    cPodr       : comp;    // Подразделение закрываемого счета
    cGoNewPer   : comp;    // Ссылка на настройку порядка закрытия счетов
    cSaldoNm    : comp;    // Ссылка на текущую позицию исходящего сальдо
    BuhSprNo    : tNoDok;  // Номер бухсправки закрывающей счет
  end;

// Все пользовательские алгоритмы ТХО должны реализовывать этот объектный интерфейс ObjTxoIdentPlugin
// начиная с версии 5.85 все реализации должны начинаться с префикса "Txo_" это необходимо
// для ускорения сканирования ресурсов при поиске всех реализаций
ObjInterface ObjTxoIdentPlugin;
  //GetInfo - получить описание алгоритма расчета, используется в интерфейсе выбора идентификаторов ТХО
  function GetInfo : string;

  // ParamMaster - вызвать мастер и получить список дополнительных параметров [Param1:"Value1"][Param2:"Value2"]
  function ParamMaster : string;

  // StoreCycles - запустить алгоритм расчета и построить выгрузку
  //   hTxo - ссылка на текущий сервис ТХО
  //   buf  - структура, содержит важные данные о текущем сеансе разноски ТХО
  procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);
end;

// начиная с версии 5.85 ТХО API позволяет сторонним разработчикам
// так же добавлять свои собственные режимы и давать им человеческие
// названия, для этого служат объекты ObjTxoMenuServer и ObjTxoMenuPlugin
// рекомендуемый диапазон для пользовательских режимов 5000..9999

// ObjTxoMenuServer - предоставляет доступ к сервисам менеджера динамических МЕНЮ
// который который используется в настройке ТХО
ObjInterface ObjTxoMenuServer;
   // добавить пункт меню и наименование пользовательского режима формирования значения аналитики
   // TypeMenu - тип меню, одна из констант mnuFlKau=1; mnuFlUserKau=2; mnuFlSchSub=9;
   // wKau     - код каталога аналитики, если нужно чтобы этот режим был доступен для всех каталогов
   //            аналитики то нужно передавать 0.  Для типов меню вообще не касающихся аналитики
   //            например для счетов/субсчетов нужно так же передавать 0
   // flKau    - номер режима формирования аналитики, под пользовательский режим теперь можно
   //            резервировать любую константу по желанию, главное что бы она не пересекалась
   //            с системными режимами wFlKau_ХХХХХХ, рекомендуемый диапазон 5000..9999
   // NameMenu, NameField - это шаблон строки для названия режима (понятный человеку)
   //            который будет использован при выборе меню и при высветки поля в интерфейсах
   //            в шаблоне можно использовать макрос %Name в место него будет автоматически
   //            подставляться наименование каталога аналитики. Что бы добавить разделитель
   //            в NameMenu нужно указать строку 'separator'
   //            Примеры: AddTxoMenu(mnuFlKau, 0, 0, 'separator', '');
   //                     AddTxoMenu(mnuFlKau, 0, wFlKau_Auto, 'формировать автоматически', '<авто - %Name>');
   //                     AddTxoMenu(mnuFlKau, cgKau_KatPodr, wFlKau_DogCO, 'Ответственное подразделение за договор','<авто - ответственное подразделение за договор>');
   function AddTxoMenu(TypeMenu, wKau, flKau : word; NameMenu, NameField : string):boolean;

   // изменяет признак доступа к пункту меню на Enable;
   function EnableMenu(TypeMenu, wKau, flKau : word) : boolean;

   // изменяет признак доступа к пункту меню на Disable;
   function DisableMenu(TypeMenu,wKau,flKau : word) : boolean;
end;

// ObjTxoMenuPlugin - вызывается менеджером меню в момент построения списка всех доступных
// режимов формирования значений аналитики при настройке ТХО. Сторонние разработчики могут
// могут написать свои реализации этого объектного интерфейса чтобы дополнить список
// режимов формирования значений аналитики. Все реализации должны начинаться с префикса "TxoMenu_"
ObjInterface ObjTxoMenuPlugin;
  // эта процедура вызывается в момент построения списка режимов формирования значений аналитики
  //  hMenu - ссылка на менеджер меню используемый в ТХО, для обратной связи
  procedure OnMakeMenu(hMenu : ObjTxoMenuServer);
  procedure OnSetEnableMenu(hMenu : ObjTxoMenuServer; TiDkGal, SysOper : word);
end;


// Начиная с версии 7.11 ТХО API позволяет сторонним разработчикам реализовывать
// собственные алгоритмы извлечения значений аналитики,
// для этого служат объекты ObjTxoExtractKauServer и ObjTxoExtractKauPlugin

//   ObjTxoExtractKauServer - предоставляет доступ к методам работы с таблицей в памяти,
//   в которой регистрируются пользовательские интерфейсы (реализующие ObjTxoExtractKauPlugin),
//   позволяющие извлекать необходимые значения аналитики для заданных типов документов.
//   Таблица в памяти хранится до конца работы с Галактикой.

//   В vip интерфейсе TxoExtractKauServer, имплементирующем ObjTxoExtractKauServer,
//   реализована процедура InsertTxoExtKauRegister, использование которой
//   обязательно при регистрации интерфейсов в OnExtractKau.
//       TiDkGal - тип документа, для которого происходит регистрация
//       ifcName - имя интерфейса, для которого происходит регистрация
ObjInterface ObjTxoExtractKauServer;
  procedure InsertTxoExtKauRegister(TiDkGal : word; ifcName : string);
end;

//   ObjTxoExtractKauPlugin - вызывается в момент получения информации из документа.
//   Сторонние разработчики могут написать свои реализации этого объектного интерфейса для извлечения значений аналитики
//   Все реализации должны начинаться с префикса "TxoKau_".
//   Например:
//     VipInterface TxoKau_MyInterface implements ObjTxoExtractKauPlugin;
ObjInterface ObjTxoExtractKauPlugin;
//   Процедура реализует регистрацию нужных типов документов в таблице в памяти. Для этого нужно использовать
//   процедуру InsertTxoExtKauRegister объекта hKau.
//   Процедура вызывается в момент первого обращения системы к таблице регистрации интерфейсов извлечения значений аналитики.
//   Если необходимо, чтобы аналитика извлекалась для любого типа документа, то зарегистрировать интерфейс для TiDkGal = 0.
//   Например,
//      hKau.InsertTxoExtKauRegister(0,'TxoKau_MyInterface');
//   hKau - ссылка на объект работы с таблицей регистрации интерфейсов, для обратной связи.
  procedure OnRegisterKauExtractor(hKau : ObjTxoExtractKauServer);
//   Процедура реализует извлечение аналитики из документа с заданным типом.
//    hTxo  - ссылка на сервис ТХО (!!! следует всегда использовать то, что передается в OnExtractKau !!!)
//    TiDkGal - тип документа
//    cSoprHoz - ссылка на текущую запись ЖХО
//    cSoprDoc - ссылка на документ, по которому сформирована текущая запись ЖХО
//   Добавлять аналитику в буфер нециклических значений КАУ нужно с помощью процедуры
//    procedure TxoHeadAddKau(hTxo : longint; flKau, wKau : word; cKau : Comp);
  procedure OnExtractKau(hTxo : longint; TiDkGal : word; cSoprHoz, cSoprDoc : comp);
end;

// ********************   Сервисные функции TxoApi *****************************
// *******    следует использовать только при реализации StoreCycles     *******
// *******    реализованы в G_Txo.DLL описание хранится в extfun.res     *******
// *****************************************************************************

// ****************** общие параметры сервисных функций ************************
// hTxo  - ссылка на сервис ТХО (!!! следует всегда использовать то, что передается в StoreCycles !!!)
// flKau - код режима формирования значения КАУ из шаблона ТХО
// wKau  - код КАУ
// cKau  - значение КАУ

//  Перекачка нециклической аналитики из шапки разносимых документов:

//  Очистить буфер нециклических значений КАУ
//    procedure TxoHeadClear (hTxo : longint);

//  Добавить аналитику в буфер нециклических значений КАУ
//    procedure TxoHeadAddKau(hTxo : longint; flKau, wKau : word; cKau : Comp);

//  Для перекачки циклической аналитики и сумм, а также формирования выгрузки по
//  результатам расчета служат следующие функции:

//  Очистить промежуточный буфер циклической обработки
//    procedure TxoBodyClear(hTxo : longint);

//  Добавить значение КАУ в промежуточный буфер циклической обработки
//    procedure TxoBodyAddKau(hTxo : longint; flKau, wKau : word; cKau : Comp);

//  Перенести сумму в НДЕ (Nde), в Валюте (Val) и Количество (Kol) в промежуточный
//  буфер циклической обработки. Сумма в валюте (Val) должна быть указана в "Валюте проводки". (Валюту проводки
//  следует брать из buf.cValut, это значение формируется системой согласно шаблону.
//  Количество Kol должно быть указано в учетных единицах измерения.
//    procedure TxoBodySetSum(hTxo : longint; Nde, Val, Kol : double);

//  Расширенная функция для переноса Суммы в валюте в промежуточный буфер циклической обработки
//  Если в шаблоне настроена циклическая обработка по валютам, то "Валюта проводки"
//  будет циклически обработана по передаваемым значениям cVal, иначе сумма SumVal
//  будет пересчитана в "Валюту проводки" согласно шаблону.
//    procedure TxoBodySetSumVal(hTxo : longint; SumVal : double; cVal : comp);

//  Расширенная функция для переноса Количества в промежуточный буфер циклической обработки
//  Количество SumKol указывается в отпускных единицах измерения cOtpEd и будет
//  автоматически пересчитано в учетные единицы измерения.
//    procedure TxoBodySetSumKol (pTxo : PTXOProc_Minimum; SumKol : double; cOtpEd : comp);

//  Добавить содержимое промежуточного буфера циклической обработки в выгрузку. В этот
//  момент будет производиться агрегация сумм, согласно настройке разрезов
//  циклической обработки в шаблоне ТХО.
//  Результат: true  - если вставка прошла успешно
//             false - если были какие-либо ошибки
//    function TxoBodyInsert(hTxo : longint) : boolean;

// Вывести отладочную информацию в протокол ТХО.
// Настройка -> Бухгалтерский контур -> Типовые проводки -> Уровень детализации
// протокола = '4 отладочная информация'
//   procedure TxoDebugMsg(hTxo : longint; Tag, Msg : string);


// Получить список параметров идентификатора &VIP[Name1:"Value1"][Name2:"Value2"]
// TxoParamCount - возвращает количество параметров &VIP
// TxoParamName  - наименование параметра с номером Num
// TxoParamValue - значение параметра с номером Num
// - наименование и значение возвращаются в верхнем регистре
// - значение, заданное в двойных кавычках, возвращается без кавычек
// - в наименованиях и значениях параметров нельзя использовать символы
//   { пробел, '*', '/', '+', '-', '(', ')', ','}
//   function  TxoParamCount(hTxo : longint) : word;                            // external;
//   function  TxoParamName (hTxo : longint; Num : word) : string;              // external;
//   function  TxoParamValue(hTxo : longint; Num : word) : string;              // external;

// Проверка, удовлетворяет ли строка Str маске Mask.
// Описание синтаксиса маски смотри в документации по модулю Хозоперации.
//   function MatchesMask(Str, Mask: string): Boolean;

// Определить, является ли маска (Mask) простой или составной.
// В случае простой маски результат будет True, в случае составной - False
// Простая маска - это маска которая не содержит спецсимволов ( * # ? [ ~ ] ; | и т.д. ).
// Функция IsSingleMask будет полезна для оптимизации расчетов,
// в которых для фильтрации записей таблицы используется функция MatchesMask.
// Если в таблице по интересующему полю есть индекс, то в случае простой маски,
// для ускорения расчетов можно наложить ограничение на таблицу по этому полю.
//   function IsSingleMask(Mask : String) : boolean; //(начиная с версии 5.84)

// Запустить расчет одного ПАТ идентификатора (PatIdent)
// Под ПАТ идентификаторами подразумеваются стандартные идентификаторы
// (обороты, проводки, сальдо), которые используются в бухгалтерском
// калькуляторе и бухгалтерской отчетности. Возвращаемые значения
// Сумма в НДЕ (vNde), Сумма в Валюте (vVal) и Количество (vKol).
// В случае успешного расчета результат функции будет True, в случае
// каких либо ошибок в процессе расчета (например, неправильный синтаксис
// идентификатора) результат функции будет False.
//   function TxoExecPat(hTxo : longint; PatIdent : string;  //(начиная с версии 5.84)
//                       var vNde, vVal, vKol : double) : boolean;

// Получить дополнительную информацию о текущем состоянии сеанса закрытия
// счетов в переменную bufCloSch. Если в порядке закрытия счетов установлено
// Рассчитывать исходящее сальдо = Да, то bufCloSch заполняется из рассчитанного
// сальдо. Если сальдо не рассчитывается, то в bufCloSch переносится информация
// из настройки порядка закрытия счетов. В случае успеха результат функции
// принимает значение True, в случае каких либо ошибок (например, если
// применить для buf.TiDkGal не равным 777) результат функции - False.
//    function TxoGetInfoCloSch(hTxo : longint; var bufCloSch : TTxoInfoCloSch) : boolean; //(начиная с версии 5.84)

//  Добавить ссылку на счет/субсчет в буфер циклической и нециклической обработки
//    function  TxoHeadAddSchet  (pTxo : PTXOProc_Minimum; flSchSub: word; Schet : tSchet3; SubSch : tSubSch):boolean;
//    function  TxoBodyAddSchet  (pTxo : PTXOProc_Minimum; flSchSub: word; Schet : tSchet3; SubSch : tSubSch):boolean;
//  Эти функции реализована начиная с версии 5.85. С из помощью можно управлять значением счета и субсчета
//  в формируемых бухгалтерских проводках (также как и аналитикой). Работают по аналогии
//  с функциями TxoHeadAddKau и TxoBodyAddKau.
//  Параметры:
//      hTxo - ссылка на сервер ТХО
//      flSchSub - номер режима формирования счета субсчета (одна из констант wFlKau_Mode0.. wFlKau_Mode9)
//      Schet - ссылка на счет (в формате "код плана счетов" + "номер счета"
//      SubSch - ссылка на субсчет
//  В случае если такой счет/субсчет (Schet+SubSch) действительно существует возвращает TRUE иначе FALSE

// Отключить действие стандартных фильтров ТХО - fT, fGT, fK и т.п.
//   procedure TxoBodyDisableFilter(hTxo : longint);

// Отключить действие стандартных фильтров ТХО - fT, fGT, fK и т.п.
//   procedure TxoBodyDisableFilter(hTxo : longint);

// Разрешить повторное использование текущего объекта ObjTxoIdentPlugin.
//   procedure TxoAllowRecallStoreCycles(hTxo : longint);
// Данную функцию рекомендуется применять внутри функции StoreCycles для экономии процессорного времени
// на повторной инициализации объектов. Вызов данной функции сигнализирует серверу ТХО от том, что он
// имеет право повторно использовать экземпляр текущего объекта и повторно вызвать функцию StoreCycles
// без повторной инициализации объекта. Это позволяет с экономить до 30%-50% времени при применении ТХО к
// нескольким документам или в ТХО с большим количеством формул.

#endif
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

По локальному меню в каталоге алгоритмов запускали "Обновить каталог идентификаторов ТХО" ?
Sytin
Постоянный обитатель
Сообщения: 159
Зарегистрирован: 28 сен 2005, 19:48
Откуда: mos
Контактная информация:

Сообщение Sytin »

Не, не пробовал)) Ща попробовал, не помогло. Но буду иметь ввиду.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Может где то компоненты не так переопределяются...попробуй определить явно компонент :


#include TxoApi.vih

#Component "F_TxoApi"

// Указываем, что наш интерфейс реализует расчет идентификатора ТХО
VipInterface Txo_KatSoprDemo
Sytin
Постоянный обитатель
Сообщения: 159
Зарегистрирован: 28 сен 2005, 19:48
Откуда: mos
Контактная информация:

Сообщение Sytin »

Спасибо огромное, демо примерчик попер)) Буду разбираться дальше.
Ответить