WGtdUser.dat
Файл 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.COMMERCIALINVOICE.Revise]
или в секции SKIP завести переменную с именем отключаемой секции
[SKIP] COMMERCIALINVOICE.Revise=1
Добавление собственного скрипта
Для создания собственной взаимосвязи достаточно просто создать секцию с нужным именем в 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
При создании Требования из ГТД будет задан вопрос
И будет выполнен только выбранный перенос. Т.к. исходная секция переноса и скрипт переноса не отключалась, то перенос будет сделан в ДОПОЛНЕНИЕ к стандартному.
Старый механизм
Еще до создания WGtdUser.dat существовала возможность выполнить скрипт после создании нового взаимосвязанного документа. Для этого в папку DATA\ надо было поместить текст скрипта в файле с именем ИмяДокумента_my.scr.
Например DATA\CommercialInvoice_my.scr для обработки ЭД2 Счета-Фактуры. Однако при помощи этого механизма нельзя было отключать существующие стандартные секции.