В этом руководстве мы подробно рассмотрим, как разработать отчет на Системе Компоновки Данных (СКД) в конфигурации 1С:Управление торговлей 11.4. Наша задача — вывести информацию о количестве продаж за определенный период, сумме продаж в рублях, текущих остатках на складах и классифицировать товары по группам в зависимости от объема продаж. Мы разберем каждый шаг, от формирования запроса к данным до настройки структуры отчета, чтобы вы смогли эффективно реализовать подобные задачи.
Для создания отчета, соответствующего поставленным требованиям, нам предстоит выполнить следующие ключевые шаги в конструкторе СКД:
Формирование запроса к данным. Это основа любого отчета. Мы должны правильно выбрать источники данных (регистры) и агрегировать их.
Настройка ресурсов. Определим поля, по которым необходимо выводить итоговые значения (суммы, количества).
Создание вычисляемого поля для группировки. Используем логику ВЫБОР КОГДА для классификации товаров по заданным диапазонам количества проданного товара.
Настройка структуры отчета. Определим, как будут располагаться поля и группировки в финальном отчете.
Дополнительные возможности. Рассмотрим, как можно использовать ABC-классификацию для расширенного анализа, хотя это и не является частью исходной задачи, но может быть полезно.
Первым и самым важным этапом является правильное построение запроса, который будет извлекать необходимые данные. В отличие от использования документа РеализацияТоваровУслуг, как было предложено изначально, для получения агрегированных данных по продажам (количество и сумма) за период значительно эффективнее и корректнее использовать регистр накопления ВыручкаИСебестоимостьПродаж. Этот регистр специально предназначен для хранения таких данных, он уже агрегирован и содержит готовую информацию. Для получения текущих остатков мы будем использовать регистр накопления ТоварыНаСкладах.
Наш запрос будет состоять из нескольких частей, использующих временные таблицы для последовательной обработки данных. Такой подход делает запрос более читаемым и управляемым, позволяет нам шаг за шагом подготавливать данные перед их окончательным объединением и анализом.
Сначала мы выберем все необходимые данные о продажах за указанный период из регистра ВыручкаИСебестоимостьПродаж. Мы будем фильтровать данные по периоду, типу номенклатуры (только товары) и типу регистратора (только документы реализации товаров и услуг), чтобы исключить лишние записи и сосредоточиться именно на продажах.
ВЫБРАТЬ
ВыручкаИСебестоимостьПродаж.Период КАК Период,
ВыручкаИСебестоимостьПродаж.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
ВыручкаИСебестоимостьПродаж.Количество КАК Количество,
ВыручкаИСебестоимостьПродаж.СуммаВыручкиСНДСРегл КАК СуммаВыручкиСНДСРегл
ПОМЕСТИТЬ ВТ_ПродажиЗаПериод
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК ВыручкаИСебестоимостьПродаж
ГДЕ
ВыручкаИСебестоимостьПродаж.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачДата, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонДата, ДЕНЬ)
И ВыручкаИСебестоимостьПродаж.АналитикаУчетаНоменклатуры.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
И ТИПЗНАЧЕНИЯ(ВыручкаИСебестоимостьПродаж.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
;
Здесь:
ВыручкаИСебестоимостьПродаж — это основной регистр накопления в УТ 11.4, который хранит данные о продажах, включая себестоимость и выручку. Он является наиболее подходящим источником для такого рода отчетов.Период, Номенклатура, Количество, СуммаВыручкиСНДСРегл — поля, которые мы выбираем. СуммаВыручкиСНДСРегл содержит сумму продаж в рублях с НДС, что соответствует требованию вывести "Продано за период (руб.)". Поле Количество соответствует "Продано за период (в ед. из.)".ГДЕ ВыручкаИСебестоимостьПродаж.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачДата, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонДата, ДЕНЬ) — это условие для выборки данных в заданном диапазоне дат. Параметры &НачДата и &КонДата будут автоматически предложены СКД как стандартные параметры отчета, позволяя пользователю легко задавать нужный период. Функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА гарантируют, что выборка будет включать весь день начала и окончания периода соответственно.ВыручкаИСебестоимостьПродаж.АналитикаУчетаНоменклатуры.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар) — это важный фильтр, который гарантирует, что мы учитываем только продажи товаров, исключая из отчета услуги, работы или другие типы номенклатуры, которые могут быть в базе.ТИПЗНАЧЕНИЯ(ВыручкаИСебестоимостьПродаж.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг) — этот фильтр гарантирует, что мы рассматриваем только продажи, оформленные документом РеализацияТоваровУслуг, исключая, например, возвратные операции, внутренние перемещения или другие виды движений, которые также могут формировать записи в регистре.После того как мы получили все детальные записи о продажах за период, нам нужно агрегировать их, чтобы получить общую сумму и количество продаж для каждой уникальной номенклатурной позиции. Для этого мы создадим вторую временную таблицу, в которой сгруппируем данные по полю Номенклатура и просуммируем количество и выручку. Это позволит нам получить итоговые показатели по каждому товару.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ПродажиЗаПериод.Номенклатура КАК Номенклатура,
СУММА(ВТ_ПродажиЗаПериод.СуммаВыручкиСНДСРегл) КАК СуммаВыручкиСНДСРегл,
СУММА(ВТ_ПродажиЗаПериод.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_СгруппированныеПродажи
ИЗ
ВТ_ПродажиЗаПериод КАК ВТ_ПродажиЗаПериод
СГРУППИРОВАТЬ ПО
ВТ_ПродажиЗаПериод.Номенклатура
;
В этой части запроса:
ВТ_ПродажиЗаПериод, содержащей детальные записи о продажах.СУММА() для полей СуммаВыручкиСНДСРегл и Количество. Это просуммирует все продажи по одному товару.СГРУППИРОВАТЬ ПО ВТ_ПродажиЗаПериод.Номенклатура — это ключевое условие, которое объединяет все записи, относящиеся к одной и той же номенклатуре, позволяя нам получить итоговые значения по каждому товару. Без этой группировки мы бы получили множество строк для одного и того же товара, если он продавался несколько раз в течение периода.Далее нам необходимо получить информацию о текущих остатках товаров на складах на конец отчетного периода. Для этого мы используем виртуальную таблицу Остатки регистра накопления ТоварыНаСкладах. Виртуальная таблица Остатки позволяет получить срез последних остатков на определенную дату.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ПОМЕСТИТЬ ВТ_ОстаткиНаСкладах
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&КонДата, ДЕНЬ), ) КАК ТоварыНаСкладахОстатки
;
Здесь:
РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&КонДата, ДЕНЬ), ) — это вызов виртуальной таблицы, которая возвращает остатки на конец дня, указанного в параметре &КонДата. Важно использовать КОНЕЦПЕРИОДА, чтобы получить остатки на момент закрытия дня, а не на его начало. Второй параметр (отбор по условиям) оставлен пустым, что означает выборку по всем складам и всем характеристикам номенклатуры. Если требуется отбор по конкретным складам или характеристикам, его необходимо указать здесь.ВНаличииОстаток — это поле, которое содержит фактическое количество товара на складах. Это соответствует требованию вывести "Текущие остатки на складах".Наконец, мы объединим все полученные временные таблицы в один результирующий набор данных. Здесь же мы сформируем поле Группа, используя условную логику ВЫБОР КОГДА на основе суммарного количества проданного товара, что является ключевым требованием отчета.
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_СгруппированныеПродажи.Номенклатура КАК Товар,
ВТ_СгруппированныеПродажи.Количество КАК ПроданоЗаПериодКоличество,
ВТ_СгруппированныеПродажи.СуммаВыручкиСНДСРегл КАК ПроданоЗаПериодВРублях,
ВТ_ОстаткиНаСкладах.ВНаличииОстаток КАК ТекущиеОстаткиНаСкладах,
ВЫБОР
КОГДА ВТ_СгруппированныеПродажи.Количество >= 0 И ВТ_СгруппированныеПродажи.Количество <= 9
ТОГДА "Группа 1 (0-9 шт.)"
КОГДА ВТ_СгруппированныеПродажи.Количество > 9 И ВТ_СгруппированныеПродажи.Количество <= 99
ТОГДА "Группа 2 (10-99 шт.)"
ИНАЧЕ "Группа 3 (от 100 шт.)"
КОНЕЦ КАК Группа
ИЗ
ВТ_СгруппированныеПродажи КАК ВТ_СгруппированныеПродажи
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиНаСкладах КАК ВТ_ОстаткиНаСкладах
ПО ВТ_СгруппированныеПродажи.Номенклатура = ВТ_ОстаткиНаСкладах.Номенклатура
Разберем этот заключительный запрос более детально:
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиНаСкладах: Мы используем левое соединение с временной таблицей остатков. Это очень важно, если вы хотите видеть в отчете все товары, по которым были продажи за период, даже если по ним на текущий момент нет остатка на складах (или, например, они были проданы и списаны до конца). Если бы мы использовали ВНУТРЕННЕЕ СОЕДИНЕНИЕ, то в отчет попали бы только те товары, по которым есть и продажи, и остатки одновременно. Левое соединение гарантирует, что все записи из левой таблицы (ВТ_СгруппированныеПродажи) будут присутствовать в результате.ПО ВТ_СгруппированныеПродажи.Номенклатура = ВТ_ОстаткиНаСкладах.Номенклатура: Условие соединения между двумя временными таблицами, которое связывает продажи с остатками по одной и той же номенклатуре.Группа:
ВЫБОР КОГДА ... ТОГДА ... КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — это стандартная и очень гибкая конструкция языка запросов 1С для реализации условной логики. Она позволяет создать новое поле на основе значений других полей.ВТ_СгруппированныеПродажи.Количество (общее количество проданного товара за период, полученное в предыдущей временной таблице).КОГДА ВТ_СгруппированныеПродажи.Количество >= 0 И ВТ_СгруппированныеПродажи.Количество <= 9 ТОГДА "Группа 1 (0-9 шт.)" — это первое условие. Если проданное количество находится в диапазоне от 0 до 9 штук включительно, товару присваивается "Группа 1".КОГДА ВТ_СгруппированныеПродажи.Количество > 9 И ВТ_СгруппированныеПродажи.Количество <= 99 ТОГДА "Группа 2 (10-99 шт.)" — второе условие для диапазона от 10 до 99 штук. Важно отметить, что мы используем > 9, чтобы избежать пересечения с первой группой.ИНАЧЕ "Группа 3 (от 100 шт.)" — это последнее условие, которое срабатывает, если ни одно из предыдущих не выполнилось. То есть, если количество проданного товара 100 и более штук, ему присваивается "Группа 3".Таким образом, мы получили все необходимые поля для отчета: Товар, ПроданоЗаПериодКоличество, ПроданоЗаПериодВРублях, ТекущиеОстаткиНаСкладах и расчетное поле Группа.
После того как запрос к данным сформирован и возвращает необходимые поля, нам необходимо указать Системе Компоновки Данных, какие из этих полей являются числовыми и должны быть просуммированы или по которым должны быть выведены итоговые значения. Для этого перейдем на закладку "Ресурсы" в конструкторе СКД.
Мы должны определить следующие поля как ресурсы:
ПроданоЗаПериодКоличество: Для этого поля выбираем агрегатную функцию Сумма. Это позволит СКД автоматически подсчитывать общее количество проданных товаров для каждой группировки (например, сумму по всей группе или по всему отчету).ПроданоЗаПериодВРублях: Аналогично, для этого поля выбираем агрегатную функцию Сумма. Это обеспечит подсчет общей выручки по продажам для каждой группировки.ТекущиеОстаткиНаСкладах: Также выбираем агрегатную функцию Сумма. Это позволит видеть суммарный остаток по группировке (например, сумму остатков всех товаров в "Группе 1"). Для детальных записей будет выводиться сам остаток по конкретному товару.Правильная настройка ресурсов позволяет СКД автоматически рассчитывать итоги по этим полям для всех уровней группировки и для отчета в целом, что делает отчет более информативным и удобным для анализа.
Хотя мы уже определили поле Группа непосредственно в запросе, иногда бывает удобнее выносить логику группировки в вычисляемые поля СКД. Этот подход полезен, если логика сложная, требует обращения к дополнительным функциям СКД, или если вы хотите, чтобы пользователи могли изменять эту логику (например, границы групп) через настройки СКД без изменения основного текста запроса. В нашем случае, поле Группа уже присутствует в конечном наборе данных запроса, и этот шаг является альтернативным или дополнительным.
Если бы мы создавали поле Группа как вычисляемое поле в СКД, то на закладке "Вычисляемые поля" в конструкторе СКД мы бы добавили новое поле, например, ГруппаПродаж, и прописали бы для него следующее выражение. Мы бы использовали уже готовые поля из набора данных, например, ПроданоЗаПериодКоличество.
ВЫБОР
КОГДА ПроданоЗаПериодКоличество >= 0 И ПроданоЗаПериодКоличество <= 9
ТОГДА "Группа 1 (0-9 шт.)"
КОГДА ПроданоЗаПериодКоличество > 9 И ПроданоЗаПериодКоличество <= 99
ТОГДА "Группа 2 (10-99 шт.)"
ИНАЧЕ "Группа 3 (от 100 шт.)"
КОНЕЦ
После создания такого вычисляемого поля его необходимо добавить в выбранные поля на закладке "Настройки", чтобы оно отображалось в отчете. При использовании этого подхода, поле Группа из запроса было бы не нужно, и мы бы работали с ГруппаПродаж.
Теперь, когда данные готовы и ресурсы определены, нам нужно настроить внешний вид отчета. Переходим на закладку "Настройки" в конструкторе СКД. Здесь мы определим, как будут выводиться данные, какие группировки будут использоваться и в каком порядке.
Выбор типа структуры: Начнем с выбора общего типа структуры отчета. Для нашего случая, где мы выводим данные по товарам с группировкой, хорошо подойдет "Таблица". Это позволит нам иметь столбцы для каждого показателя и строки для товаров и групп.
Выбор полей: На закладке "Выбранные поля" добавляем все поля, которые хотим видеть в отчете. Перетащите их из списка доступных полей в список выбранных. В нашем случае это будут:
ТоварПроданоЗаПериодВРубляхПроданоЗаПериодКоличествоТекущиеОстаткиНаСкладахГруппаУбедитесь, что порядок полей соответствует желаемой форме отчета.
Настройка группировок:
Для того чтобы отчет соответствовал требованию ранжирования по группам, нам необходимо настроить группировку по полю Группа. Это позволит сначала выводить итоги по каждой группе, а затем детализацию по товарам внутри этой группы. Для этого:
Группа.Товар для детализации. Это обеспечит вывод списка товаров под каждой группой.Это позволит вам получить отчет в следующем виде, что значительно упростит анализ данных:
----------------------------------------------------------------------------------------------------
Группа 1 (0-9 шт.) | Продано (руб.) Итог | Продано (ед.) Итог | Остаток Итог
----------------------------------------------------------------------------------------------------
Товар 1 | Продано (руб) | Продано (ед.) | Остаток | Группа 1
Товар 2 | Продано (руб) | Продано (ед.) | Остаток | Группа 1
----------------------------------------------------------------------------------------------------
Группа 2 (10-99 шт.) | Продано (руб.) Итог | Продано (ед.) Итог | Остаток Итог
----------------------------------------------------------------------------------------------------
Товар 3 | Продано (руб) | Продано (ед.) | Остаток | Группа 2
... (и так далее для остальных групп и товаров)
Настройка порядка: Вы можете задать порядок сортировки для группировок и детальных записей. Например, можно отсортировать группировки по Группа (по возрастанию), а затем товары внутри каждой группы по ПроданоЗаПериодКоличество (по убыванию), чтобы самые продаваемые товары внутри группы отображались первыми. Это делается на закладке "Порядок" в свойствах соответствующей группировки или детальных записей.
Правильная настройка структуры отчета является залогом его читаемости и соответствия бизнес-требованиям. СКД предоставляет очень гибкие инструменты для этого.
Помимо жестко заданных групп по количеству, СКД предоставляет мощный и очень полезный инструмент для анализа данных — ABC-классификацию. Это методика, позволяющая распределить объекты (в нашем случае, товары) по их значимости, используя принцип Парето (например, 20% товаров приносят 80% выручки, следующие 30% товаров приносят 15% выручки, а остальные 50% товаров — лишь 5% выручки). Для этого в СКД существует специальная агрегатная функция КлассификацияABC.
Хотя в вашем первоначальном запросе была другая логика группировки, понимание ABC-классификации может быть очень полезно для будущих задач анализа ассортимента. Чтобы применить ABC-классификацию, вы можете добавить новое вычисляемое поле в конструкторе СКД, например, КлассABC.
Пример выражения для поля КлассABC, которое классифицирует товары по сумме выручки:
КлассификацияABC("Сумма(ПроданоЗаПериодВРублях)", 3, "80, 95", "Товар")
Разберем параметры этой функции:
"Сумма(ПроданоЗаПериодВРублях)": Это строковое выражение, по которому будет производиться классификация. Мы классифицируем товары по сумме выручки. Можно использовать и "Сумма(ПроданоЗаПериодКоличество)" для классификации по объему продаж.3: Количество групп, на которое нужно разбить данные. Обычно для ABC-анализа используется 3 группы (A, B, C)."80, 95": Это строковые значения, представляющие процентные границы для групп. Первая группа (A) будет включать товары, которые составляют до 80% от общей суммы (или количества). Вторая группа (B) будет включать товары, составляющие от 80% до 95% от общей суммы. Оставшиеся товары (более 95% до 100%) попадут в третью группу (C). Проценты указываются нарастающим итогом."Товар": Это имя группировки, в которой следует вычислять классификацию. В нашем случае это детализация по товару, то есть каждый товар будет классифицирован относительно своих "собратьев". Если бы вы классифицировали, например, склады, то указывали бы имя группировки по складам.После добавления такого поля вы сможете анализировать товары не только по фиксированным диапазонам проданного количества, но и по их вкладу в общую выручку или количество продаж, что дает более глубокое понимание эффективности товарного ассортимента.
При работе с отчетами СКД, особенно в сложных конфигурациях вроде 1С:УТ 11.4, всегда полезно учитывать следующие моменты:
Единицы измерения: Поле Количество в регистрах 1С:УТ обычно хранится в базовых единицах измерения номенклатуры. Убедитесь, что это соответствует вашим ожиданиям и требованиям отчета. Если необходимо выводить количество в других единицах (например, в упаковках, ящиках и т.д.), потребуется дополнительная логика пересчета. Это может быть реализовано через справочник УпаковкиЕдиницыИзмерения, где хранятся коэффициенты пересчета, и включение его в запрос или использование вычисляемых полей.
Обработка нулевых и отсутствующих значений: Использование ЛЕВОЕ СОЕДИНЕНИЕ для таблицы остатков гарантирует, что в отчет попадут все проданные товары, даже если у них нет текущих остатков на складах. В таких случаях поле ВНаличииОстаток может быть NULL (неопределено). Чтобы вместо пустого значения выводился ноль, вы можете использовать функцию ЕСТЬNULL(ВТ_ОстаткиНаСкладах.ВНаличииОстаток, 0) непосредственно в запросе или в вычисляемом поле СКД.
Параметры периода: Убедитесь, что параметры &НачДата и &КонДата корректно настроены в СКД как стандартные параметры отчета. Задайте для них осмысленные заголовки (например, "Период с:", "Период по:") и установите тип параметра "Дата", а также убедитесь, что они доступны для редактирования пользователем на форме отчета.
Оптимизация запросов: Для больших объемов данных производительность отчета может быть критичной. Используйте индексированные поля в условиях ГДЕ и ПО, по возможности избегайте функций в условиях выборки, которые могут приводить к полному сканированию таблиц. Применение временных таблиц, как мы сделали в этом примере, часто способствует оптимизации, так как позволяет разбить сложный запрос на более простые и управляемые части.
Тестирование: Всегда тщательно тестируйте отчет на разных наборах данных и периодах. Проверяйте корректность расчетов, группировок, сортировки и отображения информации. Убедитесь, что отчет возвращает ожидаемые данные и работает без ошибок.
Следуя этим шагам и рекомендациям, вы сможете создать мощный и информативный отчет на СКД в 1С:УТ 11.4, который будет отвечать всем вашим требованиям по анализу продаж и остатков с удобной группировкой товаров и возможностью дальнейшего расширения функционала.