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