![]() |
#11 |
Участник
|
В D365FO семейство классов RAssetProposal очень "занятно" распаковывает параметры в unpack(), из-за чего не так просто добавлять в это семейство новые параметры для сохранения в pack()/unpack().
Коллега недавно наткнулся на проблему, пытаясь применить к этому семейству рекомендации по расширению наследников RunBase. В рекомендациях говорится, что в pack() вашего класса-расширения нужно написать примерено так: X++: public container pack() { container packedClass = next pack(); return SysPackExtensions::appendExtension(packedClass, classStr(MySysUserLogCleanup_Extension), this.myPack()); } X++: public boolean unpack(container _packedClass) { boolean result = next unpack(_packedClass); if (result) { container myState = SysPackExtensions::findExtension(_packedClass, classStr(MySysUserLogCleanup_Extension)); result = this.myUnpack(myState); //Also unpack the extension } return result; } Вот как бы вы работали с queryRun в pack/unpack? Обычно это выглядит так: X++: public container pack() { return [#CurrentVersion, #CurrentList, queryRun.pack()]; } X++: public boolean unpack(container _packedClass) { Version version = RunBase::getVersion(_packedClass); boolean ret = true; switch (version) { case #CurrentVersion : container packedQuery; [version, #CurrentList, packedQuery] = _packedClass; if (SysQuery::isPackedOk(packedQuery)) // ... X++: [version, #CurrentList, packedQuery] = _packedClass; X++: return [#CurrentVersion, #CurrentList, queryRun.pack()]; Но локализаторы же хитрее всех, поэтому они считают, что их запакованный queryRun всегда идет последним, и пишут вот что: X++: public boolean unpack(container packedClass) { Integer version = conPeek(packedClass,1); container packedQuery = conPeek(packedClass, conLen(packedClass)); |
|
|
За это сообщение автора поблагодарили: ax_mct (5), S.Kuskov (5), dech (10), Pandasama (2). |