Подниму, пожалуй, тему. В АХ2012 появились модели, а UtilElements не позволяет по ним фильтроваться. Ниже приведен пример создания проекта по объектам конкретной модели. Также в приведенном коде исправлена ошибка исходного скрипта, когда, скажем, находился метод класса или поле таблицы, но сам класс или таблица в итоге в проект не добавлялись. Это связано с особенностью работы SysProjectFilterRunBase, которому на вход надо подавать только объекты AOT верхнего уровня.
X++:
SysModelManifest modelManifest;
SysModelElement modelElement;
SysModelElementData modelElementData;
UtilElements utilElementsBuf;
ProjectNode projectNode;
SysProjectFilterRunBase projectFilt;
UTCTimestamp dateTimeMin = DateTimeUtil::addDays(DateTimeUtil::utcNow(), -1);
boolean isAnyFound = false;
projectNode = SysTreeNode::createProject('MyProject', ProjectSharedPrivate::ProjShared);
projectFilt = SysProjectFilterRunBase::construct();
projectFilt.parmProjectNode(projectNode);
projectFilt.grouping(SysProjectGrouping::AOT); // важно: группируем объекты в проекте, как в AOT, иначе получим плоский список объектов
while select tableId
from modelManifest
where modelManifest.DisplayName == 'My Model Name' // фильтр по интересующей модели
join tableId
from modelElementData
where modelElementData.ModelId == modelManifest.RecId
&& modelElementData.modifiedDateTime >= dateTimeMin // фильтр по времени модификации
join modelElement
where modelElement.RecId == modelElementData.ModelElement
// мы в любом случае не сможем добавить в наш проект другие проекты
&& modelElement.ElementType != any2int64(UtilElementType::SharedProject)
&& modelElement.ElementType != any2int64(UtilElementType::PrivateProject)
{
utilElementsBuf.clear();
utilElementsBuf.recordType = modelElement.ElementType;
utilElementsBuf.name = modelElement.Name;
utilElementsBuf.parentId = modelElement.ParentId;
if (utilElementsBuf.ParentId)
{
// важно: добавлять следует лишь объекты верхнего уровня
// поэтому если нашелся метод или табличное поле, то
// получаем родительский объект, иначе в проект он не добавится
// за счет группировки повторяющиеся объекты в итоге
// будут добавлены в результирующий проект лишь один раз
utilElementsBuf = xUtilElements::parentElement(utilElementsBuf);
}
isAnyFound = projectFilt.doUtilElements(utilElementsBuf) || isAnyFound;
}
if (isAnyFound)
{
// сохраняем изменения и открываем новый проект
projectFilt.write();
projectNode.AOTnewWindow();
}