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