16.08.2011, 13:41 | #1 |
Британский учённый
|
Закрытие склада за 7 лет...
Да, вот такая у нас ситуация: от начала внедрения (2005 год) и по сей день склад никогда не закрывался.
История версий Аксапты начинается с 3ки, и скоро мы должны перейти на 2009 с нынешней 4ки. В новой версии собираемся использовать стандартную себестоимость, посему стал остро вопрос, как можно быстрее закрыть склад за все 7 лет. За этот период транзакций накопилось очень много > 43 млн записей, при размере таблицы 25 Гб и почти столько же занимает индекс. По большому счету, основная цель нашего закрытия не вычисление истинной себестоимости, и автоматом в ГК разносить не будем (отключим в настройках). Главное - это подготовить систему для включения стандартной себестоимости в новой версии. Статью Дениса о себестоимости и закрытии склада я прочел. Но статья описывает закрытие на регулярной основе. Хотелось бы услышать мнение о такой нетипичной ситуации. Может быть известны какие нибудь полезные настройки или приёмы?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
16.08.2011, 14:13 | #2 |
Участник
|
Первое что пришло в голову.
Может пройтись по строкам InventTrans и поставить ValueOpen = NoYes::Yes QtySettled = Qty ? |
|
16.08.2011, 14:22 | #3 |
Участник
|
А не хотите сделать "перезаливку" остатков номенклатур (т.е. всё списать а потом заново оприходовать) а потом искуственно позакрывать все старые проводки
|
|
16.08.2011, 14:53 | #4 |
Участник
|
Цитата:
Сообщение от Link
Да, вот такая у нас ситуация: от начала внедрения (2005 год) и по сей день склад никогда не закрывался.
История версий Аксапты начинается с 3ки, и скоро мы должны перейти на 2009 с нынешней 4ки. ... По большому счету, основная цель нашего закрытия не вычисление истинной себестоимости, и автоматом в ГК разносить не будем (отключим в настройках). Попробуйте стандартное закрытие. Хинты:
примерно так. дальше читать статьи Федотенко (fed) про закрытие. |
|
|
За это сообщение автора поблагодарили: lev (2), Link (1). |
16.08.2011, 15:29 | #5 |
Британский учённый
|
Выглядит очень неопределенно в будущем. Хочется решить проблему стандартным функционалом. Спасибо!
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
16.08.2011, 15:31 | #6 |
Британский учённый
|
Мы думали об этом, так как на закрытие уйдет очень много времени, и наши тесты показывают очень низкую производительность. В идеале конечно хочется закрыть склад стандартным путём.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
16.08.2011, 15:44 | #7 |
Участник
|
Поддержу вариант с начальным сальдо. Какие преимущества вы хотите получить, перенося все операции и делая закрытие?
__________________
Ivanhoe as is.. |
|
16.08.2011, 15:53 | #8 |
Британский учённый
|
Спасибо, это было бы идеальным вариантом.
Цитата:
Сообщение от mazzy
Хинты:
примерно так. дальше читать статьи Федотенко (fed) про закрытие. То то у нас при попытках закрытия больше месяца, так все дико тормозит Пойду делать пункт 6.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
16.08.2011, 16:14 | #9 |
Британский учённый
|
Цитата:
Мне как программисту куда проще и надежнее подправить стандартную процедуру, если после этого производительность будет удовлетворительной. Поэтому вариант с начальным сальдо, мы рассматриваем на крайний случай. Опять же нет опыта и понимания всего процесса. Поэтому тут еще придется привлекать партнеров. К тому же если я правильно понимаю, перенос остатков приведет к потере истории и отчетности.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
16.08.2011, 16:33 | #10 |
Moderator
|
Если закрытие мелкими кусочками, которое mazzy предлогает, не поможет, можно сделать похаканную версию закрытия (для первого закрытия конечно), которое для любой номенклатуры использует метод, который 4ка штатно использует только для услуг. Один раз закрыть склад этой штукой и больше никогда не юзать.
Кроме того - с учетом этого вариант тупо пометить проводки как закрытые, програм-манагер по себестоимости считает вполне легальным и верным для версии 2009.Так что, возможно, предложение ena_ax - оно вполне корректно... |
|
|
За это сообщение автора поблагодарили: mazzy (2), Link (1). |
16.08.2011, 20:23 | #11 |
Британский учённый
|
Цитата:
Сообщение от fed
Если закрытие мелкими кусочками, которое mazzy предлогает, не поможет, можно сделать похаканную версию закрытия (для первого закрытия конечно), которое для любой номенклатуры использует метод, который 4ка штатно использует только для услуг. Один раз закрыть склад этой штукой и больше никогда не юзать..
В первом случае я так понимаю будет достаточно установить isServiceItem = true для \Classes\InventCostItemDim\run. Можно ли будет при таком хаке закрыть склад за выходные за все 7 лет? И после этого как минимум уйдет неделя что бы перейти на 2009 версию и еще неделя включить мультисайт и начать использовать стандартную себестоимость. Но насколько помню, нам рекомендовали закрыть склад полностью, тут возникает вопрос можно ли будет закрыть те 3 недели уже в 2009 версии без изменений кода? X++: isServiceItem = this.inventTable(inventCostList.ItemId).inventItemType().isServiceItem(); .................. else { this.updateSettleRefItem(inventCostList.ItemId); if (! isServiceItem) { mapLoopTrans = new Map(Types::Integer,Types::Record); mapLoopDim = new Map(Types::Integer,Types::Record); loopX = 0; queryRun = inventCostHelp.initQueryRunTrans(this.inventTable(inventCostList.ItemId)); while (queryRun.next()) { loopX++; mapLoopTrans.insert(loopX,queryRun.get(tablenum(InventTrans))); mapLoopDim.insert(loopX,queryRun.get(tablenum(InventDim))); } loopMax = loopX; loopX = 0; while (loopX < loopMax) { loopX++; this.updateItemDim(mapLoopTrans.lookup(loopX),mapLoopDim.lookup(loopX)); } } } if (inventClosing.AdjustmentType == InventAdjustmentType::Closing && isServiceItem) { this.updateServiceItemTrans(inventCostList.ItemId); } Цитата:
Сообщение от fed
Кроме того - с учетом этого вариант тупо пометить проводки как закрытые, програм-манагер по себестоимости считает вполне легальным и верным для версии 2009.Так что, возможно, предложение ena_ax - оно вполне корректно...
X++: InventTrans inventTrans; ; update_recordset inventTrans setting ValueOpen = InventTransOpen::Yes, QtySettled = inventTrans.Qty; На закрытие 7 летнего периода уйдет уйма времени, и это сдвигает планы по переходу на новую версию и стандартную себестоимость.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
17.08.2011, 10:48 | #12 |
Moderator
|
Отвечу по шагам. В текущей (2009RU7) версии аксапты есть два подхода к принудительному (без нормального сопоставления и рассчета себестоимости) закрытию проводок:
Теперь о твоей конкретной ситуации: Во первых - со своим советом насчет того чтобы подхакать закрытие чтобы считало всю номенклатуру сервисами - я был не прав. Дело в том, что у тебя тогда ВСЕ проводки пометяться как закрытые, а задача состоит в том чтобы пометить как закрытые только те проводки, которые НЕ ВХОДЯТ в текущий остаток. Соответственно у тебя есть два подхода к решению проблемы: 1. Написать собственную процедуру закрытия. Просто надо бежать по текущим складским остаткам в разрезе аналитик финансового склада и для каждой комбинации аналитик отсчитывать назад от текущей даты достаточно складских проводок в статусе "Закуплено" чтобы покрыть текущий складской остаток. Затем все остальные складские проводки надо пометить как закрытые (с использованием кода inventCostItemDim.updateServiceItems() как прототипа). Да - еще замечу что если у тебя в складских остатках, допустим 5 штук, а приходная проводка на 12, то тебе надо ее рассплитить на две проводки по 7 и 5 штук, первую закрыть, а вторую - оставить. Я бы лично пошел по этому пути. 2. Если ты не чуствуешь себя достаточно увереным для варианта N1, по прежнему можно пойти по пути обычного закрытия склада. Я бы, к рекомендациям mazzy, сделал такие поправки:
|
|
|
За это сообщение автора поблагодарили: mazzy (2), lev (4), Link (1). |
17.08.2011, 11:31 | #13 |
Участник
|
Цитата:
переносы и спецификации детектируются и откладываются на второй проход. или я чего забыл? |
|
17.08.2011, 12:24 | #14 |
Moderator
|
Цитата:
Но поскольку топикстартера вообще не интересует себестоимость, то вполне можно поставить всего 1 итерацию чтобы сначала все сопоставилось, а потом списалось. |
|
17.08.2011, 12:39 | #15 |
Участник
|
Цитата:
Согласись, что обычно после производства готовая продукция обычно таки перемещается на склад хранения. И если без производства, но были перемещения. Точно одного прохода будет достаточно, чтобы получить что-нибудь боль-мень вменяемое? (Это я уже для повышения собственной образованности спрашиваю) |
|
17.08.2011, 13:08 | #16 |
Moderator
|
Цитата:
Сообщение от mazzy
А если были?
Согласись, что обычно после производства готовая продукция обычно таки перемещается на склад хранения. И если без производства, но были перемещения. Точно одного прохода будет достаточно, чтобы получить что-нибудь боль-мень вменяемое? (Это я уже для повышения собственной образованности спрашиваю) |
|
17.08.2011, 13:35 | #17 |
Moderator
|
Цитата:
Сообщение от fed
Попробуйте запустить пересчет по самой популярной номенклатуре с тем числом хелперов которые получились на предыдущем пункте, и помониторьте загрузку сервера БД. Если у вас там полный содом с утилизацией, памятью и очередью к диску - значит номер заведомо не пройдет и надо разбираться с вариантом N1 и принудительным закрытием.
|
|
17.08.2011, 14:12 | #18 |
Британский учённый
|
Цитата:
Сообщение от fed
Цитата:
Сообщение от fed
1. Написать собственную процедуру закрытия. Просто надо бежать по текущим складским остаткам в разрезе аналитик финансового склада и для каждой комбинации аналитик отсчитывать назад от текущей даты достаточно складских проводок в статусе "Закуплено" чтобы покрыть текущий складской остаток. Затем все остальные складские проводки надо пометить как закрытые (с использованием кода inventCostItemDim.updateServiceItems() как прототипа). Да - еще замечу что если у тебя в складских остатках, допустим 5 штук, а приходная проводка на 12, то тебе надо ее рассплитить на две проводки по 7 и 5 штук, первую закрыть, а вторую - оставить. Я бы лично пошел по этому пути.
[/LIST]
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
17.08.2011, 14:49 | #19 |
Участник
|
Может быть проще будет сделать переброску остатков с помощью двух журналов типа "проводка" ?
1. Формируем журнал(ы) на списание на основании остатков, разносим, маркируем поля сопоставления во всех проводках. 2. Копируем этот журнал(ы) с отрицательным знаком, разносим, наслаждаемся Из плюсов: 1. Не надо возится со старыми проводками 2. Можно выправить себ-ть на день Ч Из минусов - теряется связь со старыми документами |
|
23.08.2011, 17:16 | #20 |
Британский учённый
|
Цитата:
Сообщение от fed
Услуги. В версии 4.0sp1, появилась специальная ветка (inventCostItemDim,updateServiceItemTrans()), которая принудительно закрывает складскип проводки по услугам. Закрывает она их по умному, заполняя сопоставленное количество, сопоставленную сумму и создавая в складских сопоставлениях запись специального типа (InventSettletModel::ServiceItem). Из за того что все эти поля заполняются и запись сопоставления создается, такая проводка для всех (ну или почти всех) стандартных и нестандартных отчетов выглядит как закрытая и сопоставленная 'по честному'
1. Написать собственную процедуру закрытия. Просто надо бежать по текущим складским остаткам в разрезе аналитик финансового склада и для каждой комбинации аналитик отсчитывать назад от текущей даты достаточно складских проводок в статусе "Закуплено" чтобы покрыть текущий складской остаток. Затем все остальные складские проводки надо пометить как закрытые (с использованием кода inventCostItemDim.updateServiceItems() как прототипа). Да - еще замечу что если у тебя в складских остатках, допустим 5 штук, а приходная проводка на 12, то тебе надо ее рассплитить на две проводки по 7 и 5 штук, первую закрыть, а вторую - оставить. Я бы лично пошел по этому пути. В этом методе изначально цикл обрабатывает только проводки со статусами Sold и Purchased. Правильно ли я сделал убрав это условие при использовании метода для закрытия всех проводок? П.С. Если кому то нужен класс, могу выложить.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
Теги |
inventory closing, закрытие склада |
|
|