Как добавить возможность ручного ввода произвольного курса валют в отчет на СКД?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с типовыми отчетами, которые используют данные из регистра КурсыВалют, часто возникает потребность пересчитать показатели по курсу, отличному от актуального (например, по курсу на дату закупки или по усредненному значению). В этой статье мы разберем, как реализовать такую возможность, сохранив при этом гибкость системы компоновки данных.

Вариант 1: Использование параметров и вычисляемых полей

Если количество валют в вашем отчете невелико (например, две или три), самым простым и эффективным способом будет использование параметров СКД. Этот метод не требует глубокого программирования и позволяет пользователю гибко управлять расчетами.

  1. Добавьте в отчет параметры с именами, соответствующими валютам (например, КурсДоллара, КурсЕвро).
  2. Установите для параметров тип Число.
  3. Создайте в СКД вычисляемое поле, логика которого будет определять итоговую сумму в рублях.

Рассмотрим, как это реализовать на уровне выражения вычисляемого поля. Мы можем использовать конструкцию ВЫБОР КОГДА, чтобы проверить, ввел ли пользователь значение вручную, или же нам следует взять актуальный курс из системы:


ВЫБОР
    КОГДА &КурсДоллара > 0 ТОГДА &КурсДоллара
    ИНАЧЕ КурсыВалютСрезПоследних.Курс
КОНЕЦ

Вариант 2: Программная обработка данных при компоновке

Если валют много (десять и более) или вы хотите, чтобы система автоматически «подхватывала» курс из регистра, если пользователь оставил поле пустым, необходимо вмешаться в процесс формирования отчета через модуль объекта.

Для этого воспользуемся обработчиком события ПриКомпоновкеРезультата. Данный подход позволяет динамически подменять значения параметров перед тем, как отчет будет построен.


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Валюта", ЗначениеПараметра);
    
    // Здесь мы можем проанализировать заполненность параметров 
    // и выполнить запрос к регистру сведений КурсыВалют.СрезПоследних,
    // если пользователь не задал значение вручную.
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикКомпоновки = Новый КомпоновщикКомпоновкиДанных;
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    // ... дальнейший код инициализации процессора
КонецПроцедуры

Вариант 3: Использование формы отчета для ввода таблицы

Если вы хотите, чтобы пользователь видел полноценную таблицу с курсами (валюта — курс), стандартные настройки СКД будут выглядеть неудобно. В таком случае рекомендуем создать собственную форму отчета.

На форме отчета разместите элемент управления ТаблицаЗначений. Пользователь сможет быстро заполнить её нужными значениями, а вы при нажатии кнопки «Сформировать» передадите эту таблицу в параметры отчета. Это решение наиболее профессионально, так как:

Рекомендации по реализации

При выборе метода ориентируйтесь на потребности ваших пользователей:

Помните, что жесткая типизация колонок (СправочникСсылка.Валюты и Число с фиксированной точностью) является залогом того, что при выполнении запросов не возникнет ошибок приведения типов. Анализируйте ситуацию, пробуйте различные подходы и выбирайте тот, который лучше всего вписывается в структуру вашего конкретного отчета.

← На главную