При работе с типовыми отчетами, которые используют данные из регистра КурсыВалют, часто возникает потребность пересчитать показатели по курсу, отличному от актуального (например, по курсу на дату закупки или по усредненному значению). В этой статье мы разберем, как реализовать такую возможность, сохранив при этом гибкость системы компоновки данных.
Если количество валют в вашем отчете невелико (например, две или три), самым простым и эффективным способом будет использование параметров СКД. Этот метод не требует глубокого программирования и позволяет пользователю гибко управлять расчетами.
КурсДоллара, КурсЕвро).Число.СКД вычисляемое поле, логика которого будет определять итоговую сумму в рублях.Рассмотрим, как это реализовать на уровне выражения вычисляемого поля. Мы можем использовать конструкцию ВЫБОР КОГДА, чтобы проверить, ввел ли пользователь значение вручную, или же нам следует взять актуальный курс из системы:
ВЫБОР
КОГДА &КурсДоллара > 0 ТОГДА &КурсДоллара
ИНАЧЕ КурсыВалютСрезПоследних.Курс
КОНЕЦ
Если валют много (десять и более) или вы хотите, чтобы система автоматически «подхватывала» курс из регистра, если пользователь оставил поле пустым, необходимо вмешаться в процесс формирования отчета через модуль объекта.
Для этого воспользуемся обработчиком события ПриКомпоновкеРезультата. Данный подход позволяет динамически подменять значения параметров перед тем, как отчет будет построен.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Валюта", ЗначениеПараметра);
// Здесь мы можем проанализировать заполненность параметров
// и выполнить запрос к регистру сведений КурсыВалют.СрезПоследних,
// если пользователь не задал значение вручную.
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикКомпоновки = Новый КомпоновщикКомпоновкиДанных;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
// ... дальнейший код инициализации процессора
КонецПроцедуры
Если вы хотите, чтобы пользователь видел полноценную таблицу с курсами (валюта — курс), стандартные настройки СКД будут выглядеть неудобно. В таком случае рекомендуем создать собственную форму отчета.
На форме отчета разместите элемент управления ТаблицаЗначений. Пользователь сможет быстро заполнить её нужными значениями, а вы при нажатии кнопки «Сформировать» передадите эту таблицу в параметры отчета. Это решение наиболее профессионально, так как:
При выборе метода ориентируйтесь на потребности ваших пользователей:
ПриКомпоновкеРезультата. Это гарантирует точность данных и позволяет использовать ЕСТЬNULL для автоматического подтягивания курсов из регистра, если пользователь оставил ввод пустым.СКД через соединение с виртуальной таблицей СрезПоследних. Это значительно повышает производительность отчета по сравнению с вычислением курсов через выражения полей для каждой строки.Помните, что жесткая типизация колонок (СправочникСсылка.Валюты и Число с фиксированной точностью) является залогом того, что при выполнении запросов не возникнет ошибок приведения типов. Анализируйте ситуацию, пробуйте различные подходы и выбирайте тот, который лучше всего вписывается в структуру вашего конкретного отчета.