|
10.06.2014, 17:00 | #1 |
Участник
|
код в CIL и без
Хочу поделиться опытом связанным с 2012:
Был вот такой код X++: void test() { Map valList = new Map(Types::String, Types::Container); Real value; ; valList.insert(value, conNull()); } 1. Прежде всего, это передача различных типов данных. а) например, при работе с Net-сборками: Без цила работает так X++: void test(CLRObject _obj) { System.Collections.Hashtable hash; ; hash = new System.Collections.Hashtable(_obj); } X++: void test(CLRObject _obj) { System.Collections.Hashtable hash; System.Collections.IDictionary iDictionary; ; if ( #isDictionary ) { iDictionary = _obj; hash = new System.Collections.Hashtable(iDictionary); } } в) Аналогично, надо внимательно относиться к классам дочерним и родительским, к передаче данных через контейнер, к использованию anytype и common и т.д. 2. insert_recordset без цила позволяет писать в таблицу константы (используя переменные правильного типа), в циле этот номер не проходит, приходится выполнять две операции, сначала используя insert_recordset прописать идентификаторы, а затем при помощи update_recordset прописать текстовые константы. 3. Метод внутри метода (вложенный): с ним нет проблем, кроме одной: если вложенный метод является рекурсивным, то цил даже отказывается компилиться У меня пока все, может быть кто то еще с чем то подобным встречался ? Последний раз редактировалось Мартынов Дмитрий; 10.06.2014 в 17:02. Причина: ня |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (3), Link (4), S.Kuskov (5), pedrozzz (1). |
10.06.2014, 17:28 | #2 |
Участник
|
Интересные наблюдения, пригодятся в работе, спасибо!
|
|
10.06.2014, 17:36 | #3 |
Участник
|
Уточните версию. Это R2? для R3 актуально?
|
|
10.06.2014, 18:14 | #4 |
Участник
|
R2
|
|
10.06.2014, 20:56 | #5 |
Молодой, подающий надежды
|
CIL валится, если значение переменной класса-наследника инициализировать экземпляром родителя. Живой пример в стандартном функционале привел в другой ветке
__________________
Кононов Пётр |
|
10.06.2014, 21:03 | #6 |
Молодой, подающий надежды
|
Цитата:
В последнее время я попробовал работать с SysOperation вместо RunBaseBatch, а там все работает только через цил.
EnumTypeParameter = SysOperationExecutionMode EnumParameter = Synchronous то код будет выполняться как и прежде, без всякого CIL. Если для вызова сервиса используете свой контроллер (наследник SysOperationServiceController), то аналогично, указываем энум и значение на менюайтеме, а после создания экземпляра контроллера дергаем X++: controller.initializeFromArgs(_args);
__________________
Кононов Пётр |
|
|
За это сообщение автора поблагодарили: Мартынов Дмитрий (1). |
11.06.2014, 12:56 | #7 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: gl00mie (1). |
29.06.2014, 18:52 | #8 |
Читатель
|
Еще не особо работают неявные преобразования типов, например такой код
X++: str key = conPeek([systemDateGet()], 1); |
|