С одной стороны, в документации советуется по возможности избегать операторов foreach, поскольку они сильно влияют на производительность. С другой, на этом форуме читал совет, что в фильтре и в изменяемых признаках надо указывать только тот срез, который действительно меняется. С третей стороны, создавать дополнительные уровни агрегации тоже не очень хочется. Чем же поступиться с точки зрения "бестпрактис" в моем случае? Случай, например, такой: в мультипровайдере два куба - для ввода и из ЕРП, в обоих есть признаки "счет", "партнер" и "статус", но в форме ввода нет аналитики "партнер" и введенные пользователем значения записываются с пустой аналитикой на "статус" = "рабочий". мне надо написать функцию, которая для каждого счета проверяет общую сумму значений из ЕРП и введенную - они должны быть равны. Если не равны, надо вывести сообщение о том, по какому счету они не равны. Нюанс в том, что следующая функция, если проверка прошла успешно, должна копировать данные со статуса "рабочий" на статус "утвержденный" и при этом аналитика "партнер" в данных из ЕРП не должна теряться, а копироваться как есть. Варианты, как я понимаю, у меня такие: 1. Сделать для функции проверки отдельный уровень агрегации, с аналитиками "инфопровайдер" и "счет", без партнера, добавить счет в изменяемые признаки и в функции планирования просто сравнивать {KF,ERP, account} и {KF, manual, account} в конструкции foreach. 2. Запускать все функции на одном и том же уровне агрегации (на нем, соответственно, есть "партнер"), но сделать отдельный фильтр, который вернет данные с обоих провайдеров, добавить партнера в изменяемые признаки, чтобы исключить эту аналитику из определения блока, и делать вложенный foreach по партнеру. 3. Запускать все функции на одном и том же уровне агрегации (на нем, соответственно, есть "партнер"), использовать тот же фильтр, который используется для ввода, добавить партнера в изменяемые признаки, чтобы исключить эту аналитику из определения блока, и делать вложенный foreach in refdata по партнеру.
Я пока склоняюсь к варианту №3, но хотел бы уточнить, может быть лучше делать отдельный уровень агрегации, зато исключить вложенный foreach (вариант 1)? Или, с учетом того, что довольно много отзывов остранной работе refdata плюс, насколько я понимаю, foreach in refdata более затратная по ресурсам, поэтому сделать дополнительный и избыточный фильтр, но зато не использовать refdata (вариант 2)?
|
|