Имя: Пароль:
1C
1С v8
Можно ли сделать так?
,
0 espanol
 
09.10.12
17:43
Вывожу в виде иерархии данные в отчет.

Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    НАЧАЛОПЕРИОДА(УРВ_СостояниеРабот.Период, ДЕНЬ) КАК Период,
   |    УРВ_СостояниеРабот.РабочееМесто КАК РабочееМесто,
   |    УРВ_СостояниеРабот.Сотрудник КАК Сотрудник,
   |    УРВ_СостояниеРабот.ПакетРабот КАК ПакетРабот,
   |    УРВ_СостояниеРабот.Статус КАК Статус,
   |    УРВ_СостояниеРабот.Период КАК ВремяНачала
   |ИЗ
   |    РегистрСведений.УРВ_СостояниеРабот КАК УРВ_СостояниеРабот
   |ГДЕ
   |    (УРВ_СостояниеРабот.Период МЕЖДУ &ДатаНачала И &ДатаОкончания)
   |    И (НЕ УРВ_СостояниеРабот.Статус = ЗНАЧЕНИЕ(Перечисление.УРВ_СтатусыРабот.Запланировано))
   |
   |СГРУППИРОВАТЬ ПО
   |    УРВ_СостояниеРабот.РабочееМесто,
   |    УРВ_СостояниеРабот.Сотрудник,
   |    УРВ_СостояниеРабот.ПакетРабот,
   |    НАЧАЛОПЕРИОДА(УРВ_СостояниеРабот.Период, ДЕНЬ),
   |    УРВ_СостояниеРабот.Период,
   |    УРВ_СостояниеРабот.Статус
   |
   |УПОРЯДОЧИТЬ ПО
   |    Период,
   |    РабочееМесто,
   |    Сотрудник,
   |    ПакетРабот,
   |    ВремяНачала,
   |    Статус
   |ИТОГИ ПО
   |    Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаОкончания),
   |    РабочееМесто,
   |    Сотрудник,
   |    ПакетРабот";
   Запрос.УстановитьПараметр("ДатаНачала",    НачалоДня(ЭлементыФормы.ДатаНачала.Значение));
   Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ЭлементыФормы.ДатаОкончания.Значение));
   Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   
   ТабличныйДокумент.НачатьАвтогруппировкуСтрок();
   Для Каждого СтрПУ Из Результат.Строки Цикл
       ОбластьСтрока.Параметры.Заполнить(СтрПУ);
       ОбластьСтрока.Параметры.ВремяПростоя = "";
       ОбластьСтрока.Параметры.ВремяРаботы  = "";
       ОбластьСтрока.Параметры.Период = Формат(СтрПУ.Период, "ДФ=dd.MM.yyyy");
       ТабличныйДокумент.Вывести(ОбластьСтрока, 1);
       Для Каждого СтрВУ Из СтрПУ.Строки Цикл
           ОбластьСтрока.Параметры.Заполнить(СтрВУ);
           ОбластьСтрока.Параметры.ВремяПростоя = "";
           ОбластьСтрока.Параметры.ВремяРаботы  = "";
           ОбластьСтрока.Параметры.Период = Формат(СтрВУ.Период, "ДФ=dd.MM.yyyy");
           ТабличныйДокумент.Вывести(ОбластьСтрока, 2);
           Для Каждого СтрТУ Из СтрВУ.Строки Цикл
               ОбластьСтрока.Параметры.Заполнить(СтрТУ);
               ОбластьСтрока.Параметры.ВремяПростоя = "";
               ОбластьСтрока.Параметры.ВремяРаботы  = "";
               ОбластьСтрока.Параметры.Период = Формат(СтрТУ.Период, "ДФ=dd.MM.yyyy");
               ТабличныйДокумент.Вывести(ОбластьСтрока, 3);
               Для Каждого СтрЧУ Из СтрТУ.Строки Цикл
                   ОбластьСтрока.Параметры.Заполнить(СтрЧУ);
                   ОбластьСтрока.Параметры.ВремяПростоя = "";
                   ОбластьСтрока.Параметры.ВремяРаботы  = "";
                   ОбластьСтрока.Параметры.Период     = Формат(СтрЧУ.Период, "ДФ=dd.MM.yyyy");
                   ОбластьСтрока.Параметры.ПакетРабот = СокрЛП(СтрЧУ.ПакетРабот.Номер);
                   ТабличныйДокумент.Вывести(ОбластьСтрока, 4);
                   
                   Таблица = Новый ТаблицаЗначений;
                   Таблица.Колонки.Добавить("Период");
                   Таблица.Колонки.Добавить("РабочееМесто");
                   Таблица.Колонки.Добавить("Сотрудник");
                   Таблица.Колонки.Добавить("ПакетРабот");
                   Таблица.Колонки.Добавить("Статус");
                   Таблица.Колонки.Добавить("ВремяНачала");
                   Таблица.Колонки.Добавить("ВремяРаботы");
                   Таблица.Колонки.Добавить("ВремяПростоя");
                   Таблица.Колонки.Добавить("ВремяПроцесса");
                   Таблица.Колонки.Добавить("ТПростоя");
                   Таблица.Колонки.Добавить("ТРаботы");
                   Для Каждого СтрПтУ Из СтрЧУ.Строки Цикл
                       СтрТабл = Таблица.Добавить();
                       ЗаполнитьЗначенияСвойств(СтрТабл, СтрПтУ);
                       СтрТабл.Период      = Формат(СтрПтУ.Период, "ДФ=dd.MM.yyyy");
                       СтрТабл.ПакетРабот  = СокрЛП(СтрПтУ.ПакетРабот.Номер);
                       СтрТабл.ВремяНачала = СтрПтУ.ВремяНачала;
                   КонецЦикла;
                   
                   ВычислитьВремя(ТабличныйДокумент, ОбластьСтрока, Таблица);
                   
               КонецЦикла;
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
   ТабличныйДокумент.ЗакончитьАвтогруппировкуСтрок();
   ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(3);


Дело в следующем, запросом выгрузить данные в том виде, что необходимо выводить в отчет невозможно!
Поэтому приходится на последнем уровне делать сложный расчет и выводить эти данные.
Но еще требуется для каждого более высокого уровня выводить итоги... как это сделать, коли по они уже выведены в табличный документ?
1 DrShad
 
09.10.12
17:44
[Дело в следующем, запросом выгрузить данные в том виде, что необходимо выводить в отчет невозможно! ] и ты это утверждаешь с таким кодом!?
2 and2
 
09.10.12
17:46
чем тебе код не нравится?

автор, сейчас зовем Печонкина.
он от 100 тыщ дает
3 espanol
 
09.10.12
17:46
(1) да, а ты видимо решил начать строить из себя гуру, мол код не нравится?
как меня замучили такие выпендрежники, этот код только разрабатывается и еще будет оптимизироваться
4 Rovan
 
гуру
09.10.12
17:46
(0) не знаешь как время в Запросе вычислять ?
5 espanol
 
09.10.12
17:48
(4) знаю, а ты задачу знаешь или тоже строить из себя решил бога адинасса?
6 aleks-id
 
09.10.12
17:48
а на СКД не судьба сделать?
7 DrShad
 
09.10.12
17:48
(3) [Запрос.УстановитьПараметр("ДатаНачала",    НачалоДня(ЭлементыФормы.ДатаНачала.Значение));]

одно это уже сильно радует, да и о невозможности ты первый начал, так что расслабься и получай удовольствие
8 espanol
 
09.10.12
17:48
(6) не судьба
9 espanol
 
09.10.12
17:50
Как всегда все свелось к тому что никто не знает решения или строит из себя гуру... но никто не хочет помогать.... форум катится к чертям ))
10 espanol
 
09.10.12
17:53
(7) лять, у нас че конкурс на самый правильный код что ли?!
11 DrShad
 
09.10.12
17:53
(9) ты бы задачу озвучил, а гадать по твоему коду что должно получиться - все равно что на кофейной гуще
12 Deon
 
09.10.12
17:57
(10) Перевожу: "Твой вопрос непонятен, перефразируй"
13 Classic
 
09.10.12
18:04
(0)
Грузи в ТЗ и обратно в запрос
14 espanol
 
09.10.12
18:06
(12) ну попробую.

когда выводим данные в отче в виде иерархии, как известно мы сперва заполняем и выводим в табличный документ, 1 уровень, потом 2 уровень и т.д.

но иногда возникают довольно сложные расчеты, которые невозможно сделать при помощи запроса (если бы запрос позволял делать все, то все только запросами бы и составляли, просто код был бы не нужен).

В моем случае тоже сложный расчет, на самом последнем уровне я получаю данные, делаю расчет и вывожу все это в нижний уровень.

но, мне также нужны итоги по всем уровням, которые будут отталкиваться от того расчета который был проведен на нижнем уровне.

У меня канечно есть идея, забабахать одну ТЗ адскую и уже при помощи нее вывод делать, но можно ли обойтись и без нее?
15 Classic
 
09.10.12
18:08
(14)
Вариант с ТЗ самый правильный. Как минимум потому, что у тебя данные расчета на верхнем уровне будут валяться где-то еще. И в случае чего к ним можно будет обратиться.
16 pumbaEO
 
09.10.12
18:08
Ну а теперь включаем логику:
необходимые данные есть на самом нижнем уровне, когда рассчитывается верхний уровень данных еще нет.
17 DrShad
 
09.10.12
18:09
(14) с использованием пакетника можно хоть сто раз вниз вперед бегать и считать
18 DrShad
 
09.10.12
18:09
(15) самый древний вариант - наука ушла далеко вперед
19 espanol
 
09.10.12
18:13
(17) что ты имеешь ввиду под пакетником?
20 DrShad
 
09.10.12
18:15
(19) использовать временные таблицы в запросе
21 espanol
 
09.10.12
18:16
(20) ну он мне тут скорее всего не поможет
22 Classic
 
09.10.12
18:16
(18)
И что ты в пакетник засунешь?
23 DrShad
 
09.10.12
18:18
(22) да все что угодно - у меня у одного клиента пакетником премия считается сотрудникам, а в расчете 43 нелинейных показателя
24 pumbaEO
 
09.10.12
18:19
(22) ну в теории соединить по  УРВ_СостояниеРабот.Период < УРВ_СостояниеРаботСледующиее.Период и сгрупировать по времени окончания мин...

Но что у ему за расчеты нужны, пока не понятно.
25 Classic
 
09.10.12
18:20
Ты где рассчитанные данные по верхним уровням хранить будешь?
Вопрос ведь не в "считается", а в "выводится"
26 Classic
 
09.10.12
18:21
(24)
Та фиг его знает, что делает та процедура, почему это процедура, а не функция, но "маемо шо маемо"
27 pumbaEO
 
09.10.12
18:24
(26) насколько понимаю

                   Таблица.Колонки.Добавить("ВремяРаботы");
                   Таблица.Колонки.Добавить("ВремяПростоя");
                   Таблица.Колонки.Добавить("ВремяПроцесса");
                   Таблица.Колонки.Добавить("ТПростоя");
                   Таблица.Колонки.Добавить("ТРаботы");

А вообще, (0) ТС - дешево и сердито до определенного момента: результат запроса в выгрузить в дерево значений посчитать нижнее уровни, рекурсией пройтись наверх и потом только делать вывод отчет.
28 espanol
 
09.10.12
18:26
ну запрос только вытаскивает данные, а мне еще нужно их добавлять в зависимости от выполнения или не выполнения условий...

там еще идет просмотр по статусам если в верхней строке такой то статус а в нижней такой то то высчитать такое то время, если там что-то еще то это время будет или простоем или работой и т.п...

и т.п...
29 espanol
 
09.10.12
18:27
(27) я так и думал сделать
30 Classic
 
09.10.12
18:27
(28)
Самая общая идея - сначала все посчитать, а потом уже выводить
31 pumbaEO
 
09.10.12
18:28
(28) Выбор когда

Смотри какая несправедливость в запросах есть Case, а в языке 1С нет, приходится ИначеЕсли пользоваться.
Основная теорема систематики: Новые системы плодят новые проблемы.