WGtdUser.dat: различия между версиями

Материал из Alta-Soft Wikipedia
Перейти к навигации Перейти к поиску
м (Отключение стандартного переноса или скрипта)
м (Старый механизм)
Строка 173: Строка 173:
 
== Старый механизм ==
 
== Старый механизм ==
  
Еще до создания WGtdUser.dat была возможность выполнить скрипт при создании нового взаимосвязанного документа.  
+
Еще до создания WGtdUser.dat существовала возможность выполнить скрипт после создании нового взаимосвязанного документа.  
 
Для этого в папку '''DATA\''' надо было поместить текст скрипта в файле с именем '''ИмяДокумента_my.scr'''.
 
Для этого в папку '''DATA\''' надо было поместить текст скрипта в файле с именем '''ИмяДокумента_my.scr'''.
 +
 +
Например '''DATA\CommercialInvoice_my.scr''' для обработки ЭД2 Счета-Фактуры. Однако при помощи этого механизма нельзя было отключать
 +
существующие стандартные секции.
  
 
[[Категория:Альта ГТД]]
 
[[Категория:Альта ГТД]]

Версия 15:37, 18 января 2013

Файл 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, за исключением тех документов для которых обработка "зашита" внутрь самой программы.

[ATE.Revise]
Var a : String;
    I : Integer;
    b : String;
begin
    if Fid='18_1' then begin
      Doc1.NBLock(NBLOCK);
      a:= _18_1;
      For I := 0 to Doc1.BlocksNum(0)-1 do begin   {BlockNum - получить кол-во товаров}
        Doc1.NBlock(I);    {Переходим в текущ. товар}
         b:=_18_1;
          if (b=) then
            _18_1:=a;
          end;
      end;
    if Fid='19_1' then begin
      Doc1.NBLock(NBLOCK);
      a:= _19_1;
      For I := 0 to Doc1.BlocksNum(0)-1 do begin   {BlockNum - получить кол-во товаров}
        Doc1.NBlock(I);    {Переходим в текущ. товар}
         b:=_19_1;
          if (b=) then
            _19_1:=a;
          end;
      end;
    end;
end.

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

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

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

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

[SKIP.COMMERCIALINVOICE.Revise]

или, в секции SKIP завести переменную с именем секциии

[SKIP]
COMMERCIALINVOICE.Revise=1

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

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

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

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