Ну, тут явная кастомизация сделана. В данном случае, в таблице Currency записаны не коды валют, а коды условных единиц. Причем сделана иерархия. Добавлены следующие поля
Currency.UE - признак того, что данная запись относится к условным единицам
Currency.CurrencyCodeParent - код валюты "родителя". Т.е. той валюты, по отношению к которой следует рассчитывать курс этих самых условных единиц
Задача сводится к тому, чтобы найти курс "родительской" валюты на текущую дату и на ее основе создать (записать) курс условной единицы тоже на текущую дату. Внешний цикл - это просто перебор всех условных единиц.
В принципе, код, вроде бы, рабочий ("корявенько", но работает

), если не считать того, что не проверяется факт существования курса условных единиц на текущую дату. Это значит, что сколько раз запустишь код, столько раз заново и будет создано по еще одной записи с курсами условных единиц на текущую дату.
Или что подразумевается под фразой "он может создать по 2 записи для каждой у.е"?
Если я правильно понял, что надо сделать, то код должен быть примерно таким
X++:
void clicked()
{
Currency currency;
ExchRates exchRates;
ExchRates exchRatesUE;
FromDate fromDate = systemdateget();
;
while select exchRates
where exchRates.FromDate == fromDate
join currency
where currency.CurrencyCodeParent == exchRates.CurrencyCode
&& currency.UE == NoYes::Yes
{
// Сначала проверяем тот факт, что курс УЕ на текущую дату уже заведен
select firstonly exchRatesUE
where exchRatesUE.FromDate == fromDate
&& exchRatesUE.CurrencyCode == currency.CurrencyCode;
// Если уже есть, то берем следующую запись выборки
if (exchRatesUE)
{
continue;
}
// Если нет, то создаем новую запись
exchRatesUE.clear();
exchRatesUE.CurrencyCode = currency.CurrencyCode;
exchRatesUE.FromDate = fromDate;
exchRatesUE.ExchRate = exchRates.ExchRate * currency.Rate;
exchRatesUE.insert();
info(strFmt("Курс %1: %2", exchRatesUE.CurrencyCode, exchRatesUE.ExchRate));
} // while select exchRates
info(strFmt("Формирование курсов УЕ на %1 завершено!", fromDate));
element.closeCancel();
}
Транзакцию здесь делать не обязательно, поскольку нет "пакета" взаимосвязанных записей. Вставка по одной записи за раз. Впрочем, можно окружить транзакцией весь цикл. Но, в любом случае к "задвоению" транзакция не имеет никакого отношения.