Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

НачатьАвтогруппировкуСтрок() метод ТабличногоДокумента

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

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

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

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

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

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

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

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

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

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

В выборке есть строки содержащие, допустим имяживотного, датарождения, сколько ест, сколько пьет и периодичность(через) сколько его нужно кормить и поить.
Допустим, я хочу знать на следующей неделе в какой день и кого кормить и поить и в каком объеме.
Вот мне нужно перебрать всех животных, а на следующей неделе перебрать каждый день и узнать в какой день кормить/поить какое животное с расчетом от датырождения.
Слегка глупо сформулировано, но это чисто в целях примера))
   lodger
 
36 - 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
ИТОГИ ПО
    ДатаОбслуживания
   mirina313
 
37 - 23.07.19 - 19:36
(36) До вашего уровня мне пока что далеко)
Выглядит все очень сложно


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.