Имя: Пароль:
1C
1С v8
НачатьАвтогруппировкуСтрок() метод ТабличногоДокумента
,
0 mirina313
 
22.07.19
14:43
Скажите, пожалуйста. Почему не получается сгруппировать строки?
Тип значения параметра группировки "Дата".
    ТабДок.НачатьАвтогруппировкуСтрок();
    Для каждого Строка Из ТЗ Цикл
        ОбластьЗаголовок.Параметры.Период = Строка.Период;
        ТабДок.Вывести(ОбластьЗаголовок, 1);
        
        ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Строка);    
        ТабДок.Вывести(ОбластьСтрока, 2);
    КонецЦикла;    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
1 Greeen
 
22.07.19
14:47
1) Плюсики группировки есть в табличном документе?
2) В отчет выведены данные?
2 mirina313
 
22.07.19
14:49
(1) Плюсиков нет, данные выведены без изменения.
Может проблема в том, что параметры разбиты на две области?
3 lodger
 
22.07.19
14:49
попробуй выводить не 1\2, а 0\1
4 mirina313
 
22.07.19
14:56
(1) (3) Есть плюсики и вывод данных, но данные не сгруппированы по ОбластьЗаголовок
5 ДенисЧ
 
22.07.19
14:57
А если попробовать НачатьГруппуСтрок() ?
6 lodger
 
22.07.19
14:57
нулевой уровень не группируется. выведи 0 перед циклом.
7 mirina313
 
22.07.19
15:21
В общем, чтобы была понятна картина
https://ibb.co/NKddvy7
Нужно чтобы по "одинаковым" датам срабатывала группировка, а она не срабатывает
8 lodger
 
22.07.19
15:22
(7) так работает же. 1 дата - 1 группа.
9 lodger
 
22.07.19
15:23
или делай
вывести уровень 1
вывести уровень 2
вывести уровень 2
вывести уровень 2
вывести уровень 1
вывести уровень 2
вывести уровень 2
10 mirina313
 
22.07.19
15:23
(8) ну после 31 числа идет 1 дата еще раз, но с другими данными
11 lodger
 
22.07.19
15:24
(10) ну так это правильно. 1 июля <> 1 августа. структуру данных поменяй, используй ДеньМесяца() обходи группы по этим дням.
12 mirina313
 
22.07.19
15:26
(11) Имею ввиду идет еще раз 1 августа
13 mirina313
 
22.07.19
15:27
(11) Просто мне построчно вывалил как в исходнике и все, без группировки
14 mirina313
 
22.07.19
15:36
(11) А я хочу чтобы, если дата1 = дата2, допустим 1августа и еще раз "выводится" 1августа.

В этом случае, происходит склейка дат (1 уровня), становится одна запись 1августа,
а строка которая идет на (2 уровне), под дата2 (1августа) попадает в подчинение к этой склейке...
15 pasha_d
 
22.07.19
15:48
Может я чего не догоняю, синтаксис не проверял - но как-то так может быть?

ТабДок.НачатьАвтогруппировкуСтрок();
ТЗ_Периоды = ТЗ.Скопировать();
ТЗ_Периоды.Свернуть("Период");
ТЗ_Периоды.Сортировать("Период");
Для каждого Строка Из ТЗ_Периоды Цикл
    ОбластьЗаголовок.Параметры.Период = Строка.Период;
    ТабДок.Вывести(ОбластьЗаголовок, 1);
    ТаблицаСтроки = ТЗ.Скопировать(ТЗ.НайтиСтроки(Новый Структура("Период", Строка.Период)));
    Для каждого СтрокаТаблицы Из ТаблицаСтроки Цикл    
        ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, СтрокаТаблицы);    
        ТабДок.Вывести(ОбластьСтрока, 2);
    КонецЦикла;
КонецЦикла;    
ТабДок.ЗакончитьАвтогруппировкуСтрок();
16 mirina313
 
22.07.19
15:56
(15) Если свернуть периоды, то данные других колонок исчезнут.
Структура ТЗ такая:

Период1,значение1,значение2,значение3

Период2,значение1,значение2,значение3

И, если склеить период1 и период2, то значения период1 и период2 исчезнут, т.к. это не числа, верно ведь?

И это не сработает, так как данных нет, чтобы копировать. Только склейка периодов.
ТаблицаСтроки = ТЗ.Скопировать(ТЗ.НайтиСтроки(Новый Структура("Период", Строка.Период)));
17 mirina313
 
22.07.19
16:01
А я хочу чтобы в случае Период1 = Период2

Период1,значение1,значение2,значение3
Период2,значение1,значение2,значение3  

Происходило следующее

Период1+Период2,
Значение1,значение2,значение3
значение1,значение2,значение3
18 pasha_d
 
22.07.19
16:18
Тип значения у колонки "Период" какой?
19 mirina313
 
22.07.19
16:26
(18) Сработало по вашему алгоритму, спасибо!
Но, хотелось бы как-то проще поступить
20 lodger
 
22.07.19
16:35
(19) какая вводная - такое решение.
можно подняться на шаг выше по коду и ТЗ сменить на выборку с итогами по периоду.
21 lodger
 
22.07.19
16:36
или отсортировать существующую ТЗ по периоду (без свертвывания), потом "Вывести(ОбластьЗаголовок" только если период сменился относительно предыдущего. но это еще более "грязный код".
22 mirina313
 
22.07.19
17:05
(20) Можно во временную таблицу, я же могу ВТ передать как объект в СКД?
23 dezss
 
22.07.19
17:19
(21) Почему "грязный"?
24 pasha_d
 
22.07.19
17:28
(22) изначально-то откуда ТЗ формируется у вас?
25 mirina313
 
23.07.19
09:50
(24) Берутся данные из выборки, на каждом шаге итерации проверяется строка выборки на определенное условие, и если определенное условие = истина,
тогда добавляется строка в ТЗ, если нет- то следующая пропуск.
26 pasha_d
 
23.07.19
10:07
то есть не из запроса?
27 mirina313
 
23.07.19
10:12
(26) Ну как сказать, запрос то есть. Но данные не напрямую из запроса берутся, а через выборку(обход всех строк запроса) проверяются на условия, и только в случае истины условия добавляются в ТЗ
28 mirina313
 
23.07.19
10:13
(26) И эти условия могут изменятся динамически
29 pasha_d
 
23.07.19
10:54
есть ощущение что ваш функционал можно легко реализовать на СКД.
30 mirina313
 
23.07.19
11:01
(29) Ну так, у меня берутся данные из выборки > проверяются на условия > помещаются в ТЗ, а ТЗ передается в СКД как внешний объект.
31 lodger
 
23.07.19
12:42
(30) лишь бы запрос не писать...
32 mirina313
 
23.07.19
14:25
(31) А как написать такой запрос?
Запрос > Выборка > В каждой строке есть данные периодичности(разные) > Каждую строку проверить на кратность каждому дню из определенного периода, по этим данным периодичности > В случае кратности строку из выборки вывести в результат запроса
Это не возможно реализовать одним запросом в СКД
33 lodger
 
23.07.19
15:12
(32) смотря что значит "кратность каждому дню".
обычно условие можно формализовать, упростить и привести к работающему в запросе виду.
34 pasha_d
 
23.07.19
15:13
(33) я тоже думаю, что проще 1 грамотный запрос нарисовать..
35 mirina313
 
23.07.19
15:55
(33) Ну выборка из регистра и в ней цикл по дням, а эти дни берут из периода который указываю я.

В выборке есть строки содержащие, допустим имяживотного, датарождения, сколько ест, сколько пьет и периодичность(через) сколько его нужно кормить и поить.
Допустим, я хочу знать на следующей неделе в какой день и кого кормить и поить и в каком объеме.
Вот мне нужно перебрать всех животных, а на следующей неделе перебрать каждый день и узнать в какой день кормить/поить какое животное с расчетом от датырождения.
Слегка глупо сформулировано, но это чисто в целях примера))
36 lodger
 
23.07.19
17:59
(35) это решаемо в пределах запроса через фокусы вроде генерации цифр и чисел, а уже от них переходить к датам.
вот попробуй такое упражнение для консоли запросов:

параметры:
ДатаСтарта1 12.06.2019  0:00:00
ДатаСтарта2 15.06.2019  0:00:00

Периодичность1 2
Периодичность2 3

ПериодОтбор1 01.07.2019  0:00:00
ПериодОтбор2 31.07.2019 23:59:59

текст запроса

ВЫБРАТЬ 0 КАК Цифра
ПОМЕСТИТЬ Цифры
ОБЪЕДИНИТЬ ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВЫБРАТЬ 9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Десятки.Цифра * 10 + Единицы.Цифра КАК Дней,
    ВЫБОР
        КОГДА (ВЫРАЗИТЬ((Десятки.Цифра * 10 + Единицы.Цифра) / 2 КАК ЧИСЛО(3, 0))) = (Десятки.Цифра * 10 + Единицы.Цифра) / 2
            ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК кратно2,
    ВЫБОР
        КОГДА (ВЫРАЗИТЬ((Десятки.Цифра * 10 + Единицы.Цифра) / 3 КАК ЧИСЛО(3, 0))) = (Десятки.Цифра * 10 + Единицы.Цифра) / 3
            ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК кратно3,
    ВЫБОР
        КОГДА (ВЫРАЗИТЬ((Десятки.Цифра * 10 + Единицы.Цифра) / 4 КАК ЧИСЛО(3, 0))) = (Десятки.Цифра * 10 + Единицы.Цифра) / 4
            ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК кратно4
ПОМЕСТИТЬ кратные
ИЗ
    Цифры КАК Десятки, Цифры КАК Единицы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ &ДатаСтарта1, &Периодичность1
ПОМЕСТИТЬ Вводная
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ &ДатаСтарта2, &Периодичность2
;

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Вводная.ДатаСтарта1,
    Вводная.Периодичность1,
    ВЫБОР
        КОГДА Вводная.Периодичность1 = 3
                И кратные.кратно3
            ТОГДА ДОБАВИТЬКДАТЕ(Вводная.ДатаСтарта1, ДЕНЬ, кратные.Дней)
        ИНАЧЕ Вводная.ДатаСтарта1
    КОНЕЦ
ИЗ
    Вводная КАК Вводная
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ кратные КАК кратные
        ПО (Вводная.Периодичность1 = 3)
            И (кратные.кратно3)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОтСтартаПлюс.ДатаОбслуживания КАК ДатаОбслуживания,
    ОтСтартаПлюс.ДатаСтарта1 КАК ДатаСтарта1,
    ОтСтартаПлюс.Периодичность1
ИЗ
    ОтСтартаПлюс КАК ОтСтартаПлюс
ГДЕ
    ОтСтартаПлюс.ДатаОбслуживания МЕЖДУ &ПериодОтбор1 И &ПериодОтбор2

УПОРЯДОЧИТЬ ПО
    ДатаОбслуживания,
    ДатаСтарта1
ИТОГИ ПО
    ДатаОбслуживания
37 mirina313
 
23.07.19
19:36
(36) До вашего уровня мне пока что далеко)
Выглядит все очень сложно
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.