Как вывести номенклатуру в строку заказа и правильно рассчитать итоги в СКД 1С

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

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

Оптимизация запроса для СКД

Первым делом проанализируем структуру данных. Если мы просто выберем Документ.ЗаказКлиента.Товары, то при расчете итогов суммы будут дублироваться для каждой строки номенклатуры. Чтобы избежать проблем с расчетами на этапе компоновки, необходимо сформировать максимально качественную выборку данных на уровне языка запросов 1С.

Рассмотрим пример правильного запроса, который собирает данные по товарам и привязывает к ним показатели заказа:


ВЫБРАТЬ
    ЗаказКлиентаТовары.Ссылка КАК СсылкаЗаказКлиента,
    ЗаказКлиентаТовары.Ссылка.Дата КАК Период,
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ЗаказКлиентаТовары.Количество КАК Количество,
    ЗаказКлиентаТовары.Цена КАК Цена,
    &ЦенаДоставки КАК ЦенаДоставки
ПОМЕСТИТЬ ВТ_ПродажиТовары
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
    ЗаказКлиентаТовары.Ссылка.Проведен = ИСТИНА

При использовании временных таблиц ВТ_ПродажиТовары вы можете заранее вычислить необходимые показатели. Если вам нужно, чтобы ЦенаДоставки не суммировалась излишне, используйте логику выбора в запросе или настройки ресурсов СКД.

Настройка ресурсов для корректного суммирования

Частая ошибка — попытка суммировать показатели, которые относятся ко всему документу, как если бы они были свойствами каждой строки номенклатуры. Чтобы исправить это, перейдите на закладку Настройки -> Ресурсы в СКД.

Для поля Прибыль и РасходыПоДоставке вместо простого Сумма() используйте функции ВычислитьВыражение(). Это позволит ограничить область расчета группировкой заказа:

Пример формулы для вычисляемого поля Прибыль:

ВычислитьВыражение("Сумма(Вознаграждение)-(Сумма(Комиссия)+Сумма(Размещение))", "ЗаказКлиента") - Сумма(ЦенаДоставки)

Использование функции ВычислитьВыражение с указанием группировки "ЗаказКлиента" позволяет гарантировать, что стоимость доставки будет учтена один раз на весь документ, даже если в нем десять позиций номенклатуры.

Как добиться визуального объединения ячеек

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

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

  1. Используйте группировки: Вместо объединения ячеек используйте вложенные группировки по полю ЗаказКлиента. Это сделает отчет иерархическим, удобным для чтения и лишенным проблем с «лишними» строками.
  2. Постобработка: Если заказчик требует именно Excel-подобный вид с физически объединенными ячейками, единственный способ — это программная постобработка объекта ТабличныйДокумент после формирования отчета методом КомпоновщикРезультата.Вывести(). Вы проходите циклом по колонкам с номерами заказов и применяете метод Область.Объединить() при совпадении значений.

Итоговые советы по разработке

Проанализировав все аспекты, мы видим, что ключ к успеху — это чистый запрос и грамотная настройка группировок в самом отчете, а не попытка перенести логику Excel в 1С. Удачи в настройке ваших отчетов!

← На главную