Заказ - это счет, который еще не означает списание со склада. При заполнении заказа агенту незачем делить его на несколько документов, потом каким-то образом разделим его на несколько накладных. Можно сделать так, чтобы накладная разделялась в зависимости от наличия товара автоматически. Но без контроля человека это может привести к путанице. Например, товар имеется на двух складах, программа спишет всегда с первого. В реальности отгрузили с первого, но сегодня еще не успели его оприходовать, а были остатки на втором...
Поэтому я рекомендую поступать так:
В Сервис/Настройки, там - Работа/Сообщать в рамке "О недостатке товара" выбрать "Не выводить сообщение". Создали по счету накладную, проведите ее кнопкой внизу, даже не сохраняя ее. Красным цветом будут выделены позиции, отсутствующие на складе, удалите их и сохраните документ. Снова создайте по счету накладную (программа включит в нее только оставшиеся позиции), выберите в ней другой склад, проведите и т.д.
Если все-таки автоматически:
В расходной накладной нажать вверху "Выбор операции" (будет выделена "Продажа"), нажать "Изменить", в шаблоне операции нажать "Программа".

- 1.png (16.75 КБ) Просмотров: 1401

- 2.png (15.41 КБ) Просмотров: 1401
Скопировать и вставить следующий текст:
- Код: Выделить всё
Dim Frm As Predpr.FrmDoc, FrmNew As Predpr.FrmDoc
Dim SRow As Predpr.SubRow, i As Integer, x As Integer
Dim SRowNew As Predpr.SubRow, TrNew As Predpr.TransRow, OpNew As Predpr.Doc
Dim Trans As Predpr.TransRow = Op.DocTransCalc(1)
For Each SRow In Trans.SubRows.Values
If SRow.Integ2 = -1 Then
GoTo Start
End If
Next
Exit Sub
Start: If Microsoft.VisualBasic.MsgBox("Разделить накладную на несколько складов?", Microsoft.VisualBasic.MsgBoxStyle.Question + Microsoft.VisualBasic.MsgBoxStyle.YesNo, "При недостатке товара") = Microsoft.VisualBasic.MsgBoxResult.No Then
Exit Sub
End If
Predpr.DataMain.FormApp.StatBar.Panels(0).Text = "Создаются накладные на каждый склад..."
Dim Roff As Predpr.TableSQL, ArrOp As New System.Collections.Hashtable, iOp As Integer
Roff = Predpr.DataMain.DBmain.OpenRecordset("SELECT ID FROM Persons WHERE ID<>" & Op.OfficeID & " AND TypeID=2")
Do While Not Roff.EOF
OpNew = Predpr.DataMain.AppData.DocsCollection.Add(2)
OpNew.OfficeID = Roff("ID")
OpNew.PersonID = Op.PersonID
OpNew.DocDate = Op.DocDate
ArrOp.Add(OpNew.OfficeID, OpNew)
Roff.MoveNext()
Loop
Predpr.DataMain.FormApp.StatBar.Panels(0).Text = "Вычисляются остатки на складах..."
Dim Rqnt As Predpr.TableSQL, Fld As Predpr.FieldSQL
Dim DtStr As String = Predpr.GlobalFunction.SQLdate(Op.DocDate)
Rqnt = Predpr.DataMain.DBmain.OpenRecordset("TRANSFORM Sum([Quantity]*[Sign]) AS Qnt SELECT ArticleID FROM Data_Articles WHERE DocDate<=" & DtStr & " and OfficeID<>" & Op.OfficeID & " GROUP BY ArticleID PIVOT OfficeID")
Predpr.DataMain.FormApp.StatBar.Panels(0).Text = "Переносятся строки..."
x = Trans.SubRows.Count
Do While x > 0
SRow = Trans.SubRows(x)
If SRow.Integ2 = -1 Then
Rqnt.FindFirst("ArticleID=" & SRow.ArticleID)
For Each Fld In Rqnt.Fields
If Fld.Name <> "ArticleID" Then
If Predpr.GlobalFunction.Nz(Fld.Value, 0) >= SRow.Qnt Then
OpNew = ArrOp(CInt(Fld.Name))
TrNew = OpNew.DocTransCalc(1)
SRowNew = SRow.Clone(TrNew)
SRow.Delete()
Exit For
End If
End If
Next
End If
x = x - 1
Loop
Frm = Op.Form
Trans = Op.DocTransCalc(1)
Frm.Grid.SetLinkTransRow(Trans, True)
Op.DocText = ""
Op.Form.SetBoxText("BoxText", "")
Frm.Refresh()
System.Threading.Thread.Sleep(1000)
Dim ArrFrmOp As New System.Collections.ArrayList
For Each OpNew In ArrOp.Values
TrNew = OpNew.DocTransCalc(1)
If TrNew.SubRows.Count > 0 Then
ArrFrmOp.Add(OpNew)
End If
Next
Predpr.DataMain.FormApp.StatBar.Panels(0).Text = ""
If ArrFrmOp.Count = 0 Then
Microsoft.VisualBasic.MsgBox("На других складах недостающий товар также отсутствует", , "Результат")
Exit Sub
End If
Dim FullW As Integer = Predpr.DataMain.FormApp.ClientSize.Width - 4
Dim FullH As Integer = Predpr.DataMain.FormApp.ClientSize.Height - 4 - Predpr.DataMain.FormApp.StatBar.Height - 26 'Predpr.DataMain.FormApp.TabList.Height
Dim TmpW = FullW / (ArrFrmOp.Count + 1)
Dim TmpL As Integer
Frm.WindowState = System.Windows.Forms.FormWindowState.Normal
Frm.Top = 0
Frm.Left = 0
Frm.Height = FullH
Frm.Width = TmpW
System.Threading.Thread.Sleep(500)
Frm.Refresh()
Dim iFrm As Integer
For iFrm = 0 To ArrFrmOp.Count - 1
OpNew = ArrFrmOp(iFrm)
FrmNew = Predpr.GlobalFunction.OpenFormDocFromOp(OpNew)
OpNew.Modified = True
TmpL = TmpL + TmpW
FrmNew.WindowState = System.Windows.Forms.FormWindowState.Normal
FrmNew.Top = 0
FrmNew.Left = TmpL
FrmNew.Height = FullH
FrmNew.Width = TmpW
System.Threading.Thread.Sleep(500)
FrmNew.Refresh()
Next
Нажать "Сохранить".
Если решите отказаться от автоматического способа, удалить этот текст в шаблоне операции и сохранить.