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