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

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

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

Анализ исходных данных и выбор стратегии

Рассмотрим типовую ситуацию: у нас есть документ ПриобретениеТоваровУслуг. Нам нужно получить список этих документов, а для каждой строки (или документа в целом) рассчитать розничную стоимость товаров по актуальным ценам на складе и вычислить наценку.

Основная сложность заключается в том, что данные о розничных ценах хранятся не в самом документе поступления, а в регистре сведений ЦеныНоменклатуры. Кроме того, цена должна соответствовать периоду документа и, возможно, определенному типу цен, привязанному к складу поступления. Проанализируем два способа решения этой задачи: через пакетный запрос и через связи наборов данных.

Решение 1: Использование пакетного запроса

Для эффективного получения данных профессионалы рекомендуют использовать пакетные запросы. Это позволяет избежать сложных левых соединений, которые могут замедлять отчет при больших объемах данных. Разделим нашу задачу на несколько подзадач в рамках одного запроса.

  1. Получение основной информации: Выбираем данные о поступлениях (документ, номенклатура, количество, сумма закупки) и помещаем их во временную таблицу.
  2. Получение розничных цен: Обращаемся к виртуальной таблице СрезПоследних регистра цен номенклатуры.
  3. Итоговый расчет: Соединяем временные таблицы и вычисляем суммы.

Посмотрим на пример текста запроса для схемы компоновки данных:


ВЫБРАТЬ
    ПриобретениеТоваровУслугТовары.Ссылка КАК ДокументПоступления,
    ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПриобретениеТоваровУслугТовары.Количество КАК Количество,
    ПриобретениеТоваровУслугТовары.Сумма КАК СуммаЗакупки,
    ПриобретениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента,
    ПриобретениеТоваровУслугТовары.Ссылка.Склад КАК Склад
ПОМЕСТИТЬ ВТ_ДанныеПоступления
ИЗ
    Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ДанныеПоступления.ДокументПоступления,
    ВТ_ДанныеПоступления.Номенклатура,
    ВТ_ДанныеПоступления.Количество,
    ВТ_ДанныеПоступления.СуммаЗакупки,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК РозничнаяЦена
ИЗ
    ВТ_ДанныеПоступления КАК ВТ_ДанныеПоступления
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
        ПО ВТ_ДанныеПоступления.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

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

Решение 2: Связи наборов данных в СКД

Этот метод считается более гибким и «чистым» с точки зрения архитектуры СКД. Мы создаем два отдельных Набора данных - запрос.

Набор данных 1 (Поступления): выбирает основные реквизиты документов.

Набор данных 2 (Цены): выбирает срез последних цен. В запросе этого набора мы используем параметры &Период и &Номенклатура.

Затем переходим на вкладку «Связи наборов данных» и настраиваем соединение:

Это заставит СКД для каждой строки первого набора выполнять запрос ко второму набору с передачей конкретной даты. Это гарантирует получение правильной розничной цены на дату закупки.

Расчет процента наценки и защита от ошибок

Процент наценки не рекомендуется рассчитывать в самом запросе. Лучше всего использовать вкладку «Вычисляемые поля» в СКД. Это позволит системе корректно обрабатывать итоги и группировки.

Рассмотрим формулу наценки. Обычно она рассчитывается как: (РозничнаяСумма - СуммаЗакупки) / СуммаЗакупки * 100.

Проанализируем ситуацию, когда СуммаЗакупки равна нулю (например, товар принят на комиссию или по нулевой стоимости). В этом случае отчет может выдать ошибку «Деление на ноль». Чтобы этого избежать, используем в выражении вычисляемого поля конструкцию ВЫБОР:


ВЫБОР 
    КОГДА СуммаЗакупки = 0 
    ТОГДА 0 
    ИНАЧЕ (РозничнаяСумма - СуммаЗакупки) / СуммаЗакупки * 100 
КОНЕЦ

Также стоит упомянуть специфическую формулу, которая иногда встречается в бизнес-задачах (процентная разница): | (a - b) / [ (a + b) / 2 ] | * 100. Если ваш заказчик требует именно такой расчет, просто замените выражение в поле соответствующим кодом 1С.

Настройка ресурсов и итогов

Одной из частых ошибок новичков является неправильная настройка итогов по процентным полям. Если вы просто установите функцию СУММА(ПроцентНаценки) на вкладке «Ресурсы», вы получите бессмысленное число (сумму процентов всех строк).

Правильный алгоритм настройки ресурсов следующий:

  1. Для полей СуммаЗакупки и РозничнаяСумма указываем расчет СУММА(ИмяПоля).
  2. Для поля ПроцентНаценки в колонке «Выражение» пишем формулу, которая оперирует уже рассчитанными итогами:

ВЫБОР 
    КОГДА Сумма(СуммаЗакупки) = 0 
    ТОГДА 0 
    ИНАЧЕ (Сумма(РозничнаяСумма) - Сумма(СуммаЗакупки)) / Сумма(СуммаЗакупки) * 100 
КОНЕЦ

В этом случае в строке «Итого» по всему отчету вы увидите средневзвешенный процент наценки по всему реестру, а не среднее арифметическое или сумму процентов.

Дополнительные возможности оформления

Чтобы отчет был максимально полезным для пользователя, мы можем применить Условное оформление. Проанализируем ситуацию: заказчик хочет видеть строки, где наценка ниже 10%, выделенными красным цветом.

Для этого в настройках отчета на вкладке «Условное оформление» добавим новый элемент:

Это стандартная функциональность СКД, которая выполняется на стороне платформы без написания программного кода в модулях, что значительно упрощает поддержку отчета.

Работа с характеристиками

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

Таким образом, мы рассмотрели полный цикл создания сложного отчета на СКД: от проектирования пакетного запроса до настройки корректных итогов в ресурсах. Использование этих методик позволит вам создавать быстрые и точные аналитические инструменты для любого бизнеса.

← На главную