Показать сообщение отдельно
Старый 29.09.2014, 13:48   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Уточнение для AX 2012 и выполнения кода в CIL
Очень полезная тема создания классов-коллекций из контейнеров требует уточнения для AX 2012. Из моего скромного опыта, надо учесть, что:
  • номер версии (первый элемент контейнера) теперь не 1, а 3, хотя с 1 тоже все работает;
  • классы-коллекции очень чувствительны к базовому типу служебных значений в контейнере при работе в CIL, в частности, к количеству элементов, которое указывается после базового типа элементов.
О последнем обстоятельстве я узнал на таком примере: есть исходные данные для создания Map (пары ключ-значение), которые зашиты в макрос, в коде по макросу создается контейнер с данными, затем формируется контейнер со служебной частью для Map, куда 4-м элементом пишется длина контейнера с данными, деленная надвое. Для деления использовался оператор div, который, как выяснилось, ведет себя в CIL не так, как в интерпретаторе X++. В итоге выражение
X++:
conLen(con) div 2
в X++ давало значение Integer, а в CIL - Int64, при этом в X++ Map'у без разницы тип счетчика элементов - Integer или Int64, а вот в CIL Map генерит исключение "Specified cast is not valid". Поскольку дело происходило в коде, дергавшемся из AIF лишь для определенных входных данных, то я долго не мог понять, где же именно генерится это исключение. В итоге пришлось сделать явное приведение типа, чтобы все корректно работало в CIL:
X++:
any2int(conLen(con) div 2)
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (2).