Автоматический пересчет суммы счета

Надо сделать, чтобы при импорте операций из 1С пересчитывалась сумма счета. Пробовал делать так:

function OnBeforeRecordImport(Param, Dataset, Select1C) {
        // Пересчет суммы для счета
        RecalcAmount(Dataset.Values('InvoiceID'));
}

и подключил скрипт scr_InvoiceWorkspace, но при работе ругается на BaseWorkspace.GridDataset в функции RecalcAmount

Как вообще это правильно сделать?

Нравится

14 комментариев

Проблема возникает, потому что данная функция предназначена для работы с записями реестра, соответственно пытается получить его датасет.

Попробуйте в Вашем скрипте создать такую же функцию (название можно поменять, например, RecalcImportedInvoiceAmount), и в ней вместо строчки

var InvoiceDataset = BaseWorkspace.GridDataset;

вставить блок

var InvoiceDataset = GetSingleItemByCode('ds_Invoice', 'RecalcImportedInvoiceAmount');
if (InvoiceDataset.State != dstInactive) {
	InvoiceDataset.Close();
}
ApplyDatasetIDFilter(InvoiceDataset, InvoiceID, true);
InvoiceDataset.Open();

А подскажите, пожалуйста, как бы сделать так, чтобы действие "Пересчитать сумму" выполнялось автоматически при добавлении продукта в счет?

После добавления продукта в счет, а именно по закрытию карточки продукта, отрабатывает событие OnNotify, в данном случае это обработчик wnd_OfferingsDetailTreeAreaOnNotify в скрипте wnd_OfferingsDetailTreeAreaScript. В него Вы и можете дописать блок, который порекомендовал Олег.

Спасибо большое!

Виталий, я немного поторопилась. То есть, спасибо, конечно, но поясните, пожалуйста, поподробнее!
Я в wnd_OfferingsDetailTreeAreaScript добавила ссылку на scr_InvoiceWorkspace, там продублировала функцию RecalcAmount, превратив ее в RecalcAmountMy, там по совету Олега заменила одну строку на блок кода, а также изменила строку

 
var UpdateDataset = GetOpenedDatasetByUSIWithFilter('ds_Invoice', 'ID',
		InvoiceID, 'RecalcAmountMy');

поменяв название последнего параметра.
В итоге получается, что в UpdateDataset все пусто. И запись не сохраняется, потому что в InvoiceDate null лежит.
Скорее всего, я что-то упустила. Подскажите, пожалуйста, что.

Проверьте, пожалуйста, что Вы действительно передаете в свою функцию корректный InvoiceID - ID счета, в который добавили продукт. Этот ID со скрипта продуктов в счете wnd_OfferingsDetailTreeAreaScript можно узнать так:

var InvoiceID = Self.Attributes('ParentItemID');

а затем передать его в свою функцию пересчета

RecalcAmountMy(InvoiceID);

Виталий, сделала так. Теперь ошибка не вылетает, под отладкой в RecalcAmountMy сумма считается верно, но почему-то сумма счета в итоге не изменяется. Если после этого сделать Действия->пересчет суммы - сумма счета меняется.
Я не совсем понимаю, как работает RecalcAmount, там много датасетов в которых я лично путаюсь - зачем какой, но я ее изменила только вот как подсказал Олег + внесла правку в одну строчку, поменяв название параметра с RecalcAmount на RecalcAmountMy. На всякий случай вернула изменения, но работает также. Amount считает верно, а в карточке счета изменений не происходит.

Это странно, так как пересчитанный Amount по коду и записывается в карточку счета. Проверю у себя, затем отпишусь.

Виталий, я ваз дезинформировала! Прошу прощения!
На самом деле, пересчет происходит и в карточке все хорошо! Проблема в том, что реестр не рефрешится! А если через действия делать - рефрешится. Сейчас соображу, как это правильно сделать и все будет хорошо!
Еще раз прошу прощения за невнимательность.

	var InvoiceID = Self.Attributes('ParentItemID'); 
	RecalcAmountMy (InvoiceID);  
	var InvoiceDataset = Self.Attributes('WorkspaceDataset');
	RefreshDataset(InvoiceDataset);

Вот так работает!
P.S. где можно почитать про датасеты? Никак не могу в них разобраться.

Этот форум и есть одним большим FAQ по Террасофт. Конкретно по датасетам по памяти, к сожалению, Вам не подскажу. Посмотрите материалы в ветке "Разработчику", там есть FAQ и готовые варианты решений. Это конечно не детальное руководство по всем вопросам, но ответов можно найти много. Рекомендую также поиск по форуму - подбирайте подходящие ключевые слова.

Виталий, у меня вот еще уточнение возникло. При добавлении продуктов все отлично пересчитывается. Но вот, как показала практика, достаточно часто продукты из счета удаляются. И вот куда нужно повесить вызов волшебной функции пересчета, чтобы еще и при удалении сумма счета менялась?

Для того, чтобы при удалении продукта происходил пересчет суммы счета, переопределите событие OnClick кнопки btnDelete в wnd_OfferingsDetailTreeArea:

function btnDeleteOnClick(Control) {
scr_BaseTreeArea.btnDeleteOnClick(Control);
......
}

Спасибо, Наталия, попробую!

Показать все комментарии