Имя: Пароль:
1C
1С v8
Подскажите алгоритм
,
0 mzelensky
 
18.06.13
09:07
Доброго всем!

Имею на вхорде таблицу следующего вида:

Номенклатура  Ед.Изм  Эл1_Наимен Эл1_Знач  Эл2_Наимен Эл2_Знач  Эл3_Наимен Эл3_Знач

Где Номенклатура и Ед.Изм - соответствующие справочники.
ЭлХ_Наимен - Справочник "динамические элементы". Заполняется автоматом из "Ед.Изм"
ЭлХ_Знач - числовое значение соответствующего показателя.

Суть в том, что у каждой единицы измерения может быть несколько показателей, которые создает сам пользователь (У каждой единицы измерения количество и состав показателей может быть свой. Максимальное число возможных показателей. В данном случае их 3).
Соответственно возможна такая табличка:

Номенклатура  Ед.Изм  Эл1_Наимен Эл1_Знач  Эл2_Наимен Эл2_Знач  Эл3_Наимен Эл3_Знач


1) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 2
2) Ном2  ЕдИзм1  Длина 4  Ширина 1  количество 2
3) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 8
4) Ном3  ЕдИзм1  Ширина 2 Длина 3   количество 1
5) Ном3  ЕдИзм1  Плотность 2 Вес Нетто 3  количество 1
1 mzelensky
 
18.06.13
09:10
(0) Как видно из таблицы, порядок и состав динамических элементов у разных единиц измерения может быть разнообразным.

Но при этом в строках №1 и №3 находится одинаковая номенклатура. Такие строки я хочу свернуть и в итоге получить вместо двух записей

1) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 2
3) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 8

ОДНУ

1) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 10

Сложность в том, что нужно для каждого параметра задавать агрегатные функции (сумма, среднее, максимум), а затем учитывать все это в запросе...вопрос - как это сделать?!
2 mzelensky
 
18.06.13
09:20
апну
3 echo77
 
18.06.13
09:22
Группируешь по номенклатуре, ЕдИзм, Длине, Ширине
Суммируешь количество.

Не понимаю в чем проблема?
4 Ненавижу 1С
 
гуру
18.06.13
09:25
надо себя заставить
5 mzelensky
 
18.06.13
09:26
(3) вижу, что не понимаешь! Параметры:

Длина 3  Ширина 2  количество 2

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

В данном случае "Длине, Ширине" нужно свернуть, а"количество" просуммировать.

А в случае с

5) Ном3  ЕдИзм1  Плотность 2 Вес Нетто 3  количество 1

Нужно "Плотность " и "Вес Нетто" и "количество" просто сложить.
6 Ненавижу 1С
 
гуру
18.06.13
09:27
(5) плотность складывать нельзя ведь
7 ICWiner
 
18.06.13
09:27
Параметры как задаются и где?
8 Ненавижу 1С
 
гуру
18.06.13
09:27
а вообще смешали вы значения свойств и значения показателей (ресурсов)
9 mzelensky
 
18.06.13
09:28
На данный момент написал процедурку, которая группирует строки во составу параметров, а потом внутри каждой группировки упорядочивает их. Т.е. из таблицы в (0) получаю таблицу:

Группа1
1) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 2
2) Ном2  ЕдИзм1  Длина 4  Ширина 1  количество 2
3) Ном1  ЕдИзм1  Длина 3  Ширина 2  количество 8
4) Ном3  ЕдИзм1  Длина 3  Ширина 2  количество 1

Группа2
5) Ном3  ЕдИзм1  Плотность 2 Вес Нетто 3  количество 1
10 ICWiner
 
18.06.13
09:28
(6) А чей-то нельзя? :) Была в ящике 1 подушка, запихнули еще одну. Плотность, количество и вес нетто удвоился :)
11 mzelensky
 
18.06.13
09:28
(6) Да, согласен - ошибся с примером. нужно Плотность свернуть, а вес и количество суммировать.
12 Ненавижу 1С
 
гуру
18.06.13
09:29
(10) это только если ящики равные
13 Ненавижу 1С
 
гуру
18.06.13
09:29
(11) нужен признак вида свойства, суммируемое или нет
14 mzelensky
 
18.06.13
09:29
(7) параметры создает пользователь в единице измерения, а затем они подтягиваются в табличную часть.
15 mzelensky
 
18.06.13
09:30
(13) Признак такой создать не проблема. Как его потом применить?!

В идеале мне нужна возможность накладывания агрегатной функции на каждый вид группировки, но ведь такой возможности нет!
16 Ненавижу 1С
 
гуру
18.06.13
09:30
Нравится мне mzelensky
Как придумает абстрактного коня в вакууме, диву даешься
17 Ненавижу 1С
 
гуру
18.06.13
09:31
(15) потом динамически строить текст запроса
18 mzelensky
 
18.06.13
09:32
(16) почему абстрактного? Конкретная задача. Какой тут вакуум?
19 mzelensky
 
18.06.13
09:32
(16) ты же кажется любишь загадки/головоломки.
20 mzelensky
 
18.06.13
09:34
(17) тут одним запросом не обойдешься. Получаетс, что в одной колонке запроса могут содержаться данные, требующие разных агрегатных функций. Т.к. на каждую группировку нельзя накладывать свою функцию получается нужно делать (строить) каждый раз новый запрос. И их количество будет равно количество группировок в (9).

Я ток так вижу.
21 ICWiner
 
18.06.13
09:42
В (17) все написано... Если Суммируемое Тогда
Запрос.Текст = Запрос.Текст + "Сумма(" +  Строка(ТвоеСвойство)
Как-то так
22 mzelensky
 
18.06.13
09:48
(21) прочти (20)
23 mzelensky
 
18.06.13
09:50
(22) Получается, что в таблице (9) Элемент 2 в первой группировки это "Ширина" и ему нужно "Среднее", а во второй группировки Элемент 2 это "Вес нетто" и для него нужно "Сумма".
24 Grobik
 
18.06.13
10:03
Напихать нулей в отсутствующие параметры, упорядочить, сделать чего надо (просуммировать, свернуть, найти среднее), нулевые параметры удалить.
25 Ненавижу 1С
 
гуру
18.06.13
10:10
нашел решение, но нужен некий уникальный идентификатор строк, например номер строки
26 mzelensky
 
18.06.13
10:18
(25) Я уже такой использую :)

Поделись, чего придумал.
27 mzelensky
 
18.06.13
10:19
(24) ты всю тему читал или только одну произвольную строку из общего обсуждения?
28 Ненавижу 1С
 
гуру
18.06.13
10:48
(26) надо еще проверить теорию, ща занят немного
29 mzelensky
 
18.06.13
10:48
(25) ну так что? Или эта тайна уйдет вместе с тобой?
30 mzelensky
 
18.06.13
10:49
(28) :(
31 Ювелир
 
18.06.13
11:11
(24) Правильное решение - поддерживаю, полную матрицу делаешь, каждого типа параметр - в свою колонку, а там суммируй ищи среднее или что похлеще.
32 mzelensky
 
18.06.13
11:23
(31) и как же будет выглядеть твоя матрица?!
33 Ненавижу 1С
 
гуру
18.06.13
11:29
Допустим у вида свойства есть атрибут "Агрегация" тип Перечисление ТипыАгрегации: Сумма, Среднее, НеПрименять.

Я взял простой РС ЗначенияСвойств с измерениями НПП (число, для возможности записывать одну номенклатуру несколько раз), Номенклатура
Ресурсы:
Свойство1, Свойство2 – справочник виды свойств
ЗначениеСвойства1, ЗначениеСвойства2 – числа

А вот запрос:

ВЫБРАТЬ
   ЗначенияСвойств.Номенклатура,
   ЗначенияСвойств.Свойство1,
   ВЫБОР
       КОГДА ЗначенияСвойств.Свойство1.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Сумма)
           ТОГДА СУММА(ЗначенияСвойств.ЗначениеСвойства1)
       КОГДА ЗначенияСвойств.Свойство1.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Среднее)
           ТОГДА СРЕДНЕЕ(ЗначенияСвойств.ЗначениеСвойства1)    
       ИНАЧЕ МАКСИМУМ(ЗначенияСвойств.ЗначениеСвойства1)
   КОНЕЦ КАК ЗначениеСвойства1,
   ЗначенияСвойств.Свойство2,
   ВЫБОР
       КОГДА ЗначенияСвойств.Свойство2.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Сумма)
           ТОГДА СУММА(ЗначенияСвойств.ЗначениеСвойства2)
       КОГДА ЗначенияСвойств.Свойство2.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Среднее)
           ТОГДА СРЕДНЕЕ(ЗначенияСвойств.ЗначениеСвойства2)        
       ИНАЧЕ МАКСИМУМ(ЗначенияСвойств.ЗначениеСвойства2)
   КОНЕЦ КАК ЗначениеСвойства2
ИЗ
   РегистрСведений.ЗначенияСвойств КАК ЗначенияСвойств

СГРУППИРОВАТЬ ПО
   ЗначенияСвойств.Номенклатура,
   ЗначенияСвойств.Свойство1,
   ЗначенияСвойств.Свойство2,
   ВЫБОР
       КОГДА ЗначенияСвойств.Свойство1.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.НеИспользовать)
           ТОГДА ЗначенияСвойств.ЗначениеСвойства1
   КОНЕЦ,
   ВЫБОР
       КОГДА ЗначенияСвойств.Свойство2.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.НеИспользовать)
           ТОГДА ЗначенияСвойств.ЗначениеСвойства2
   КОНЕЦ,
   ЗначенияСвойств.Свойство1.ТипАгрегации,
   ЗначенияСвойств.Свойство2.ТипАгрегации
34 Grobik
 
18.06.13
11:36
(32) Ты серьезно? После донулячить и упорядочить так:

1)    Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество2 
2)    Ном2     ЕдИзм1     Длина4     Ширина1     Плотность0    ВесНетто0     количество2 
3)    Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество8 
4)    Ном3     ЕдИзм1    Длина3     Ширина2     Плотность0    ВесНетто0    количество1 
5)    Ном3     ЕдИзм1     Плотность0    ВесНетто0     Плотность2    ВесНетто3     количество1
35 Grobik
 
18.06.13
11:37
Тьху

1)    Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество2 
2)    Ном2     ЕдИзм1     Длина4     Ширина1     Плотность0    ВесНетто0     количество2 
3)    Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество8 
4)    Ном3     ЕдИзм1    Длина3     Ширина2     Плотность0    ВесНетто0    количество1 
5)    Ном3     ЕдИзм1    Длина0     Ширина0     Плотность2    ВесНетто3     количество1
36 Ненавижу 1С
 
гуру
18.06.13
11:38
(34) "донулячить" - надо запомнить
37 mzelensky
 
18.06.13
11:45
(33) 5 сек...дай разобраться
38 Ненавижу 1С
 
гуру
18.06.13
11:46
(37) могу выслать "конфигурацию", написанную на коленки за 10 минут
39 mzelensky
 
18.06.13
11:47
(38) а ты пробовал, так работает? Я просто нечто подобное попытался сделать с

"  ВЫБОР
       КОГДА ЗначенияСвойств.Свойство1.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Сумма)
           ТОГДА СУММА(ЗначенияСвойств.ЗначениеСвойства1)
       КОГДА ЗначенияСвойств.Свойство1.ТипАгрегации = ЗНАЧЕНИЕ(Перечисление.ТипыАгрегации.Среднее)
           ТОГДА СРЕДНЕЕ(ЗначенияСвойств.ЗначениеСвойства1)    
       ИНАЧЕ МАКСИМУМ(ЗначенияСвойств.ЗначениеСвойства1)
   КОНЕЦ КАК ЗначениеСвойства1,
"

Но не допер как сформировать условие в блоке "Сгруппировать"...на эту секцию она у меня ругалась.
40 Ненавижу 1С
 
гуру
18.06.13
11:48
(39) у меня да, я же проверял на живом примере
41 mzelensky
 
18.06.13
11:49
(34) ты не учел, что одни показатели могут быть в разных колонках. Типа такого:

1)     Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество2

2)     Ном2     ЕдИзм1     Ширина1    Длина4  Плотность0    ВесНетто0     количество2
42 mzelensky
 
18.06.13
11:50
(40) сейчас у себя попробую.
43 Ненавижу 1С
 
гуру
18.06.13
11:50
(41) их тоже надо агрегировать? о-О
44 Grobik
 
18.06.13
12:00
(41) Какая буква в слове "упорядочить" не понятна?
45 mzelensky
 
18.06.13
12:00
(44)А как ты упорядочил колонки?
46 mzelensky
 
18.06.13
12:02
(43) я же говорил. Я делал через 2 запроса. Одним формировал группы с одинаковыми наборами параметров (в независимости от их расположения). Затем вторым запросом + доп.обработкой обрабатывал инфу.
47 mzelensky
 
18.06.13
12:03
(43) ведь по сути, если написать вот так:

1)     Ном1     ЕдИзм1     Длина3     Ширина2     Плотность0    ВесНетто0     количество2

2)     Ном1     ЕдИзм1     Ширина1    Длина4  Плотность0    ВесНетто0     количество2

Это будет абсолютно одно и тоже, просто порядок элементов чуток разный. Поэтому нужно расставить параметры в нужном порядке, а потом свернуть.
48 Grobik
 
18.06.13
12:08
Без циклов по строкам такие задачи решаются великим напряжением мозга. Задачу нужно решить или решить красиво?
49 mzelensky
 
18.06.13
12:09
(48) В идеале нужно решить красиво. Если не получается красиво, то хотя бы решить....а потом придумать, как сделать красиво :)
50 mzelensky
 
18.06.13
12:10
(48) + просто количество доп.обработок должно быть минимальным. У меня задача решается, но получается ООООЧЕНЬ безобразно...поэтому и прошу помощи здесь.
51 Grobik
 
18.06.13
12:20
(50) Не понимаю. Если ты вставишь функцию по предварительной подгонке таблички к легкоусвояемому виду — какая разница будет в ней 10 строк или 50? Главное чтобы лишних вычислений не было и читалась хорошо.
52 mzelensky
 
18.06.13
12:29
(51) дело не просто в легкоусвояемом виде, а в алгоритме расчета, который строится на базе данной таблички. Те. это грубо говоря первичка для дальнейшего анализа и расчета.

Сейчас строки уникальны и группирувку я просто не делаю. Но сейчас такая необходимость встала и вот...мучаюсь!
53 mzelensky
 
18.06.13
12:30
(52) А если эту группировку НЕ делать, то могут быть косяки в дальнейшем соединении таблиц, тк. будут строки с абсолютно одинаковыми значениями...ну это так - в кратце.