Реализация Записи о Документе

Документы хранятся в Ведомостях Документов и имеют следующие свойства:

Документы хранятся в специальном файле (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.  Если документ имеет список товаров, то он располагается на отдельном листе формы вместе со всеми органами управления списком товаров.   Ниже приведен пример реализации документа типа "Приходная накладная":

InTTN_u.gif (10433 bytes)

InTTN_u2.gif (11856 bytes)

Для облегчения реализации документов различных типов имеется несколько control-шаблонов для размещения в окне документа типовых controls, а также extention-шаблон SpisokTow, в котором реализована функциональность Списка Товаров документа.

Вот полный список шаблонов поддержки записи о документе:

 

Шаблон Entry_Firm

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

Шаблон Entry_TypeOp

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

 

Шаблон Entry_NumberDate

С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

 

Шаблон Entry_CCode

С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

Шаблон Entry_MOL

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

Шаблон  Entry_Kurs

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

Шаблон SpisokTow

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

Шаблон  Button_ShowTow

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

Hosted by uCoz