AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.06.2011, 15:25   #1  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
! Некорректное отражение map при пакетной обработке в Ax2009, и налоги в строках накладных/фактур
Проверялось на AX 2009, RU5, RU6, RU7

Существует проблема, при которой Аксапта 2009 не возвращает существование mapping'а для какой-либо таблицы, входящей в map. Это проявляется только в пакетном режиме на сервере (новый режим, появившийся в 2009). При просто выполнении на сервере, такого не происходит.

Подробности:
Есть некий код:
X++:
    treeNode = infolog.getNode(UtilElementType::TableMap,
                               tableid2name(tablenum(VendInvoiceTrans)),
                               tablenum(CustVendInvoiceTrans));
Так вот - если выполнить этот код в пакетном режиме, в переменной treeNode будeт null, если же запустить в интерактивном - там будет экземпляр TreeNode.
Это не было бы так неприятно, если бы вышеприведенный код не был почти 1:1, использующимся в методе Global::mappingExists_RU, из-за чего данный метод при исполнении в пакетном режиме, никогда не возвращает true.
Но и это - не самая крупная проблема.
Настоящие проблемы начинаются, когда при пакетной разноске накладных в методе CustVendInvoiceTrans.initFromTaxWorkTrans_RU в результате некорректной работы метода mappingExists_RU, не заполняются поля TaxAmountMST_W (Сумма налога в валюте), vatAmountMST_RU (Сумма НДС), ExciseAmountMST_RU (Сумма акциза) в строках накладных, и далее, ессно, в строках счетов-фактур по этим накладным. В результате, когда формируем книгу покупок/продаж по этим с/ф, возникают еще одни проблемы.
В прилагаемом классе воспроизведена подобная ситуация. Желающим проверить могу посоветовать запустить его интерактивно, и в пакете, и посмотреть на разницу в выдаваемых сообщениях.
Варианты решения разнообразны, думаю, не стоит их приводить. Еще советовал бы проверить уже существующие обработки, работающие в пакетном режиме, на использование данных методов.
Вложения
Тип файла: xpo Class_TestTreeNode.xpo (3.5 Кб, 427 просмотров)
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
За это сообщение автора поблагодарили: mazzy (5), db (5), lev (3).
Старый 02.06.2011, 00:30   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Во-первых, зачем вам тормозной TreeNode, когда можно воспользоваться шустрыми UtilElements'ами? Во-вторых, по-моему, никогда не стоит создавать TreeNode'ы с помощью указанного метода infolog несмотря на все его кажущиеся удобства - он ведь будет создавать их там, где сам работает, т.е. всегда на клиенте. В-третьих, когда код работает в пакетном режиме на сервере, кое-какие объекты, обычно живущие на клиенте, могут оказаться неинициализированными - весьма вероятно, оттого вы и получаете null вместо TreeNode. В общем, попробуйте искать Mapping через UtilElements - оно и шустрее, и надежней.
А на счет локализаторского кода - я лично в свое время огреб очень много проблем, когда пытался использовать в серверном коде класс MappingsInfo_RU. Код работал строго на сервере, дергался часто, но при этом откуда ни возьмись возникал офигенный клиент-серверный трафик и сопутствующие тормоза. Дело оказалось как раз в том, что в этом классе TreeNode для Mapping'а получался с помощью этого метода infolog - на клиенте. Затем на сервере создавался TreeNodeIterator и шерстил дочерние узлы этого клиентского TreeNode'а со всеми вытекающими последствиями с т.з. трафика и производительности. В общем, глаз да глаз нужен за локализаторским кодом

PS. Ломанулся было исправлять mappingExists_RU(), но тут понял, что он в моем случае работает корректно, потому что используемый им MappingsInfo_RU давно исправлен. Уф...

Последний раз редактировалось gl00mie; 02.06.2011 в 00:52.
За это сообщение автора поблагодарили: lev (2).
Старый 02.06.2011, 10:28   #3  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Во-первых, вообще-то разговор о том, что это - стандартный функционал.
Т.е. разносишь накладные в пакете - получаешь проблему.
Во-вторых, я бы хотел посмотреть, как при исполнении в пакете, TreeNode создастся на клиенте.
В-третьих, что там "должно использоваться" - это уже вопрос к восточноевропейским локализаторам
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 02.06.2011, 10:54   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maximin Посмотреть сообщение
вообще-то разговор о том, что это - стандартный функционал.
Стандартный локализованный функционал, заметьте В буржуйском функционале я че-то не видел, чтобы кусок бизнес-логики принимал решение о необходимости заполнения тех или иных полей на основании того, отмаплены ли они на поля определенного Map'а. Это то, что mazzy называет "программистским подходом".
Цитата:
Сообщение от Maximin Посмотреть сообщение
я бы хотел посмотреть, как при исполнении в пакете, TreeNode создастся на клиенте.
Ну вы же сами в первом сообщении и описали, как.

Последний раз редактировалось gl00mie; 02.06.2011 в 11:00.
Старый 02.06.2011, 11:38   #5  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
зачем вам тормозной TreeNode
Мне?
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Стандартный локализованный функционал, заметьте В буржуйском функционале я че-то не видел...
Предлагаете отказаться от локализации? o_O
Я больше склоняюсь к тому, чтобы сам вендор и поправил...
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ну вы же сами в первом сообщении и описали, как.
Я описывал, как он создается, но при исполнении в пакете нет клиента, на котором он мог бы создаться , так что ему приходится довольствоваться WorkerThread'ом.
Что же касается этого WorkerThread, то во-первых, он выполняется внутри процесса AOS, а во-вторых, судя по моим изысканиям и наблюдаемому поведению, является чем-то средним, возможно, некоей модифицированной для выполнения в контексте AOS клиентской частью, особенности реализации которой и приводят к подобным эффектам. Но это - только моё мнение, пока же будем исходить из того, что все это - исполняется в терминах Аксапты "на сервере".

P.S. Уважаемый, вы в ФИДО, случайно, не участвовали?
Фигурный квотинг, подмена предмета разговора по ходу треда, ну и потребность в последнем слове...
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 02.06.2011, 11:53   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maximin Посмотреть сообщение
Предлагаете отказаться от локализации? o_O
Предлагаю, как и прежде, относиться к ней с настороженностью и должным скепсисом, а не расслабляться только оттого, что это, мол, "стандартный функционал".
Цитата:
Сообщение от Maximin Посмотреть сообщение
Я больше склоняюсь к тому, чтобы сам вендор и поправил...
Представители вендора на этот счет говорят буквально следующее:
Цитата:
Сообщение от Jabberwocky Посмотреть сообщение
зарегистрируйте, пожалуйста, ошибку в службе поддержки, на текущий момент это единственный способ добиться её исправления в текущей версии.
Цитата:
Сообщение от Maximin Посмотреть сообщение
Я описывал, как он создается, но при исполнении в пакете нет клиента, на котором он мог бы создаться
Bingo! И в результате вы получаете null. Вообще, тот же infolog при работе не через виндового клиента Аксапты - это, как говорится, "хитрый предмет, он если есть, то его сразу нет" В каких-то случаях обращения к нему прокатывают, а в каких-то - вылезает ошибка, мол, объект не инициализирован (это, в частности, было словлено при попытке вызова infolog.viewUpdate() из COM-коннектора).
Цитата:
Сообщение от Maximin Посмотреть сообщение
Уважаемый, вы в ФИДО, случайно, не участвовали?
А как же!..
Цитата:
Сообщение от Maximin Посмотреть сообщение
Фигурный квотинг, подмена предмета разговора по ходу треда, ну и потребность в последнем слове...
Рыбак рыбака видит издалека?
Старый 09.06.2011, 01:25   #7  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от Maximin Посмотреть сообщение
Проверялось на AX 2009, RU5, RU6, RU7
......
Настоящие проблемы начинаются, когда при пакетной разноске накладных в методе CustVendInvoiceTrans.initFromTaxWorkTrans_RU в результате некорректной работы метода mappingExists_RU
......
AX 4.0 SP2
Как раз только что разбирался с парой проблем при разноске накладных в пакетном режиме (для нас актуально - у нас розница, продажи магазинов разносятся в пакете ночью, в среднем 60 накладных по 1 тыс.строк).
И тоже наткнулся на этот mappingExists_RU. Это, я вам скажу, нечто. Обе проблемы именно в нем.

Первое:Ax32.exe именно благодаря ему кушает оперативную память (и не отдает потом обратно) со скоростью ~9 Мб на 1 тыс.строк накладной. То есть за одну ночь кушает не менее 0,5 Гига памяти.

Второе: именно исполнение этого метода, как выяснилось, занимает где-то 75% времени всей разноски (а все остальное - генерация и разноска накладной, со всеми инвентрансами, инвойсжурами и прочими налогами - только 25%, а то и меньше).
И вот что с этим делать? Больше даже беспокоит память, чем производительность. Нет ли у кого опыта борьбы с этой гадиной mappingExists_RU?

Последний раз редактировалось Zabr; 09.06.2011 в 01:28.
За это сообщение автора поблагодарили: Daiver (1).
Старый 09.06.2011, 09:22   #8  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Я подумывал о кэшировании результатов вызова в глобальном кэше.
Ну или перепилить его по совету gloomie на использование UtilElements.
А еще есть неудачные сборки Ax32.exe\Ax32Serv.exe, ужасно "текущие".
Я боролся подбором удачной комбинации версии клиента/AOS.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 09.06.2011 в 09:25.
Старый 09.06.2011, 10:46   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
К сожалению, в UtilElements можно узнать лишь то, "отмаплена" ли вообще таблица на тот или иной Map, а то, какие поля у нее с чем в Map'е сопоставлены, узнать можно лишь через TreeNode. Так что тут самое простое решение - именно кэшировать информацию, возвращаемую этим классом.
Старый 09.06.2011, 16:36   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
На самом деле, UtilElements можно использовать и для проверки сопоставления полей

При выполнении на клиенте, у меня получалось сопоставимое время с MappingExists_RU (процентов на 10 быстрее, правда, память никуда не течет, вот досада). А вот при выполнении на сервере - разница уже в 5-6 раз не в пользу MappingExists_RU (и раза в два быстрее, чем на клиенте).

Ну и кэширование - тут без вопросов

Пара методов в класс Global - по использованию и результатам полностью аналогичны MappingExists_RU.
Отличие между методами: mappingExists_UE использует кэширование (класс MappingsInfoCache), а mappingExists_UENC - напрямую создает классы MappingsInfo_UE
X++:
static public boolean mappingExists_UE(tableId _mapId,
                                tableId _tableId,
                                fieldId _mapField   = 0,
                                fieldId _tableField = 0)
{
    boolean          ok = false;
    MappingsInfoCache  mappingsInfoCache = MappingsInfoCache::Construct();
    ;
    if (mappingsInfoCache && mappingsInfoCache.MappingTableExists(_mapId, _tableId))
    {
        if (_mapField || _tableField)
        {
            ok = mappingsInfoCache.MappingFieldExists(_mapId, _tableId, _mapField, _tableField);
        }
        else
            ok = true;
    }
    return ok;
}

static public boolean mappingExists_UENC(tableId _mapId,
                                tableId _tableId,
                                fieldId _mapField   = 0,
                                fieldId _tableField = 0)
{
    boolean          ok = false;
    MappingsInfo_UE  mappingsInfo = new MappingsInfo_UE(_mapId, _tableId);
    ;
    if (mappingsInfo && mappingsInfo.MappingTableExists())
    {
        if (_mapField || _tableField)
        {
            ok = mappingsInfo.MappingFieldExists(_mapField, _tableField);
        }
        else
            ok = true;
    }
    return ok;
}
Оба класса работаю как в DAX3.0 kr2 (сохранить приложенный xpo в кодировке ANSI), так и в DAX2009 SP5.
Думаю, в четверке тоже должно запускаться.
Вложения
Тип файла: zip Class_MappingsInfo_UE.zip (1.8 Кб, 196 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Zabr (2), raz (5), Daiver (1).
Старый 09.06.2011, 22:07   #11  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Мы в итоге (спасибо wolfstein) пошли по еще более простому пути - заменили вызов mappingExists_RU на сравнение tableid с перечнем конкретных таблиц. Утечка памяти ликвидирована полностью, скорость разноски тоже немного увеличилась (хотя и не так сильно, как я ожидал).
За это сообщение автора поблагодарили: someOne (3).
Старый 09.06.2011, 23:17   #12  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Мы сделали так. Скорость разноски увеличилась на порядок.

1. Обявляем в классе \Classes\Application.classDeclaration переменную
X++:
Map                     mappingsInfo_RU; // Оптимизация разноски накладной, EVO 26.04.2011
2. Добавляем новый метод \Classes\Application\mappingsInfo_RU
X++:
// Оптимизация разноски накладной, EVO 26.04.2011
Map mappingsInfo_RU()
{
    ;
    if (!mappingsInfo_RU)
    {
        mappingsInfo_RU = new Map(Types::Container, Types::Class); // [TableId, MapId], MappingsInfo_RU object
    }

    return mappingsInfo_RU;
}
3. Модификацируем метод \Classes\MappingsInfo_RU\createMapWithFieldId
X++:
static public Map createMapWithFieldId(tableId _tableId, tableId _mapID)
{
    MappingsInfo_RU    mappingsInfo;
    ;

    // Оптимизация разноски накладной, EVO 26.04.2011 -->
    //orig mappingsInfo = new MappingsInfo_RU(_tableId, _mapID);
    //orig return mappingsInfo.find();
    if (!appl.mappingsInfo_RU().exists([_tableId, _mapID]))
    {
        mappingsInfo = new MappingsInfo_RU(_tableId, _mapID);
        appl.mappingsInfo_RU().insert([_tableId, _mapID], mappingsInfo.find());
    }
    return appl.mappingsInfo_RU().lookup([_tableId, _mapID]);
    // Оптимизация разноски накладной, EVO 26.04.2011 <--
}

Последний раз редактировалось DSPIC; 09.06.2011 в 23:23.
За это сообщение автора поблагодарили: UNRW (1), wolfstein (1).
Старый 09.06.2011, 23:25   #13  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Мы сделали так. Скорость разноски увеличилась на порядок.
Идиотский вопрос: А зачем новый метод в классе Application? Почему не использовать appl.globalcache() ? Там такой же Map.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: DSPIC (5).
Старый 09.06.2011, 23:32   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Так нагляднее
Если серьезно, можно и через кэш. Я сильно не заморачивался, сделал за ~10 минут по-проще.
Старый 09.06.2011, 23:44   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Так нагляднее
Не... я ж ничего не имею против . Просто обычно - затрагивание такого плана класса как Application приводит к сложностям к портированию кода (аос какой-нибудь рестартануть придется; может даже вынужденно, локальный кеш у юзеров может слететь и т.д.).

Поэтому и спросил.
__________________
Возможно сделать все. Вопрос времени
Старый 10.06.2011, 10:08   #16  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Почему не использовать appl.globalcache() ?
С использованием appl.globalcache() - модифицируем метод \Classes\MappingsInfo_RU\createMapWithFieldId следующим образом:
X++:
static public Map createMapWithFieldId(tableId _tableId, tableId _mapID)
{
    MappingsInfo_RU    mappingsInfo;
    ;

    //mappingsInfo = new MappingsInfo_RU(_tableId, _mapID);
    //return mappingsInfo.find();

    if (!appl.globalCache().isSet(classstr(MappingsInfo_RU), [_tableId, _mapID]))
    {
        mappingsInfo = new MappingsInfo_RU(_tableId, _mapID);
        appl.globalCache().set(classstr(MappingsInfo_RU), [_tableId, _mapID], mappingsInfo.find());
    }
    return appl.globalCache().get(classstr(MappingsInfo_RU), [_tableId, _mapID]);

}
За это сообщение автора поблагодарили: DSPIC (5).
Старый 10.06.2011, 10:26   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
MappingsInfo_RU - может жить и на клиенте.
Так что сохранять его экземпляр исключительно в кэше сервера - неправильно
__________________
Axapta v.3.0 sp5 kr2
Старый 21.12.2011, 13:48   #18  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Zabr Посмотреть сообщение
Мы в итоге (спасибо wolfstein) пошли по еще более простому пути - заменили вызов mappingExists_RU на сравнение tableid с перечнем конкретных таблиц. Утечка памяти ликвидирована полностью, скорость разноски тоже немного увеличилась (хотя и не так сильно, как я ожидал).
Хотел сделать нечто подобное. Но вначале решил исследовать поведение функции mappingExists_RU.

Собрал статистику вариантов входных параметров, которые передаются ей на вход.
Для нашего приложения (Ax2009 RU6) их оказалось всего лишь 13 комбинаций. Но самое интересное в том что из всех этих вариантов она никогда не возвращает "false". Результат всегда один и тот же: "true" !

Возникает вопрос - зачем эта функция вообще нужна ?

к примеру в методе класса SalesPurchReport_Invoice4Paym_RU она используется так

X++:
  if (mappingExists_RU(tablenum(CustVendInvoiceJour),
                         invoiceJour.TableId,
                         fieldnum(CustVendInvoiceJour, rContractCode)))
Как я понял, "false" она не может вернуть ни при каких вариантах.
так как invoiceJour в этом методе всегда VALUE: map = CustInvoice4PaymJour_RU и никак иначе.
Или я не прав ?

Короче, заменил эту функцию на
X++:
return true;
Вот и вся оптимизация...
Старый 21.12.2011, 13:51   #19  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Кажется для случая PackingSlip по закупке будет false
Возможно у вас это не используется.

Мне кажется самый безопасный способ - сделать кеширование результатов.
Изменений минимум. Поддерживать легко. Если в других местах появится активное использование этой функции - то все равно быстро будет работать.
За это сообщение автора поблагодарили: someOne (3).
Старый 21.12.2011, 14:53   #20  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Кажется для случая PackingSlip по закупке будет false
Возможно у вас это не используется.

Мне кажется самый безопасный способ - сделать кеширование результатов.
Изменений минимум. Поддерживать легко. Если в других местах появится активное использование этой функции - то все равно быстро будет работать.
Да, вы правы. Действительно там - "false". (PackingSlip в закупках не используется у нас). Видимо, лучше действительно кешировать...

Сделал в итоге как написал wolfstein Некорректное отражение map при пакетной обработке в Ax2009, и налоги в строках накладных/фактур (Спасибо ему).
Кажется, печатные формы стали работать быстрее. Всем рекомендую

Последний раз редактировалось someOne; 21.12.2011 в 15:08.
Теги
bug, map, treenode, баг, локализация, накладная, налоги, ошибка, счет-фактура

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как автоматически отключать связи в файле Excel при пакетной обработке? decoder DAX: Программирование 7 03.06.2009 19:19
Исправление накладных и счетов-фактур Constantine DAX: Функционал 89 26.02.2006 13:13
При обработке накладной пропадают налоги Filip DAX: Функционал 21 21.03.2005 11:19
Еще 1 простой вопрос по пакетной обработке Smith DAX: Функционал 1 26.10.2004 17:55
Распределение накладных расходов при отрицательных строках закупки wb DAX: Программирование 1 30.06.2004 13:03

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:26.