Имя: Пароль:
1C
 
СКД. Как заставить 1С НЕ считать значения в иерархии, а вывести заданные для группы.
☑
0 kostyan29
 
08.09.26
✎
12:52
Добрый день! Есть вроде бы простая задача, но я никак не пойму, как ее решить. Хочу получить отчет-таблицу по продажам с разбивкой по месяцам, и с иерархией номенклатуры.
И я хочу найти максимальные продажи за месяц по каждой номенклатуре, и по каждой группе номенклатуры. И считать долю от продаж за конкретный месяц от максимальных продаж в году. В общем, сезонность товаров. И выводить в таблице также в каждом месяце максимальные месячные продажи, которые были за год (это поле по большей части просто для отладки).

Единственный способ, до которого я додумался, сделать в СКД набор данных - объект, и таблицу значений для него готовить программно. Через запрос с итогами, потом проход по этой таблице с поиском максимальных продаж за год, потом формирование итоговой таблицы значений.
Она имеет такой вид:
- Номенклатура (тут и группы, и элементы)
- Месяц (просто число от 1 до 12)
- ПродажиЗаМесяц
- МаксимумПродажиЗаМесяц (тут будет найденное среди 12 месяцев максимальное значение по продажам для этой группы или элемента номенклатуры)
- КоэффициентСезонности (ПродажиЗаМесяц / МаксимумПродажиЗаМесяц)

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

Для примера, вот выдуманные продажи с 2 столбцами, Продажи за конкретный месяц, и макс. продажи - это максимум месячных продаж, совершенных за год.
Номенклатура             |       Январь              |       Февраль
                         | продажи   | макс. продажи.| продажи | макс. продажи
Процессоры (группа)      |   6       |     4         |      8  |      4
 - Intel i5 12600 (элем.)|   2       |     4         |      4  |      4
 - Ryzen 5600 (элем.)    |   3       |     3         |      2  |      3     
 - Intel i3 10100 (элем.)|   1       |     2         |      2  |      2  


По элементам выводится все правильно - у Intel i5 12600 максимальные продажи были в феврале в кол-ве 4 шт., и в январе в "макс. продажи" выводится именно 4.
Для Ryzen максимальные продажи были в январе (3 шт.), и в феврале в "макс. продажи" выводится именно 3.
Но по группе Процессоры столбец макс. продажи заполняется неверно - СКД считает его как ресурс, и считает по входящим в него элементам. Если в выражении для столбца на закладке Ресурсы будет прописано "Максимум(МаксимумПродажЗаПериод)", то выведет 4 за январь (просто найдет макс. среди элементов процессоров). Если прописать "Сумма(МаксимумПродажЗаПериод)", то выведет за январь 9 (просуммирует 4 + 3 + 2 по элементам). А правильное значение должно быть 8, и это значение есть в подготовленной таблице значений, из которой формируется отчет! Оно там есть, я просто не могу заставить СКД вывести именно его, а не пытаться высчитывать его заново.
Не помогают никакие хитрые ВычислитьВыражение, ни попытки вообще убрать из ресурсов (тогда просто не выведется).
Как это можно поправить? Как заставить в иерархии вывести просто то, что есть в наборе данных, и ничего не выдумывать?
Может, я вообще не в ту сторону копаю, и есть способ куда проще?
1 toypaul
 
гуру
08.09.26
✎
13:12
Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Ресурс)", "Группировка"))
2 toypaul
 
гуру
08.09.26
✎
13:14
Из описания задачи ничего не понял. Если ресурс задан для группы, то в выражении ресурса просто вывести его без всяких сумма или максимум
3 kostyan29
 
08.09.26
✎
13:25
(1) (2) Если просто вывести без сумм и максимум, то в этом случае он просто выводит первое значение из элементов. Значение, заданное для самой группы, он не хочет брать ни в какую.
Если использовать что-то типа Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Ресурс)", "Группировка")) , то все равно не то - берет данные из элементов, входящих в группу, а это не то, что нужно.
4 kittystark
 
09.09.26
✎
16:03
(0) есть такая функция выражений СКД - ГрупповаяОбработка, она поможет
5 Галахад
 
гуру
09.09.26
✎
16:23
Не совсем понял "МаксимумПродажЗаПериод" уже же посчитан. Зачем его делать ресурсом?
6 Web00001
 
10.09.26
✎
05:19
Не понятно несколько вещей
Единственный способ, до которого я додумался, сделать в СКД набор данных - объект, и таблицу значений для него готовить программно. Через запрос с итогами, потом проход по этой таблице с поиском максимальных продаж за год, потом формирование итоговой таблицы значений.

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

Не видно закладки "Настройки" отсюда непонятно, можем ли мы отдельно для каждой группировки посчитать ресурсы. Если не можем, надо настроить группировки так, чтобы можно было - одна группировка иерархия, вторая группировка по номенклатуре(если надо, как я понял, ты самостоятельно все рассчитал и в номенклатуре у нас уже детальные записи) и посчитать ресурсы для каждой так как надо.
7 Dimaster
 
12.09.26
✎
22:38
Поставьте разные формулы ресурсов на разные "Рассчитать по".

В вашем случае видимо Номенклатура(иерархия)+ПериодМесяц и Номенклатура+ПериодМесяц.

Как вариант еще разные сделать прям поля, например через вычисляемые, и в макетах поставить разные ресурсы на разных уровнях
8 xenos
 
13.09.26
✎
11:29
(0) Посчитать сумму и разделить на количество строк.
9 kostyan29
 
15.09.26
✎
08:30
Всем спасибо за попытки помочь. В общем, как это сделать в СКД, я так и не понял. Сделал проще - записал все данные в регистр сведений и подгружаю данные для отображения в динамическом списке с номенклатурой.
Вот как это примерно выглядит:

https://disk.yandex.ru/i/otc3TKeAS8r8Hg

Список номенклатуры + 12 колонок с месяцами. В шапке выбираем склад и год с данными по продажам.
В ячейках выводится 2 значения - продажи за месяц и в скобках пишется процент от максимального уровня продаж, который был достигнут в заданном году. Вот если прямо по моей картинке - у процессоров были максимальные продажи в сентябре - 64 шт. Это берется за 100%, это максимум продаж за год. В феврале было продано 22 процессора - это 34% от максимума за год.
И градация по цветам
- если несезон (слабые продажи) - серый цвет
- продажи чуть получше - желтый цвет
- сезон - зеленоватый цвет
- и месяц в котором были максимальные продажи - выделяется чистым зеленым и пишется жирным шрифтом.

Легко и просто сходу оценить сезонность товаров - хоть укрупненно по группам, хоть детально по элементно.
Я считал это элементарной задачей, но именно отобразить это так, как я хотел, я так и не смог с помощью СКД, пришлось делать по-другому.

В СКД я делал таблицу, в строках группировка по номенклатуре (иерархия), в колонках - месяцы. Если не задавать максимальные продажи (или коэффициент продаж, не важно) как ресурс, то значение просто не выведется. Может, я страшно туплю, но оно не выводится.
Если задать как ресурс, то в детальных записях (по элементам справочника номенклатуры) все идеально. Но с группами все очень грустно - по группам упорно пытается посчитать значения из детальных записей, и только из них. Просто взять и вывести то значение, которое прямо задано в ТЗ для этой группы - невозможно. Неважно, пытаешься ты ставить разные формулы для "Рассчитать по", это никак не исправляет основополагающую проблему - СКД упорно высчитывает значения исходя из детальных записей по колонке, а так их высчитать невозможно.
ГрупповаяОбработка - тоже работает исключительно с детальными записями.

В общем, задача решена, хоть и не так, как планировал. Еще раз, всем спасибо.