Хочу поделиться опытом связанным с 2012:
Был вот такой код
X++:
void test()
{
Map valList = new Map(Types::String, Types::Container);
Real value;
;
valList.insert(value, conNull());
}
Ошибочка: объявили, что в мепе будет стринг, а пишем туда риал. Долго оставалась незамеченной, все работало как часы. Но как только собрали CIL она всплыла. Вот ведь... в циле работает так, а в аксапте иначе. Но если говорить серьезно, то разница есть и на вполне правильных конструкциях. В последнее время я попробовал работать с SysOperation вместо RunBaseBatch, а там все работает только через цил.
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);
}
}
б) выборка из таблицы select x; без цила возвращает объект того типа, который объявлен, а в циле возвращает объект дочерней таблицы (теперь у нас такие есть в Акс12).
в) Аналогично, надо внимательно относиться к классам дочерним и родительским, к передаче данных через контейнер, к использованию anytype и common и т.д.
2. insert_recordset без цила позволяет писать в таблицу константы (используя переменные правильного типа), в циле этот номер не проходит, приходится выполнять две операции, сначала используя insert_recordset прописать идентификаторы, а затем при помощи update_recordset прописать текстовые константы.
3. Метод внутри метода (вложенный): с ним нет проблем, кроме одной: если вложенный метод является рекурсивным, то цил даже отказывается компилиться
У меня пока все, может быть кто то еще с чем то подобным встречался ?