WGtdUser.dat

Материал из Alta-Soft Wikipedia
Перейти к навигации Перейти к поиску

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

При создании взаимосвязанного документа в WGtdInfo.Dat происходит поиск и последовательное выполнение секций

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

При помощи WGtdUser.dat в этот порядок соответственно добавляются

  • [Документ2<-Документ1] из WGtdInfo.Dat
  • [Документ2<-Документ1] из WGtdUser.Dat
  • [Документ2<-Документ1.Script]из WGtdInfo.Dat
  • [Документ2<-Документ1.Script]из WGtdUser.Dat

таким образом надо учитывать, что изменения сделанные пользовательской секцией [Документ2<-Документ1], могут быть "испорчены" стандартным скриптом [Документ2<-Документ1.Script] при его наличии.


Примечание: У документа Инвойс некоторые секции переноса вынесены в индивидуальный WInvInfo.dat Секции из этого файла выполняются после WGtdInfo.Dat, и их тоже можно перекрывать через WGtdUser.Dat. И в данном случае нужно иметь ввиду, что секция [Документ2<-INV] будет выполнена ПОСЛЕ [Документ2<-INV.Script]из WGtdInfo.Dat


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

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

[SKIP]
COMMERCIALINVOICE.Revise=1

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

DocInfoDlg2.png

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

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

Для изменения или создания собственной взаимосвязи нужно создать секцию в WGtdUser.dat.

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

Изменить можно только существующую связь. Если если связь не прописана в стандартном DATA\WGtdInfo.dat, то пользовательская секция не будет обнаружена программой, даже если ее прописать в WGtdUser.dat вручную.

Документации про написание правил переноса между документами не существуют, но в них не сложно разобраться используя в качестве примера секции из стандартного DATA\WGtdInfo.dat.

При создании взаимосвязанного документа сначала выполняется стандартная секция правил из DATA\WGtdInfo.dat, а потом пользовательская секция из WGtdUser.dat. Соответственно, если надо полностью изменить процесс создания, то стандартную секцию нужно отключить. Обновление программы не влияет на настройки сделанные через WGtdUser.dat


ВНИМАНИЕ! При внесении изменений в файл, возможно, потребуется перезапуск программы для вступления их в силу.

Некоторые специальные приемы работы в секциях .Script

Взять данные из взаимосвязанного документы

Для получения данных из полей документа взаимосвязанного с исходные документом используется функция ExtraGet()

//Вытаскиваем поле "прочее1" из 1-го товара взаимосвязанного Инвойса
S := Doc1.ExtraGet('INV.31_USER1',1);

Получить данные о документах 44 графы

Для получения данных о документа из графы 44 документа ДТ (ГТД) или Инвйоса используется функция GetOldField() со специальным синтаксисом

S := Doc1.GetOldField('@44_!_03011');

более подробно о возможностях GetOldField('@44...') написано в статье Печать в офис

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

Иногда требуется какой-то документ создавать по-разному в зависимости от конкретного случая. Для можно создать несколько скриптов, перечислить из в спец.секции с именем [Документ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 Счета-Фактуры. Однако при помощи этого механизма нельзя было отключать существующие стандартные секции.