Надо сделать, чтобы при импорте операций из 1С пересчитывалась сумма счета. Пробовал делать так:
// Пересчет суммы для счета
RecalcAmount(Dataset.Values('InvoiceID'));
}
и подключил скрипт scr_InvoiceWorkspace, но при работе ругается на BaseWorkspace.GridDataset в функции RecalcAmount
Как вообще это правильно сделать?
Нравится
Проблема возникает, потому что данная функция предназначена для работы с записями реестра, соответственно пытается получить его датасет.
Попробуйте в Вашем скрипте создать такую же функцию (название можно поменять, например, 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 по коду и записывается в карточку счета. Проверю у себя, затем отпишусь.
Виталий, я ваз дезинформировала! Прошу прощения!
На самом деле, пересчет происходит и в карточке все хорошо! Проблема в том, что реестр не рефрешится! А если через действия делать - рефрешится. Сейчас соображу, как это правильно сделать и все будет хорошо!
Еще раз прошу прощения за невнимательность.
Этот форум и есть одним большим FAQ по Террасофт. Конкретно по датасетам по памяти, к сожалению, Вам не подскажу. Посмотрите материалы в ветке "Разработчику", там есть FAQ и готовые варианты решений. Это конечно не детальное руководство по всем вопросам, но ответов можно найти много. Рекомендую также поиск по форуму - подбирайте подходящие ключевые слова.
Виталий, у меня вот еще уточнение возникло. При добавлении продуктов все отлично пересчитывается. Но вот, как показала практика, достаточно часто продукты из счета удаляются. И вот куда нужно повесить вызов волшебной функции пересчета, чтобы еще и при удалении сумма счета менялась?
Для того, чтобы при удалении продукта происходил пересчет суммы счета, переопределите событие OnClick кнопки btnDelete в wnd_OfferingsDetailTreeArea:
function btnDeleteOnClick(Control) { scr_BaseTreeArea.btnDeleteOnClick(Control); ...... }