10.02.2012, 12:04 | #1 |
Участник
|
Сторнирование накладной в заказе на продажу
Всем привет! С аксаптой знаком недавно, так что не судите строго.
Вопрос в следующем: Мне нужно сторнировать накладную в журнале накладных (форма CustInvoiceJournal). Для этого у меня есть соответсвующая кнопка на форме. Когда пользователь её нажимает, то делаются некоторые проверки на возможность сторнирования, типа: существует ли заказ на продажу для выбранной накладной (таблица SalesTable по полю SalesId) и т.п. С проверками разобрался. После них, если все в порядке, необходимо выполнить проведение сторнирующей накладной автоматически, воспроизведя стандартный алгоритм разноски как на форме "Разноска накладной" (форма SalesTable "Заказ на продажу" -> кнопка "Разноска" -> "Накладная" -> открывается форма SalesEditLines). После разноски создается накладная в таблице CustInvoiceJour. Для разноски накладной стандартным функционалом используется класс SalesFormLetter. Таким образом мне нужно сделать наоброт: у меня есть выбранная накладная CustInvoiceJour, по ней я нахожу заказ на продажу SalesTable, и для найденного заказа делается разноска накладной еще раз (для сторнирования). Дак вот, как это сделать программно? Вызвать класс SalesFormLetter, что бы он отработал не выводя на экран форму "Разноска накладной". Имея курсор заказа на продажу: X++: salesTable = SalesTable::find(custInvoiceJour.SalesId); X++: Args args = new Args(); Args formArgs = new Args(); Object objForm; ; //Проверки... formArgs.name(formstr(SalesTable)); objForm = ClassFactory.FormRunClass(formArgs); args.caller(objForm); args.record(SalesTable::find(custInvoiceJour.SalesId)); args.parmEnum(DocumentStatus::Invoice); SalesFormLetter::main(args); |
|
12.02.2012, 14:15 | #2 |
Administrator
|
Example: Posting an Invoice
X++: static void createInvoice(SalesTable _salesTable) { SalesFormLetter salesFormLetter; ; salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice); salesFormLetter.update( _salesTable, //SalesTable record to be posted systemDateGet(), //Transaction date SalesUpdate::All, //Which qty should be used AccountOrder::None, NoYes::No, //Is document a proforma NoYes::No); //Should document be printed }
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: yahenz (1). |
13.02.2012, 16:53 | #3 |
Участник
|
Чтобы сделать полное сторно программным образом, надо пробежаться по всем строкам заказа, присвоить полям SalesDeliverNow и InventDeliverNow значения из сторнируемой накладной с минусом.
Далее выполнить код, приведенный Максимом Горбуновым, заменив параметр SalesUpdate::All на SalesUpdate::\DeliverNow. |
|
|
За это сообщение автора поблагодарили: yahenz (1). |
13.02.2012, 17:43 | #4 |
Administrator
|
Кроме того, не стоит забывать про накладные расходы. А также про таблички CustVendCreditInvoicing*, в которых создаются записи для сопоставления накладных с кредит-нотами. А также про сопоставление клиентских проводок по накладной и по кредит-ноте.
Вообще, мне не очень нравится сторнировать накладные через немедленное получение (походите поиском по форуму, чтобы предысторию узнать). Я бы лучше делал через копирование заказа и разноску. Посмотрите, как выполняется создание кредит-ноты из заказа на продажу (кнопка Функции/Создать кредит-ноту). Разделите свою задачу на две: (1) создание кредит-ноты и (2) автоматическая разноска созданной кредит-ноты. Такая задача немного сложнее для начинающего, но зато опыта наберётесь. Удачи.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
14.02.2012, 03:15 | #5 |
Участник
|
А когда создаются записи в этих табличках? В описании используемого конфигурационного ключа указано, что это функционал Испании и Швеции Хоть мы и не в Испании, но этот ключ задействован, а записи в указанных таблицах отсутствуют...
|
|
14.02.2012, 11:31 | #6 |
Administrator
|
Цитата:
В CustVendCreditInvoicingTable записи создаются при копировании строк заказа из накладной (см. SalesCopying.copy() и SalesCopying.setRefCustVendCreditInvoicingTable()). С точки зрения пользователя это происходит в тот момент, когда выполняется функция "Создать кредит-ноту" в форме Заказы на продажу, либо "Найти заказ на продажу" в форме Заказы на возврат. Потом, при разноске заказа (или возврата), создаются записи в CustVendCreditInvoicingJour (см. SalesFormLetter_Invoice.writeJournal() и SalesFormLetter_Invoice.writeCreditInvoicingJour()). Если у Вас нет записей в этих таблицах, то, скорее всего, кредит-ноты в Вашем приложении создаются не с помощью функции "Создать кредит-ноту", а как-то по-другому (может быть, через немедленное получение, например). В принципе, нельзя сказать однозначно, что это неправильно. Просто таким образом Вы лишаете себя некоторых дополнительных возможностей, доступных в стандартном приложении.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: dn (2), vanokh (1). |
15.02.2012, 03:43 | #7 |
Участник
|
Ага, посмотрел эти методы и стало все понятно - там еще завязано на галочку CreditInvoicing из CustParameters, которая у нас отключена... Кредит-ноты регулярно создаются, а из-за нее в эти таблицы ничего не попадает(
Эх, обнаружить бы раньше - а то сейчас в отчетах приходится кредит-ноты определять по лоту возврата в складских проводках... |
|
|
За это сообщение автора поблагодарили: dn (2). |
17.02.2012, 20:20 | #8 |
Участник
|
Спасибо всем за помощь! Попробую разобраться.
|
|