WGtdUser.dat

Материал из Alta-Soft Wikipedia
Версия от 11:48, 7 февраля 2013; Belousov (обсуждение | вклад) (Отключение стандартного переноса или скрипта)
Перейти к навигации Перейти к поиску

Файл WGtdUser.dat предназначен для индивидуальной настройки правил копирования данных между взаимосвязанными документами.


Назначение

Она важнейших возможностей программы Альта-ГТД - автоматическое заполнение документов создаваемых как взаимосвязанные из уже существующих. Например, заполнив таможенную Декларацию на Товары, можно создавать из нее ДТС, КТС и все прочие таможенные документы.

С введением Электронного Декларирования появилась необходимость заполнять в электронной форме массу формализованных документов, таких как, ЭД2-Инвойсы, ЭД2-CMR, ЭД2-Контракты и многих других. Из-за отсутствия однозначных правил заполнения формализованных документов зачастую невозможно создать универсальный перенос, который бы удовлетворял всем возможным ситуация возникающим у различных пользователей программы. Чтобы дать возможность персонально настраивать или корректировать взаимосвязи документов, было решено создать пользовательский файл WGtdUser.dat. Файл должен находиться в одной папке с gtd.ini (по умолчанию в коневой программы Альта-ГТД), быть в Windows 1251 кодировке и содержать альтернативные описания переноса данных.

Механизм описания взаимосвязи документов

Связи между документами описываются в файле DATA\WGTDInfo.dat. Этот файл является дистрибутивным и вносить изменения в него запрещено, т.к. при следующем же обновлении файл будет восстановлен на стандартный. Связи и обработка документов могут описываться в секциях вида

  • [Документ2<-Документ1]
  • [Документ2<-Документ1.Script]
  • [Документ.Revise]

Рассмотрим их подробнее

[Документ2<-Документ1]

Самый простой способ описания взаимосвязи. Если документам достаточно копирования поле-в-поле заголовка и полей главного блока (товаров), то нужно перечислить поля в формате "поле_нового_документа = поле_исходного".

Пример создания Описи из документа ТД (ГТД)

 [OPN<-GTD]              
 1_2=     14.NAME        
 1_3=     14_6           
 1_5=     14.ADDRESS     
 1_6=     14_4+" "+14_5  
 4_1=     54_3           
 4_1NM=   54_3NM         
 4_1MD=   54_3MD         
 4_2=     54_7           
 4_3=     54_4           
 4_4=     54_5           
 4_5=     54_60          
 4_6=     54_61          
 5_1=     54_8           
 5_3=     54_101         
 5_21=    54_12          
 5_2=     54_100         

Специфические особенности:

  • Справа можно использовать склейки из нескольких полей и добавлять текст, например пробел: 14_4+" "+14_5
  • Копирование товаров (главных блоков документа) друг в друга происходит только при условии, что совпадают имена блоков. Например блок с товарами и в ГТД, и в ДТС называется BLOCK, поэтому поля товара можно просто перечислить в секции. При создании ДТС из ГТД, в ДТС будет создано столько же записей о товарах, сколько и в ГТД. Каждый товар будет перенесен согласно соотвествию заданному в секции.
  • Если главные блоки документов в целом соответствуют друг другу, но имеют разные названия, то перенос можно принудительно инициировать инструкцией
ConformBasis=1
  • Возможен перенос поле-в-поле вложенных блоков (дополнений) при условии что их поля имеют одинаковые названия. Для этого надо сопоставить имена блоков поставив перед ними символ @. Пример переноса из ГТД в документ учета
[DUT<-GTD]
1_1=     "ДУ"
1_2=     1_2
2=       2
31=      31
...
44=      "1-"+@44_2+"#2-"+@44_4.1+"#3-"+53_1
46_1=    46_1
54_1=    54_3
54_20=   54_20
54_7=    54_7
@DKD=    @DKD
@G40=    @G40
@G44=    @G44
@TXT=    @TXT

[Документ2<-Документ1.Script]

Очень часто в сложных документах перенос поле-в-поле затруднителен. Например требуется некая конвертация данных, обработка по условию, запрос к пользователю и т.д. В таких случая перенос программируется при помощи паскалеобразного скрипта. Написание программного кода требует определенных навыка и специфических знаний об структуре документов. Пример секции для переноса данных из ГТД в ЭД2-CMR

[CMR<-GTD.Script]
var s,num,TmpStr: string;
    i: word;
begin
  s:=; TmpStr:='1';
  num := ExtractWord(1, Doc1.GetField('27_4'), ' ');
  if DBFOPEN('SKL_VH') then
   if DBFFINDKEY('NLIC', num) then
    if num<> then s :=DBFGETFIELD('ADRS') else s:=;
  DBFOPEN();
  if _1_1='ИМ' then
  begin
    __C_1:=_2;
    __C_2:=_8;
    __C_3_1:='Лиц.СВХ N '+num;
    __C_3_2:=s;
    __C_3_3:='Россия';
    __C_4_3:=_15_1;
  end else
  begin
    __C_1:=_2;
    __C_2:=_8;
    __C_4_1:='Лиц.СВХ N '+num;
    __C_4_2:=s;
    __C_4_3:='Россия';
    __C_3_3:=_17_1;
  end;
  if InputQuery('Какой товар переносить?', 'Номер товара', TmpStr) then
  begin
    i:=Doc1.BlocksNum(0);
    Doc1.NBlock(StrToInt(TmpStr)-1);
    s:=Doc1.GetField('31.NAME');
    ClearEnter(s);
    __C_6:=s+#13+Doc1.GetField('31.PLACE')+#32+Doc1.GetField('31.PLACE2')+#32
     +Doc1.GetField('31.PAL')+#32+Doc1.GetField('31.PAL2');
  end;
end.

Специфических особенностей и приемов при программировании скриптов достаточно много и их описание выходит за рамки данной статьи. В случае потребности написания специфических переносов, следует обращаться в службу тех.поддержки.

[Документ.Revise]

Также для некоторых документов имеются специфические пересчеты данных при вводе. Например при вводе цены, автоматически рассчитывается стоимость. Такие обработки тоже выполняются скриптом из WGtdInfo, за исключением тех документов для которых обработка "зашита" внутрь самой программы. Например обработка при заполнении и создании документа Счет:

[BIL.Revise]
Var I : Integer;

function Sum(F:String):Real;
begin
    S :=0;
    For I := 0 to Doc1.BlocksNum(0)-1 do begin
      Doc1.NBlock(I);
      S := S+GetVal(Doc1.GetField(F));
    end;
   Result:=S;
end;

begin
 if (Fid='VSEGONDS') then begin
   Doc1.NBlock(0);
   S:=Sum('VSEGONDS');
 _ITOG3:=S;
 end;
 if (Fid='SUMNDS') then begin
   Doc1.NBlock(0);
   S:=Sum('SUMNDS');
 _ITOG2:=S;
 end;
 if (Fid='SUM') then begin
   Doc1.NBlock(0);
   S:=Sum('SUM');
 _ITOG1:=S;
 end;
 if (Fid='PRICE') then begin
   _SUM:=GetVal(_KOL)*GetVal(_PRICE);
   Doc1.NBlock(0);
   S:=Sum('SUM');
   _ITOG1:=S;
 end;
 if (Fid='NDS') then begin
   _SUMNDS:=GetVal(_NDS)*GetVal(_SUM)/100;
   Doc1.NBlock(0);
   S:=Sum('SUMNDS');
   _ITOG2:=S;
   _VSEGONDS:=GetVal(_SUMNDS)+GetVal(_SUM);
    Doc1.NBlock(0);
    S:=Sum('VSEGONDS');
   _ITOG3:=S;
   _PROPIS:=Propis(_ITOG3);
 end;
end.

Использование WGTDUser.dat

WGTDUser.dat позволяет перекрывать стандартные или добавлять собственные редакции правил переноса данных. Файл является пользовательским и не меняется после обновления, т.е. однажды сделанные пользователем изменения сохраняются.

Отключение стандартного переноса или скрипта

Для отключение стандартного переноса или Revise надо в WGTDUser.dat добавить секцию с префиксом SKIP. или переменную с тем же именем в секцию SKIP. Например, для отключения пересчета в документе ЭД2 Счет-Фактура необходимо в секции [SKIP] завести переменную с именем отключаемой секции

[SKIP]
COMMERCIALINVOICE.Revise=1

Отключение стандартной или временное отключение пользовательской секции с переносом возможно также и через интерфейс программы. Для этого надо открыть документ нужного типа и в меню ИмяДокумента\Информация о документе... вызвать диалог

DocInfoDlg.png

В нижней части диалога перечислены все возможные переносы, как стандартные из DATA\WGtdInfo.dat, так и пользовательские из WGtdUser.dat. Снимая галочки можно включать\отключать взаимосвязи. Изменения запоминаются в файле WGtdUser.dat в секции [SKIP].

Добавление собственного скрипта

Для создания собственной взаимосвязи достаточно просто создать секцию с нужным именем в WGtdUser.dat. При внесении изменений в файл, возможно, потребуется перезапуск программы для вступления их в силу.

ВНИМАНИЕ! На данный момент существует ограничение: перекрыть можно только существующую в WGtdInfo.dat секцию. Если в стандартном файле документы на прямую не связаны, но секции из WGtdUser.dat применяться не будут, т.к. программа будет предлагать маршруты создания нового документа через другие промежуточные.

Добавление нескольких скриптов для одного документа

Иногда требуется какой-то документ создавать по-разному в зависимости от конкретного случая. Для можно создать несколько скриптов, перечислить из в спец.секции с именем [Документ2<-Документ1.ScriptList] и тогда программа будет каждый раз задавать вопрос какой именно скрипт использовать. Например, предположим что при создании ЭД2 Платежного требования, мы хотим выполнять разные скрипты. Создаем секцию со всеми возможными вариантами:

[PAYMENTDEMAND<-GTD.ScriptList]
A. Требование к ООО "РиК" на 10000
B. Требование к ООО "Вектор М" на 5000
12. Требование к ООО "Ромашка" на всю гр.12

Идентификатор варианта - это первое слово в строке. Может быть и цифровым, и буквенным. Используется текст до первого знака препинания или пробела. Затем перечисляются все варинты переносов:

[PAYMENTDEMAND.A<-GTD]
PaymentAmount="10000"

[PAYMENTDEMAND.B<-GTD]
PaymentAmount="5000"

[PAYMENTDEMAND.12<-GTD]
PaymentAmount=12_1

При создании Требования из ГТД будет задан вопрос

HowPAYMENTDEMANDDo.png

И будет выполнен только выбранный перенос. Т.к. исходная секция переноса и скрипт переноса не отключалась, то перенос будет сделан в ДОПОЛНЕНИЕ к стандартному.

Старый механизм

Еще до создания WGtdUser.dat существовала возможность выполнить скрипт после создания нового взаимосвязанного документа. Для этого в папку DATA\ надо было поместить текст скрипта в файле с именем ИмяДокумента_my.scr.

Например DATA\CommercialInvoice_my.scr для обработки ЭД2 Счета-Фактуры. Однако при помощи этого механизма нельзя было отключать существующие стандартные секции.