Документы хранятся в Ведомостях Документов и имеют следующие свойства:
Документы хранятся в специальном файле (TTN1), который имеет примерно следующую структуру:
TTN1
FILE,DRIVER('BTRIEVE')CREATE,OEM,PRE(TT1)
Number_key KEY(+TT1:Firm,+TT1:TypeOp,+TT1:Number),OPT,NOCASE,PRIMARY
Date_key KEY(+TT1:Firm,+TT1:TypeOp,+TT1:Date),DUP,NOCASE
Comp_key KEY(+TT1:Firm,+TT1:CCode,+TT1:Date),DUP,NOCASE
Note MEMO(255)
RECORD RECORD
Firm USHORT
! Код Фирмы
TypeOp USHORT
! Тип операции (документа)
Number ULONG
! Номер документа
Date LONG
! Дата документа
Store USHORT
! Код Участка учета
CCode USHORT
! Код Контрагента
SCode USHORT
! Код оператора, оформившего
документ
Summ REAL
! Сумма в базовой валюте
RSumm REAL
! Сумма в рублях
Metka STRING(1) !
Метка "Документ утвержден"
. . .
! Прочие поля
END
END
Записи о товарах документа хранятся
в файле TTN2, связанным с файлом TTN1
отношением "много к одному", который имеет
примерно следующую структуру:
TTN2
FILE,DRIVER('BTRIEVE'), CREATE, OEM, PRE(TT2)
Number_key
KEY(+TT2:Firm,+TT2:TypeOp,+TT2:Number,+TT2:NumStr),OPT,NOCASE,PRIMARY
NumTCode_key KEY(+TT2:Firm,+TT2:TypeOp,+TT2:Number,+TT2:TCode),DUP,NOCASE
TCode_key KEY(+TT2:TCode,+TT2:Date),DUP,NOCASE
StoreDate_key KEY(+TT2:Store,+TT2:Date),DUP,OPT,NOCASE
Note MEMO(512)
RECORD RECORD
Firm USHORT
! Код Фирмы
TypeOp USHORT
! Тип операции (документа)
Number ULONG
! Номер документа
NumStr USHORT
! Номер строки в списке
товаров
Date LONG
! Дата документа
Store USHORT
! Код Участка учета
TCode STRING(13) !
Код Товара
Quant DECIMAL(13,3) !
Количество товара
Price REAL
! Цена товара
Summ REAL
! Сумма в базовой
валюте
RSumm REAL
! Сумма в рублях
Metka STRING(1)
! Метка "Товар утвержден"
. . .
! Прочие поля
END
END
Запись о Документе реализована в виде окна на основе стандартной Формы для записи файла TTN1. Если документ имеет список товаров, то он располагается на отдельном листе формы вместе со всеми органами управления списком товаров. Ниже приведен пример реализации документа типа "Приходная накладная":


Для облегчения реализации документов различных типов имеется несколько control-шаблонов для размещения в окне документа типовых controls, а также extention-шаблон SpisokTow, в котором реализована функциональность Списка Товаров документа.
Вот полный список шаблонов поддержки записи о документе:
Control-шаблон Entry_Firm реализует поле ввода "Фирма" записи о документе.
#!==============================================================
#CONTROL (Entry_Firm, 'Поле ввода "Фирма" документа')
#!==============================================================
CONTROLS
PROMPT('Фирма:'),AT(),USE(?TT1:Firm:Prompt),TRN
ENTRY(@n2),AT(,,19,9),USE(tt1:Firm),SKIP,CENTER,COLOR(COLOR:Silver),MSG('Фирма'),REQ
END
#!
#! ----- Локальные переменные -----
#LOCALDATA
LOC:Firm USHORT
#ENDLOCALDATA
#!
#! ----- Инициализация -----
#AT (%ProcedureInitialize)
LOC:FIRM = tt1:Firm ! Запомнить
"Старое" значение
#ENDAT
#!
#! ----- ?tt1:Firm ----
#AT (%ControlPostEventHandling, '?tt1:Firm', 'Accepted')
if ~THIS{prop:AcceptAll} and tt1:Firm<>LOC:Firm
SerNum_Change( LOC:Firm, LOC:TypeOP, LOC:Number, ) ! Изменить
ключевые поля файлов-потомков
Message( 'После изменения Фирмы вам нужно
<10,13>' & |
'изменить
Учетный Номер и после <10,13>' & |
'этого
нажать кнопку "Ok" !', ' ВНИМАНИЕ ', icon:Exclamation )
.
#ENDAT
Control-шаблон Entry_TypeOp реализует поля для
выбора Типа Документа из справочника Типов
Операций.
Для выбора Типа Документа из Справочника Типов
Операций используется функция TypeOp_s().
Ей в качестве параметра передается строка
выражения фильтра для ограничения списка
доступных типов операций. Функция GetTop_Name()
возвращает название Типа Документа по его
коду. Доступ к Справочнику типов операций
осуществляется только при помощи функций TypeOp_s()
и GetTop_Name(), поэтому его файл не нужно
объявлять в процедуре формы документа и
процедура не должна ничего "знать" об
устройстве этого файла.
Функция DostObj()
используется для проверки прав доступа
изменения поля "Тип Документа".
#!====================================================================
#CONTROL (Entry_TypeOp, 'Поле ввода Типа Документа с кнопкой
выбора')
#!====================================================================
CONTROLS
PROMPT('Тип Документа:'),,USE(?Loc:TypeOp:Prompt),TRN,LEFT
ENTRY(@s36),AT(60,0,130,10),USE(LOC:TypeOpName),SKIP,LEFT(1),COLOR(COLOR:Silver),READONLY
BUTTON,AT(133,0,11,11),USE(?ButtonTypeOp_),SKIP,MSG('Выбор Типа
Документа'),TIP('Выбор Типа Документа'), ICON('Look.ico')
END
#!
#DISPLAY ('')
#BOXED( ' Поле кода Типа Документа: ' )
#DISPLAY ('')
#PROMPT ('Поле кода:', FIELD(%Primary)), %TypeOp, REQ,
DEFAULT('tt1:TypeOp')
#DISPLAY ('')
#PROMPT ('Фильтр:', @s100), %FilterStr, REQ, DEFAULT('top:ID=10 or top:ID=30
or top:ID=50 or top:ID=54')
#DISPLAY ('')
#ENDBOXED
#!
#! ----- Локальные переменные -----
#LOCALDATA
LOC:TypeOp USHORT ! Тип
операции
LOC:TypeOpName STRING(40) ! Название операции
LOC:R USHORT
! Для возвращаемого значения
#ENDLOCALDATA
#!
#! ------- После открытия окан -------
#AT (%AfterWindowOpening)
LOC:TypeOp = %TypeOp
LOC:TypeOpName = GetTop_Name( %TypeOp )
if DostObj( 'TypeOpField' )<>0
disable( ?ButtonTypeOp_ ) ! Запретить
изменение, если нет прав доступа
.
#ENDAT
#!
#! ----- ?ButtonTypeOp_ -----
#AT (%ControlPostEventHandling, '?ButtonTypeOp_', 'Accepted')
LOC:R = TypeOp_s( '%FilterStr')
if LOC:R<>0 and LOC:R<>LOC:TypeOp
%TypeOp = LOC:R
LOC:TypeOp = LOC:R
LOC:TypeOpName = GetTop_Name( %TypeOp )
display( ?LOC:TypeOpName )
SerNum_Change( LOC:Firm, LOC:TypeOP, LOC:Number, ) ! Изменить
ключевые поля файлов-потомков
Message( 'После изменения Типа документа
вам <10,13>' & |
'нужно
изменить Учетный Номер и после <10,13>' & |
'этого
нажать кнопку "Ok" !', ' ВНИМАНИЕ ', icon:Exclamation )
#EMBED(%AfterChangeTypeOP,'После изменения Типа
Документа'),'?ButtonTypeOp_'
.
#ENDAT
Сontrol-шаблон Entry_NumberDate реализует поля
ввода "Номер" и "Дата" документа. По
умолчению эти поля заполняются автоматически,
поэтому они имеют атрибут 'SKIP', но, при
желании, пользователь может их изменить.
Рядом с полем ввода Даты имеется кнопка для
выбора даты при помощи встроенного календарика.
#!=================================================================
#CONTROL (Entry_NumberDate, 'Поля ввода Номера и Даты
документа')
#!================================================================
CONTROLS
PROMPT('Учетный Номер:'),USE(?TT1:Number:Prompt),TRN
ENTRY(@n_6),AT(60,0,35,10),MSG('Учетный номер
документа'),USE(TT1:Number),CENTER,SKIP,REQ
PROMPT('от'),AT(38,0,8,10),USE(?TT1:Date:Prompt),TRN
ENTRY(@d5.),AT(12,0,42,10),MSG('Дата
документа'),USE(TT1:Date),SKIP,CENTER,REQ
BUTTON,AT(46,0,11,11),MSG('Выбор даты по Календарю'),
TIP('Выбор даты'),USE(?ButtonDate), |
ICON('CALEND.ICO')
END
#!
#! ----- Локальные переменные -----
LOC:Number ULONG ! "Старый" номер документа
LOC:Date ULONG ! "Старая дата
#ENDLOCALDATA
#!
#! ----- Инициализация -----
#AT (%ProcedureInitialize)
LOC:Number = tt1:Number
LOC:Date = tt1:Date
#ENDAT
#!
#! ------- После открытия окна -------
#AT (%AfterWindowOpening)
! --- Изменить иконку и заголовок окна -----
case LocalRequest
of InsertRecord
THIS{prop:Icon} = '~INS_DOC_.ICO'
THIS{prop:Text} = THIS{prop:Text} & ' (Новый)'
of ChangeRecord
THIS{prop:Icon} ='~CHA_DOC_.ICO'
if tt1:Metka=''
THIS{prop:Text} = THIS{prop:Text} & '
(Изменение)'
.
of DeleteRecord
THIS{prop:Icon} ='~DEL_DOC_.ICO'
THIS{prop:Text} = THIS{prop:Text} & ' (Удаление)'
.
#ENDAT
#!
#! ----- ?tt1:Number -----
#AT (%ControlPostEventHandling, '?tt1:Number', 'Accepted')
if ~THIS{prop:AcceptAll} and tt1:Number<>LOC:Number
SerNum_Change( LOC:Firm, LOC:TypeOP, LOC:Number, ) !
Изменить ключевые поля файлов-потомков
select( ?Ok )
post( event:Accepted, ?Ok ) ! И сразу
нажать на кнопку 'Ok'
.
#ENDAT
#!
#! ----- ?tt1:Date -----
#AT (%ControlPostEventHandling, '?TT1:Date', 'Accepted')
if ~THIS{prop:AcceptAll}
tt1:Kurs = KursDate( tt1:Date ) ! Курс
базовой валюты на эту дату
display( ?tt1:Kurs )
if tt1:Poz > 0 ! Если в
документе уже есть записи о товарах
do Pereschet !
Пересчитать записи о товарах
.
#EMBED(%AfterChangeDate,'После изменения Даты'),'?tt1:Date'
if tt1:Date <> LOC:Date
SerNum_Change( LOC:Firm, LOC:TypeOP, LOC:Number, )
! Изменить ключевые поля файлов-потомков
.
ForceRefresh=True
do RefreshWindow
.
#ENDAT
#!
#! ----- ?ButtonDate -----
#AT (%ControlPostEventHandling, '?ButtonDate', 'Accepted')
! Изменить дату при помощи Календарика
tt1:Date = GCalend( tt1:Date, THIS{prop:Xpos}+?ButtonDate{prop:Xpos},
THIS{prop:Ypos}+?ButtonDate{prop:Ypos}+24, )
display( ?tt1:Date )
tt1:Kurs = KursDate( tt1:Date ) ! Курс базовой
валюты на эту дату
display( ?tt1:Kurs )
if tt1:Poz > 0 ! Если в документе уже
есть записи о товарах
do Pereschet ! Пересчитать
записи о товарах
.
#EMBED(%AfterChangeDate,'После изменения Даты'),'?ButtonDate'
if tt1:Date <> LOC:Date
SerNum_Change( LOC:Firm, LOC:TypeOP, LOC:Number, ) !
Изменить ключевые поля файлов-потомков
.
ForceRefresh=True
do RefreshWindow
#ENDAT
Сontrol-шаблон Entry_CCode реализует поле ввода и кнопку выбора Контрагента из Справочника Контрагентов. Для выбора Контрагента из Справочника Контрагентов используется функция Comp_s(). Ей в качестве параметров передаются несколько признаков для для ограничения списка доступных контрагентов. Функция GetC_SName() возвращает Обозначение Контрагента по его коду. Доступ к Справочнику Контрагентов осуществляется только при помощи функций Comp_s() и GetC_SName() и т.п., поэтому его файл не нужно объявлять в процедуре формы документа и процедура не должна ничего "знать" об устройстве этого файла.
#!====================================================================
#CONTROL (Entry_CCode, 'Поле ввода кода Организации с
кнопкой выбора')
#!====================================================================
#DISPLAY ('')
#BOXED( ' Поле кода Организации: ' )
#DISPLAY ('')
#PROMPT ('Поле кода:', FIELD ), %FieldCCode, REQ, DEFAULT('tt1:CCode')
#DISPLAY ('')
#ENDBOXED
#DISPLAY ('')
#BOXED( ' Покупатель ' )
#DISPLAY ('')
#PROMPT ('Признак "Поставщик"', CHECK), %PostFlag,
DEFAULT(%FALSE)
#PROMPT ('Признак "Покупатель"', CHECK), %PokFlag,
DEFAULT(%TRUE)
#DISPLAY ('')
#ENDBOXED
#!
CONTROLS
PROMPT('Покупатель:'),USE(?CCode:Prompt),TRN,#LINK(?Loc:CCode)
ENTRY(@n_5),AT(45,0,35,10),USE(LOC:CCode),CENTER,MSG('Код
Организации'), |
REQ,#LINK(?Loc:CCode:Prompt)
BUTTON,AT(39,0,11,11),USE(?ButtonComp_),MSG('Выбор
Организации'),TIP('Выбор Организации'), |
ICON('Look.ico')
STRING(@s20),AT(15,0,,10),USE(LOC:CompName),TRN,FONT(,,COLOR:Navy,FONT:bold)
END
#!
#! ----- Локальные переменные -----
#LOCALDATA
LOC:CCode USHORT ! Код
Организации
LOC:CompName STRING(20) ! Обозначение Организации
LOC:R USHORT !
Возвр. значение
#ENDLOCALDATA
#!
#! ------- После открытия окна -------
#AT (%AfterWindowOpening)
LOC:CCode = %FieldCCode
LOC:CompName = GetC_SName( LOC:CCode )
#ENDAT
#!
#! ----- ?LOC:CCode -----
#AT (%ControlPostEventHandling, '?LOC:CCode', 'Accepted')
if ~THIS{prop:AcceptAll}
if ~IsComp( LOC:CCode )
LOC:R = Comp_s( LOC:CCode, %PostFlag, %PokFlag, 1 )
if LOC:R <> ''
LOC:CCode = LOC:R
.
.
%FieldCCode = LOC:CCode
LOC:CompName = GetC_SName( LOC:CCode )
#EMBED(%AfterChangeCCode,'После изменения
Организации'),'?LOC:CCode'
ForceRefresh=True
do RefreshWindow
. ! End if ~THIS ...
#ENDAT
#!
#! ----- ?ButtonComp_ -----
#AT (%ControlPostEventHandling, '?ButtonComp_', 'Accepted')
LOC:R = Comp_s( LOC:CCode, %PostFlag, %PokFlag, 1 )
if LOC:R <> ''
LOC:CCode = LOC:R
%FieldCCode = LOC:CCode
LOC:CompName = GetC_SName( LOC:CCode )
#EMBED(%AfterChangeCCode,'После изменения
Организации'),'?ButtonComp_'
ForceRefresh=True
do RefreshWindow
.
#ENDAT
Control-шаблон Entry_MOL реализует поле ввода
кода Сотрудника с кнопкой выбора из Справочника
Сотрудников. Для выбора Сотрудника из
Справочника Сотрудников используется функция MOL_s().
Функция GetMOL_SName() возвращает фамилию
сотрудника по его коду. Доступ к Справочнику
Сотрудников осуществляется только при помощи
функций MOL_s() и GetMOL_SName() и т.п.,
поэтому его файл не нужно объявлять в
процедуре формы документа и процедура не должна
ничего "знать" об устройстве этого файла.
Функция DostObj()
используется для проверки прав доступа
изменения поля "Оператор".
#!====================================================================
#CONTROL (Entry_MOL, 'Поле ввода Сотрудника с кнопкой
выбора')
#!====================================================================
CONTROLS
PROMPT('Оператор:'),,USE(?Loc:MolName:Prompt),TRN,LEFT
ENTRY(@s25),AT(40,0,110,10),USE(LOC:MOLName),SKIP,LEFT(1),COLOR(COLOR:Silver),READONLY
BUTTON,AT(113,0,11,11),USE(?ButtonMOL_),SKIP,MSG('Выбор
Оператора'),TIP('Выбор Оператора'), |
ICON('Look.ico')
END
#!
#DISPLAY ('')
#BOXED( ' Поле кода Сотрудника: ' )
#DISPLAY ('')
#PROMPT ('Поле кода:', FIELD(%Primary)), %SCode, REQ, DEFAULT('tt1:SCode')
#DISPLAY ('')
#ENDBOXED
#!
#! ----- Локальные переменные -----
#LOCALDATA
LOC:MolName STRING(40) ! Фамилия И.О. сотрудника
LOC:R USHORT !
Возвращаемое значение
#ENDLOCALDATA
#!
#! ------- После открытия окна -------
#AT (%AfterWindowOpening)
LOC:MolName = GetMOL_SName( %SCode )
if DostObj( 'SCode' )<>0
disable( ?ButtonMOL_ ) ! Запретить
изменение, если нет прав доступа
.
#ENDAT
#! ----- ?ButtonMOL_ -----
#AT (%ControlPostEventHandling, '?ButtonMOL_', 'Accepted')
LOC:R = MOL_s()
if LOC:R <> 0
%SCode = LOC:R
LOC:MolName = GetMOL_SName( %SCode )
display( ?LOC:MOLName )
#EMBED(%AfterChangeMOL,'После изменения Сотрудника'),'?ButtonMOL_'
.
#ENDAT
Control-шаблон Entry_Kurs применяется для реализации поля "Курс базовой валюты" документа.
#!=============================================================
#CONTROL (Entry_Kurs, 'Курс базовой валюты
документа')
#!=============================================================
CONTROLS
PROMPT('Курс'),AT(-44,0),USE(?TT1:Kurs:Prompt),TRN
ENTRY(@n11.4),AT(,,44,10),MSG('Курс базовой
валюты'),USE(TT1:Kurs),CENTER
STRING(@s4),AT(-21,0,20,10),USE(glo:BVObozn,,?glo:BVObozn:222),TRN
END
#!
#! ----- ?tt1:Kurs - Selected -------
#AT (%ControlPreEventHandling, '?TT1:Kurs', 'Selected')
if ~THIS{prop:AcceptAll} and tt1:Kurs=0
tt1:Kurs = KursDate( tt1:Date ) ! Курс БВ на
дату документа
display( ?tt1:Kurs )
if tt1:Poz > 0 ! Если в
документе уже есть записи о товарах
do Pereschet !
Пересчитать записи о товарах
.
.
#ENDAT
#!
#! ----- ?tt1:Kurs - Accepted ------
#AT (%ControlPreEventHandling, '?TT1:Kurs', 'Accepted')
if THIS{prop:AcceptAll} <> 1
if tt1:Poz > 0 ! Если в
документе уже есть записи о товарах
do Pereschet !
Пересчитать записи о товарах
.
.
#ENDAT
Extention-шаблон SpisokTow реализует функции поддержки Списка Товаров документа.
Шаблон использует следующие глобальные переменные:
dll:ChangeFlag
String(1),TREAD ! Признак "Были изменения в
списке товаров"
glo:IniFileName STRING(80) ! Имя INI-файла
TLQ Queue,PRE(tlq) !
Queue для отмеченных товаров
tlq:Number ULONG !
Номер в списке отмеченных товаров
tlq:TCode STRING(13) ! Код товара
tlq:Quant Decimal(13.3) ! Количество товара
END
#!================================================================
#EXTENSION (SpisokTow, 'Список Товаров
документа'), PROCEDURE
#!================================================================
#!
#DISPLAY ('')
#DISPLAY ('1) Сохраняет и восстанавливает формат Browse.')
#DISPLAY ('2) Поддерживает горячие клавиши')
#DISPLAY ('3) Изменяет доступность кнопок ?Insert,')
#DISPLAY (' ?Delete, ?Button_Import, ?Ok')
#DISPLAY ('4) Записывает TTN1, если были изменения')
#DISPLAY (' в списке товаров')
#DISPLAY ('')
#!
#! ----- Локальные переменные-----
#LOCALDATA
LOC:Name STRING(100) ! Наименование товара
LOC:Ed STRING(6) ! Единица
измерения товара
LOC:Metka STRING(1) ! Метка товара
LOC:QuantStr STRING(13) ! Строка для вывода количества
товара
#ENDLOCALDATA
#!
#! ----- Инициализация -----
#AT (%BeforeAccept)
!-- Восстановить формат Browse из INI-файла --
?Browse:1{prop:FORMAT} = getIni( '%Procedure', 'BrowseFormat',
?Browse:1{prop:FORMAT},
glo:IniFileName )
#ENDAT
#!
#! ----- После открытия окна -----
#AT (%AfterWindowOpening)
dll:ChangeFlag = '' ! Признак "Были
изменения в списке товаров"
! -- Если документ утвержден, то запретить
кнопки
if tt1:Metka <> NIL
! disable( ?Insert )
! disable( ?Delete )
! disable( ?Button_Import )
.
#ENDAT
#!
#! ----- Preparing Window Alerts -----
#AT (%PrepareAlerts)
alert( MetkKey ) ! HotKey для изменения
Метки "Утверждено" товара
#ENDAT
#!
#! ----- Обработка горячих клавиш -----
#AT (%WindowEventHandling, 'AlertKey')
if keyCode() = MetkKey ! Изменение Метки
"Утверждено" товара
do SyncWindow
if tt2:Metka <> NIL
tt2:Metka = NIL
else
tt2:Metka = '+'
.
put( TTN2 )
ForceRefresh = True
do RefreshWindow
.
#ENDAT
#!
#! ----- После событий Browse -----
#AT (%ControlPostEventCaseHandling, '?Browse:1')
! -- Доступность кнопки "Удалить"
if tt2:Metka<>NIL or tt1:Metka<>NIL
! disable( ?Delete )
else
enable( ?Delete )
.
#ENDAT
#!
#! ------ Before Closing the Window ------
#AT (%BeforeWindowClosing)
! -- Сохранить формат Browse --
putIni( '%Procedure', 'BrowseFormat', ?Browse:1{prop:FORMAT}, glo:IniFileName )
#ENDAT
#!
#! ----- After Range and Filter Check Browse:1 ------
#AT (%AfterRangeFilterCheck, '2')
tlq:TCode = tt2:TCode
get( TLQ, tlq:TCode ) ! Queue отмеченных товаров
if ~errorcode()
loc:Metka = '•' ! Отметка
данного товара
.
loc:Name = GetT_Name( tt2:TCode ) !
Наименование товара
loc:Ed = GetT_Ed( tt2:TCode )
! Ед.измерения товара
if GetT_VesFlag( tt2:TCode ) = True ! Если товар
весовой
loc:QuantStr = format( tt2:Quant, @n-11.3 ) ! Строка
количества товара
else
loc:QuantStr = format( tt2:Quant, @n-10 )
.
#ENDAT
#!
#AT (%WindowEventHandling, 'CloseWindow')
if dll:ChangeFlag<>''
! Если
были изменения в Списке товаров
put( TTN1 )
! Записать суммы в TTN1
LocalResponse = RequestCompleted
select( ?Ok )
post( event:Accepted, ?Ok ) ! Выход
с записью изменений
break
.
#ENDAT
#!
#AT (%WindowEventHandling, 'CloseDown')
if dll:ChangeFlag<>''
put( TTN1 )
LocalResponse = RequestCompleted
select( ?Ok )
post( event:Accepted, ?Ok )
break
.
#ENDAT
Control-шаблон Button_ShowTow реализует кнопку
вызова записи о текущем товаре. Собственно
вывод записи Справочника Товаров о текущем
товаре осуществляется при помощи функции
ShowTowRecord( %TowField ).
#!===================================================================
#CONTROL (Button_ShowTow, 'Кнопка вызова
записи о текущем товаре')
#!===================================================================
CONTROLS
BUTTON,AT(,,16,16),MSG('Вызвать запись о текущем
товаре'), TIP('Показать товар'), |
USE(?ShowTow), ICON('TOW.ICO')
END
#!
#DISPLAY ('')
#DISPLAY ('Кнопка вызова записи о
текущем товаре')
#DISPLAY ('')
#DISPLAY ('Название поля товара:')
#PROMPT ('Поле товара:', @s20), %TowField, REQ, DEFAULT('tt2:TCode')
#DISPLAY ('')
#!
#ATSTART
#DECLARE (%ButtonShowTow)
#FOR (%Control), WHERE(%ControlInstance = %ActiveTemplateInstance)
#SET (%ButtonShowTow, %Control)
#ENDFOR
#ENDAT
#!
#AT (%WindowEventHandling, 'OpenWindow')
?ShowTow{prop:Key}=TowKey ! Назначить
горячую клавишу
#ENDAT
#!
#! ---- Button_ShowT ----
#AT (%ControlPostEventHandling, '?ShowTow', 'Accepted')
ShowTowRecord( %TowField ) ! Показать
запись Справочника Товаров
select( ?Browse:1 )
#ENDAT