Очень полезная тема создания классов-коллекций из контейнеров требует уточнения для AX 2012. Из моего скромного опыта, надо учесть, что:
- номер версии (первый элемент контейнера) теперь не 1, а 3, хотя с 1 тоже все работает;
- классы-коллекции очень чувствительны к базовому типу служебных значений в контейнере при работе в CIL, в частности, к количеству элементов, которое указывается после базового типа элементов.
О последнем обстоятельстве я узнал на таком примере: есть исходные данные для создания Map (пары ключ-значение), которые зашиты в макрос, в коде по макросу создается контейнер с данными, затем формируется контейнер со служебной частью для Map, куда 4-м элементом пишется длина контейнера с данными, деленная надвое. Для деления использовался
оператор div, который, как выяснилось, ведет себя в CIL не так, как в интерпретаторе X++. В итоге выражение
в X++ давало значение Integer, а в CIL - Int64, при этом в X++ Map'у без разницы тип счетчика элементов - Integer или Int64, а вот в CIL Map генерит исключение "Specified cast is not valid". Поскольку дело происходило в коде, дергавшемся из AIF лишь для определенных входных данных, то я долго не мог понять, где же именно генерится это исключение. В итоге пришлось сделать явное приведение типа, чтобы все корректно работало в CIL:
X++:
any2int(conLen(con) div 2)