Страница 1 из 2

Персональная программа в шаблоне операции

СообщениеДобавлено: Пт апр 08, 2016 1:12 pm
dmitry
Решение, которое закрывает многолетнюю дискуссию о себестоимости валютного товара при продаже (viewtopic.php?f=1&t=2028&start=15).
Программа вычисляет ее по курсу, который был на момент приобретения, а пользователи считают, что нужно пересчитывать по сегодняшнему курсу.

Чтобы действовал второй вариант: в расходной накладной нажать вверху "Выбор операции" (будет выделена "Продажа"), нажать "Изменить", в шаблоне операции нажать "Программа".

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

2.png
2.png (15.41 КБ) Просмотров: 4130

Скопировать и вставить следующий текст:

If Predpr.DataMain.ReportCurrID > 1 Then Exit Sub
Dim Row As Predpr.SubRow, Trans As Predpr.TransRow, TrNum As Integer
If Predpr.DataMain.UseBuhAcc = False Then
TrNum = 2
Else
TrNum = 4
End If
Trans = Op.DocTransCalc(TrNum)
For Each Row In Trans.SubRows.Values
If Row.CurrID > 1 Then
GoTo Start
End If
Next
Exit Sub
Start: Dim TrNew As New Predpr.TransRow(Op, Trans.TransOfficeID, Trans.TransPersonID)
Dim TrTempl As Predpr.TemplRow = Op.Templ.TemplRowsCalc(TrNum)
Dim RowNew As Predpr.SubRow
.Flag = True
.FlagDb = True
.AccDbID = TrTempl.TransRow.AccDbID
For Each Row In Trans.SubRows.Values
RowNew = New Predpr.SubRow(TrNew, Row.ArticleID, Row.Qnt)
RowNew.CurrID = Row.CurrID
RowNew.Price = Row.Price
Row.AccDbID = 0
Next
Trans.AccDbID = 0
Op.DocTransCalc.Add(TrNew.TransNum, TrNew)


Это будет действовать так:
Если среди товаров не было закупки в валюте, при продаже останутся обычные настройки:

3.png
3.png (14.02 КБ) Просмотров: 4130

Если были валютные, то при проведении документа они изменятся:

4.png
4.png (15.2 КБ) Просмотров: 4130

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Пн апр 11, 2016 7:19 am
makc
Приветствую! Такой вопрос, что-бы действовало нововведение нужно каждый раз для каждой отдельно взятой расходной копировать и вставлять текст "программы" или это достаточно сделать один раз и оно будет дальше действовать для всех расходных?

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Пн апр 11, 2016 8:31 am
dmitry
Один раз.

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Пн апр 11, 2016 4:28 pm
Volodymyr
ИзображениеИзображение
У нас при нажатии сохранить выдает какую то ошибку?

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Пн апр 11, 2016 7:06 pm
dmitry
Немного изменил текст, чтобы его правильно воспринимал SQL Server (это было из-за незаметной одинарной кавычки).
Скопируйте и сохраните его заново.

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Вт апр 12, 2016 9:49 am
Volodymyr
Ок!Спасибо!Получилось!

Еще одно решение

СообщениеДобавлено: Вт апр 12, 2016 10:59 am
dmitry
Решение ситуации, когда товар имел цены в $, оплатили его в $, но за прошедшее время курс изменился, и в грн долг не закрывается (viewtopic.php?f=1&t=2028).

Сначала создадим отдельную операцию, чтобы применять ее выборочно - только когда известно, что покупатель с нами или мы с поставщиком полностью рассчитались, а если долг не закрывается на какую-то сумму, то это из-за курсовой разницы.
Для расчетов с покупателями: открыть Документы/Касса/Приход, нажать вверху "Выбор операции", нажать "По образцу".

1.png
1.png (15.01 КБ) Просмотров: 4059

Задать название "Расплатился полностью" или "Полный расчет" и нажать "Программа".

2.png
2.png (18.24 КБ) Просмотров: 4059


Скопировать и вставить следующий текст:

Dim PokupID As Integer = Op.PersonID
If PokupID = 0 Then Exit Sub
Dim CaseInt As Integer, Trans As Predpr.TransRow, R As Predpr.TableSQL
Dim Str As String = "SELECT Sum(PriceReport*Quantity*[Sign]) AS [Sum] FROM Data_Persons "
Str = Str & "WHERE PersonID=" & PokupID & " AND DocDate<=" & Predpr.GlobalFunction.SQLdate(Op.DocDate) & " AND DocID<>" & Op.ID
R = Predpr.DataMain.DBmain.OpenRecordset(Str)
Dim OpSum As Decimal = Predpr.GlobalFunction.InTargetCurr(Predpr.DataMain.ReportCurrID, 1, Op.DocSum, Op.DocDate)
Dim Sum As Decimal = R("Sum") - OpSum
R.Close()
Select Case Sum
Case Is > 0.01
CaseInt = 1
Case Is < -0.01
CaseInt = 2
Case Else
Exit Sub
End Select
Dim TempID As Integer = Predpr.DataMain.Tmpl_RateMinus
Dim TemplKurs As Predpr.Templ = Predpr.DataMain.AppData.TemplsCollection.Item(TempID)
Dim TrTempl As Predpr.TemplRow = TemplKurs.TemplRowsCalc(1)
Dim AccKursID As Integer = TrTempl.TransRow.AccDbID
If Op.DocTransCalc.Count > 1 Then
Op.DocTransCalc.Remove(2)
End If
Trans = Op.DocTransCalc(1)
Dim TrNew As New Predpr.TransRow(Op, Op.OfficeID, PokupID)
Dim AbsSum As Decimal = System.Math.Abs(Sum)
TrNew.FlagDb = True
TrNew.FlagCr = True
Select Case CaseInt
Case 1
TrNew.AccDbID = AccKursID
TrNew.AccCrID = Trans.AccCrID
Microsoft.VisualBasic.MsgBox(AbsSum.ToString("0.00") & " долга списано на убытки", , "Курсовая разница")
Case 2
TrNew.AccCrID = AccKursID
TrNew.AccDbID = Trans.AccCrID
Microsoft.VisualBasic.MsgBox(AbsSum.ToString("0.00") & " долга зачислено в доход", , "Курсовая разница")
End Select
Dim SRow As New Predpr.SubRow(TrNew)
SRow.Qnt = 1
SRow.Price = AbsSum
SRow.CurrID = Predpr.DataMain.ReportCurrID
Op.DocTransCalc.Add(2, TrNew)



Для расчетов с поставщиками, аналогично - Документы/Касса/Расход, создать операцию "Расплатились полностью", ввести следующий текст:

Dim PokupID As Integer = Op.PersonID
If PokupID = 0 Then Exit Sub
Dim CaseInt As Integer, Trans As Predpr.TransRow, R As Predpr.TableSQL
Dim Str As String = "SELECT Sum(PriceReport*Quantity*[Sign]) AS [Sum] FROM Data_Persons "
Str = Str & "WHERE PersonID=" & PokupID & " AND DocDate<=" & Predpr.GlobalFunction.SQLdate(Op.DocDate) & " AND DocID<>" & Op.ID
R = Predpr.DataMain.DBmain.OpenRecordset(Str)
Dim OpSum As Decimal = Predpr.GlobalFunction.InTargetCurr(Predpr.DataMain.ReportCurrID, 1, Op.DocSum, Op.DocDate)
Dim Sum As Decimal = R("Sum") + OpSum
R.Close()
Select Case Sum
Case Is > 0.01
CaseInt = 1
Case Is < -0.01
CaseInt = 2
Case Else
Exit Sub
End Select
Dim TempID As Integer = Predpr.DataMain.Tmpl_RateMinus
Dim TemplKurs As Predpr.Templ = Predpr.DataMain.AppData.TemplsCollection.Item(TempID)
Dim TrTempl As Predpr.TemplRow = TemplKurs.TemplRowsCalc(1)
Dim AccKursID As Integer = TrTempl.TransRow.AccDbID
If Op.DocTransCalc.Count > 1 Then
Op.DocTransCalc.Remove(2)
End If
Trans = Op.DocTransCalc(1)
Dim TrNew As New Predpr.TransRow(Op, Op.OfficeID, PokupID)
Dim AbsSum As Decimal = System.Math.Abs(Sum)
TrNew.FlagDb = True
TrNew.FlagCr = True
Select Case CaseInt
Case 1
TrNew.AccDbID = AccKursID
TrNew.AccCrID = Trans.AccDbID
Microsoft.VisualBasic.MsgBox(AbsSum.ToString("0.00") & " долга списано на убытки", , "Курсовая разница")
Case 2
TrNew.AccCrID = AccKursID
TrNew.AccDbID = Trans.AccDbID
Microsoft.VisualBasic.MsgBox(AbsSum.ToString("0.00") & " долга зачислено в доход", , "Курсовая разница")
End Select
Dim SRow As New Predpr.SubRow(TrNew)
SRow.Qnt = 1
SRow.Price = AbsSum
SRow.CurrID = Predpr.DataMain.ReportCurrID
Op.DocTransCalc.Add(2, TrNew)


Как это будет действовать.
Если с учетом этой оплаты долг закрывается, проводки останутся без изменений:

4.png
4.png (8.55 КБ) Просмотров: 4059

Если образуется разница, она будет добавлена:

5.png
5.png (10.42 КБ) Просмотров: 4059

Кроме того появится сообщение об этих действиях:

6.png
6.png (3.56 КБ) Просмотров: 4059

или:

7.png
7.png (3.46 КБ) Просмотров: 4059

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 8:43 am
ruslabigboy
Вроде все понятно и логика абсолютно верная. Не очень понятна реализация. По идее, при уплате долга после смены курса должно происходить обнуление долга с убытком или прибылью в зависимости от текущего курса. В программе происходит это как-то не так. Поясню.
1. Имеется такой курс
курс.png
курс.png (7.15 КБ) Просмотров: 3494

2. Имеются продажа и покупка:
оказан.png
оказан.png (7.64 КБ) Просмотров: 3494

получен.png
получен.png (6.66 КБ) Просмотров: 3494

3. Сделаны операции "Полная оплата" в соответствии с приведенной выше инструкцией.
Дальше в следующем сообщении, ибо больше 3 скринов не дает в одно сообщение вставить

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 8:46 am
ruslabigboy
Продолжаем.
4. Проводим оплату по оказанной услуге:
оказан оплата.png
оказан оплата.png (23.98 КБ) Просмотров: 3494

оказан полня.png
оказан полня.png (23.25 КБ) Просмотров: 3494

5. Получаем такое сообщение:
оказан разница.png
оказан разница.png (3.24 КБ) Просмотров: 3494

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 8:48 am
ruslabigboy
6. Проводим оплату и получаем разницу по полученной услуге:
получен оплата.png
получен оплата.png (21.96 КБ) Просмотров: 3494

получен полная.png
получен полная.png (20.22 КБ) Просмотров: 3494

получен разница.png
получен разница.png (3.31 КБ) Просмотров: 3494

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 8:50 am
ruslabigboy
А теперь имеем такую картину по долгам:
долги.png
долги.png (17.54 КБ) Просмотров: 3494

Почему? Объясните, может не так что-то делаю...
По идее, я должен был по оказанной услуге получить прибыль в размере 10 уе, и обнуление долга; а по полученной услуге - соответственно наоборот, но тоже с нулевым долгом.

ПС. Да, забыл добавить.
Если проводить оплату обычным способом - то есть касса (оплата поставщику), то, естественно, при оплате полной суммы в грн - имеем долг в 10 уе (в зависимости от того кто кому платит)

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 12:05 pm
vik
Ключевое в данной ситуации " когда товар имел цены в $, оплатили его в $, но за прошедшее время курс изменился, и в грн долг не закрывается . Долги реальный учет в гривнах тогда все закрывается. У Вас наоборот и поэтому работает некорректно.

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 12:38 pm
ruslabigboy
Может быть... Но, как мне кажется, гораздо больше народа ведет учет в долларе? А нацвалюта - гривна...
И гораздо чаще возникает ситуация, когда приходящий товар приходуется в гривне, за него платят гривну (поставщику), при этом программа учитывает (фиксирует) себестоимость в долларе... А потом, при расчете с покупателем возникает непонятка с курсом. Или я не так понимаю?
Разъясните...
И опять-таки, как мне кажется, товар под реализацию или с отсрочкой - чаще всего тоже фиксируется в долларе, особенно при работе с импортным товаром, то есть почти любым...
Как быть тут?
Уточню. Мой случай.
Когда клиент рассчитывается день в день - все понятно и решаемо - есть стоимость в уе, есть текущий курс - получается цена. Все ок.
Когда клиент рассчитывается с отсрочкой, но за долларовый товар (либо цена привязана к доллару сразу) - тоже все ясно.
А если вот такой случай, как я описал? Есть гривневая услуга, есть отсроченный платеж, есть смена курса. Как правильно провести, чтоб и долг закрыть, и новых не создать, и понять - на какую сумму попал или не попал?... Или если заключен договор с оплатой постфактум? Приход, поставка - учет все равно в уе... Потом б/н оплата - и долг...

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 12:45 pm
vik
ruslabigboy писал(а):Может быть... Но, как мне кажется, гораздо больше народа ведет учет в долларе? А нацвалюта - гривна...
И гораздо чаще возникает ситуация, когда приходящий товар приходуется в гривне, за него платят гривну (поставщику), при этом программа учитывает (фиксирует) себестоимость в долларе... А потом, при расчете с покупателем возникает непонятка с курсом. Или я не так понимаю?
Разъясните...
И опять-таки, как мне кажется, товар под реализацию или с отсрочкой - чаще всего тоже фиксируется в долларе, особенно при работе с импортным товаром, то есть почти любым...
Как быть тут?
Уточню. Мой случай.
Когда клиент рассчитывается день в день - все понятно и решаемо - есть стоимость в уе, есть текущий курс - получается цена. Все ок.
Когда клиент рассчитывается с отсрочкой, но за долларовый товар (либо цена привязана к доллару сразу) - тоже все ясно.
А если вот такой случай, как я описал? Есть гривневая услуга, есть отсроченный платеж, есть смена курса. Как правильно провести, чтоб и долг закрыть, и новых не создать, и понять - на какую сумму попал или не попал?... Или если заключен договор с оплатой постфактум? Приход, поставка - учет все равно в уе... Потом б/н оплата - и долг...


В данном случае проблема именно в этом как я и описал выше. Для вашего случая нужен другой вариант кода.

Re: Персональная программа в шаблоне операции

СообщениеДобавлено: Ср окт 25, 2017 12:48 pm
ruslabigboy
Это я понял.
Но вопрос остался...
Может вручную в кассовый документ можно добавить некую проводку, которая - не меняя цену товара, не меняя полученной (оплаченной) суммы, урегулирует задолженность при изменении курса?