Имя: Пароль:
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) Если просто вывести без сумм и максимум, то в этом случае он просто выводит первое значение из элементов. Значение, заданное для самой группы, он не хочет брать ни в какую.
Если использовать что-то типа Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Ресурс)", "Группировка")) , то все равно не то - берет данные из элементов, входящих в группу, а это не то, что нужно.
Независимо от того, куда вы едете — это в гору и против ветра!