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