Главная DISCLAIMER Ссылки Карта сайта Контакты
Главная arrow Вопросы разработки arrow Источники данных arrow Добавление функционала "Адрес доставки" в расходную накладную
Добавление функционала "Адрес доставки" в расходную накладную

По сути, в предложенном решении вопроса в форму расходной накладной или заявки добавляется третий корреспондент - подразделение покупателя, которому осуществляется доставка. При этом в селекторе ввода/выбора "Доставка:" отображается название этого подразделения и его адрес, который может быть задан или изменён оператором непосредственно из формы, без вызова каких-либо вспомогательных диалогов.

Адрес доставки хранится в строковом параметре op.String2 документа, т.е адрес индивидуален для каждого документа. Кроме того, в параметре op.Long2 документа сохраняется источник этого адреса - идентификатор подразделения покупателя, которому осуществляется доставка.
Адрес формируется из названия подразделения покупателя и параметра этого подразделения "Адрес доставки" - т.е изначально можно работать с незаполненным параметром. Когда адрес доставки вводится оператором в селектор вручную, он сохраняется в параметре подразделения для повторного использования при следующих отгрузках этому покупателю. По щелчку на селекторе, если у покупателя есть подразделения, предлагается выбор подразделения для доставки.

Вся логика работы заложена в классе, для реализации описанного функционала достаточно добавить текст класса в модуль формы расходной накладной, а на форме разместить селектор "Доставка:" с предопределённым именем sel_ps2.

Если ссылку на подразделение покупателя хранить не в свойстве документа (op.String2), а в аналитике проводки, появится возможность построение отчётов по отгрузке/задолженности в разрезе подразделений покупателя стандартными средствами Акцента (с помощью мастера отчётов).

Dim bs2 : Set bs2=New BindString2  'Класс селектора для op.String2
sel_ps2.DataSource="bs2.Value"    'Cелектор на форме
sel_ps2.DisableBindClick
Sub sel_ps2_OnClick : bs2.DoClick : End Sub
Class BindString2 '© NANSI 2006
  Private Sub Class_Initialize
  End Sub
  Public Default Property Get Value
    'для создаваемой операции, если не задана доставка и есть вложенные - 
    ' принудительно устанавливаем самого плательщика.
    If op.String2="" And op.IsNew Then  
      If Not op.Trans(1,1).AgFrom Is Nothing Then If op.Trans(1,1).AgFrom.Children.Count>0 Then _
        op.String2=op.Trans(1,1).AgFromBind.Name : op.Long2=op.Trans(1,1).AgFromID
    End If
    If op.String2="" Then Value="" Else Value=op.String2
  End Property
  Public Property Let Value(txt)
    If txt="" Then op.String2="" : op.Long2=0 : Exit Property  'при очистке поля очищаем связь.
    op.String2=txt
    If op.Long2<>0 Then
    If Not workarea.Agent(op.Long2) Is Nothing Then
      If ask("сохранить этот адрес в параметре ПОДРАЗДЕЛЕНИЯ?") Then _
        workarea.Agent(op.Long2).Params("Адрес доставки").Value=op.String2
    End If
    End If 
  'при вводе букв НЕ делаем поиск агента по вхождению.
  End Property
  Public Sub DoClick
    Dim prntAgID : prntAgID=op.Trans(1,1).AgFromID    'родитель для ограничения выбора.
    If prntAgID=0 Then Exit Sub
    If Not workarea.Agent(prntAgID).Params.Exists("Адрес доставки") Then _
      workarea.Agent(prntAgID).Params.Create vbString, "Адрес доставки"
    'стартовое значение выбора.
    Dim strtAgID : If op.Long2=0 Then strtAgID=prntAgID   Else strtAgID=op.Long2
    If workarea.Agent(prntAgID).Children.Count>0 Then
        strtAgID=workarea.Agent(prntAgID).Children.Item(1).ID
        Dim agID : agID=workarea.Browse(acAgent,strtAgID,prntAgID,5,"Подразделение для доставки")
                 : If agID=0 Then Exit Sub  'отказ от выбора
        If Not workarea.Agent(agID).Params.Exists("Адрес доставки") Then _
               workarea.Agent(agID).Params.Create vbString, "Адрес доставки"
        Dim adost : adost=workarea.Agent(agID).Params("Адрес доставки").Value2
        op.String2=workarea.Agent(agID).Name &" "& Replace(adost, workarea.Agent(agID).Name, "")
        op.Long2=agID : Form.Recalc
    Else
        op.Long2=0
        adost=workarea.Agent(prntAgID).Params("Адрес доставки").Value2
        If adost="" Then adost=op.Trans(1,1).AgFromBind.Address
        If op.String2="" Then op.String2=adost : sel_ps2.Text=adost
        If workarea.Agent(prntAgID).Params("Адрес доставки").Value2<>adost Then _
          If ask("сохранить этот адрес в параметре покупателя?") Then _
               workarea.Agent(prntAgID).Params("Адрес доставки").Value=adost
    End If
  End Sub
End Class

Для поддерки работы селектора в событие, возникающее при смене корреспондента в форме, добавляем очистку прежнего адреса доставки

'op.String2  'в нём хранится наименование подразделения покупателя + адрес доставки.
'op.Long2  'в нём хранится идентификатор подразделения покупателя.
 
Sub sel_agFrom_OnBound(ByRef Lock)  'при смене корреспондента в форме
  op.TransList(1).SetAgFrom op.Trans(1,1).AgFromID
  If op.Long2<>0 Then op.Long2=0 : 'при смене корреспондента старое значение очищаем.
  op.String2=CheckNull(op.Trans(1,1).AgFromBind.ParamValue("Адрес доставки"),"")
  ChangeAgent  'расставить цены из прайс-листа
  Call StartRecalc  
End Sub
 
« Пред.   След. »