Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Индексы в Индексированной Таблицы (число прочтений - 8837 )
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Индексы в Индексированной Таблицы
11. Апреля 2007 :: 19:01
Печать  
Подскажите пожалуйста как решить мою задачу с помощью индексов индексированной таблицы.
У меня есть исходная ТЗ, имеющая поля Период, Продукция, СтатьяЗатрат, ЭлементЗатрат, СуммаЗатрат, ПроцентЗатрат.
Эта ТЗ получена из Запроса, поэтому она изначально имеет правильное взаимное расположение вложенности группировок и иерархичности групп и элементов группировки Продукция.
Мне необходимо в печатной форме получить правильное взаимное расположение группировок, но отсортированное по убыванию одно из показателей СуммаЗатрат или ПроцентЗатрат.

Если решать с помощью обычной ТЗ, то я делаю так: создаётся массив таблиц значений ТЗ[КолГруппировок]
Циклом Для счетчик=1 по КолГруппировок заполняется каждая ТЗ[], структура ТЗ - |ВышестоящиеГрупировки|ТекущаяГруппировка|ЗначенияПоказателей.
Если Группировка - справочник с количеством уровней >1 Тогда для этой группировки создаётся массив ТЗС[КоличествоУровнейСправочника] и заполняется Циклом Для счетчик = 1 по КолГруппировок.
Затем все таблицы ТЗ[] и ТЗС[] сортируются по нужному показателю, например "Сумма".
И осуществляется выборка по вложенным циклам начиная с ТЗ[1] с условием равенства в строке ВышестоящихГруппировок. Т.е. для ТЗ[2] это Если ТЗ[2].Группировка1=ТЗ[1].Группировка1, для ТЗ[3] это уже два условия Если (ТЗ[3].Группировка1=ТЗ[1].Группировка1) и (ТЗ[3].Группировка2=ТЗ[2].Группировка2) и т.д. по нарастающей.
Я понимаю что есть более простое и грамотное решение, но сам его найти не могу, как например решить эту задачу с помощью индексированной таблицы? Может нужно прописать ряд индексов и потом наложить по ним фильтр?

  
Наверх
 
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индексы в Индексированной Таблицы
Ответ #1 - 11. Апреля 2007 :: 19:51
Печать  
Код
Выбрать все
Процедура Сформировать()
	......

	Запрос.Выгрузить(тзЗапрос, 0, 0);
	тзЗапрос.Сортировать("-СтатьяЗатрат,-ПроцентЗатрат");

	итЗапрос=СоздатьОбъект("ИндексированнаяТаблица");
	итЗапрос.Загрузить(тзЗапрос);
	ат;ЭлементЗатрат:ЭлементЗатрат", "СуммаЗатрат, ПроцентЗатрат");
КонецПроцедуры
 



попробуй, может поможет.
  
Наверх
wwwICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #2 - 12. Апреля 2007 :: 03:20
Печать  
ИМХО
1) в запросе нужно группировку по группам отключать, т.е. нужно получить плоскую ТЗ, в которой есть только элементы продукции и нет групп.
2) Далее выполнить группировку индекс.таблицы, указав в одном из полей значок &
т.е. типа ИТЗ.Группировать("Продукция:&Продукция,- СтатьяЗатрат;ДругиеКолонки", КолонкиСумм)
При использовании подобной группировки ИТЗ сама разделит все по группам
ЗЫ подробнее смотри в хелпе
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #3 - 12. Апреля 2007 :: 04:32
Печать  
to noprogrammer Не поможет, т.к. твой код сворачивает строки.
to artbear поподробнее описал задачу, в свете этого описания решение такое же?

Грамотнее поставить мой вопрос иначе:
ТРЕБУЕТСЯ
Требуется отчёт сравнение затрат на продукцию по периодам в разрезе видов статей затрат и статей затрат, основная задача сравнение помесячно в течение года по проценту отклонения месячных показателей от средних, минимальных и максимальных затрат за год.
В колонке печатной формы нужен не единичный показатель, а группа показателей вложенных в один, то есть показатель Период, а уже для каждого периода сумма затрат, удельная сумма затрат, отклонение от средней суммы затрат в суммарном и процентном отношении и т.д. Т.е. каждая колонка выглядит так:
                                         Январь
СуммаЗатрат|УдельнаяСуммаЗатрат|ОтклонениеМакс|т.д.| -//- -//-

КАК РЕШАЮ
Выполняю Запрос
Группировка Месяц все;
Группировка Продукция;
Группировка ВидЗатрат;
Группировка Затраты;
 Выгружаю Запрос в ТЗ. Получаю ТЗ с колонками: Месяц, Продукция, ВидЗатрат,Затраты,СуммаЗатрат.
Т.к. в колонках будут даты, а в строках группировки то нужно иметь таблицу свёрнутую по группировкам. Добавляю в ТЗ колонку и заполняю её строкой вида Продукция/ВидЗатрат/Затраты. Выгружаю ТЗ в новую ТЗГ без колонки Месяц. Сворачиваю ТЗГ по строке Продукция/ВидЗатрат/Затраты. Рассчитываю нужные мне показатели (ПроцентОтклоненияОтСреднего, ПроцентОтклоненияОтМаксимального, и т.д.) и заполняю их в обоих таблицах.
Создаю ТЗПериодов, выгружаю в неё колонку Месяц из ТЗ и сворачиваю по месяц.
Т.к. в ТЗ при выгрузке из запроса не попали строки в которых на уровне группировок СуммаЗатрат=0, то есть в ТЗ для конкретной группировки присутствуют строки не для 3-х месяцев, а только для тех в котрых были движения, то запуская цикл по ТЗГ и ТЗПериодов обхожу ТЗ и добавляю в неё строки с СуммаЗатрат=0.

ЧТО ПОЛУЧАЮ
Если бы задача сортировки по возрастанию/убыванию полученных показателей не стояла, то запустив Цикл по ТЗГ с вложенными циклами по ТЗПериодов для вывода столбцов получаю правильную печатную форму таблицы, т.к. в ТЗГ соблюдена структура таблицы запроса, и все строки расположены с соблюдением вложенности группировок запроса и групп и элементов справочника Продукция.
Но мне необходимо чтобы пользователь мог сортировать значения таблицы по выбранному им показателю. Но как при этом соблюсти вывод строк печатной формы с учётом вложенности группировок и вложенности групп и элементов внутри группировки Продукция?
То есть стоит только мне отсортировать ТЗГ по СуммаЗатрат, как всё перепутывается
ВОПРОС
Есть ли метод в индексированной таблице значений, позволяющий отсортировать данные в моём случае. То есть сначала сортировка по убыванию суммового показателя, а затем с учётом вложенности группировок и элементов и групп справочника внутри группировки. То есть этот метод не должен что-либо сворачивать. Т.к. у меня все строки с нужными цифрами, только после сортировки по убыванию суммовго показателя происходит нарушение взаимного расположения группировок.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #4 - 12. Апреля 2007 :: 05:09
Печать  
Сделай как я сказал, и все получится.
ИМХО максимум, что тебе нужно сделать, это правильно расставить остальные группировочные колонки.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #5 - 12. Апреля 2007 :: 06:51
Печать  
to artbear извини за назойливость, надеюсь последнее уточнение, хочу привести конкретный пример.
Получаем индексированную таблицу следующей структуры
Продукция, ВидЗатрат, СтатьяЗатрат, Сумма

Колбасы|||1000
КолбасаКраковская|||1000
КолбасаКраковская| Матер.Затраты||1000
КолбасаКраковская| Матер.Затраты|Мясо|300
КолбасаКраковская| Матер.Затраты|Жир|700

Сосиски|||2800
СосисикиСсыром|||800
СосисикиСсыром| Матер.Затраты||800
СосисикиСсыром| Матер.Затраты|Мясо|800
СосисикиТвёрдые|||2000
СосисикиТвёрдые| Матер.Затраты||2000
СосисикиТвёрдые| Матер.Затраты|Мясо|800
СосисикиТвёрдые| Матер.Затраты|Жир|200

Если я отсортирую по сумме, то получится каша

Сосиски|||2800
СосисикиТвёрдые|||2000
КолбасаКраковская| Матер.Затраты||2000
Колбасы|||1000
КолбасаКраковская|||1000
КолбасаКраковская| Матер.Затраты||1000
СосисикиСсыром|||800
СосисикиСсыром| Матер.Затраты||800
СосисикиСсыром| Матер.Затраты|Мясо|800
и т.д.

Так какой же метод и с какими параметрами использовать чтобы получилась таблица вида

Сосиски|||2800
СосисикиТвёрдые|||2000
СосисикиТвёрдые| Матер.Затраты||2000
СосисикиТвёрдые| Матер.Затраты|Мясо|800
СосисикиТвёрдые| Матер.Затраты|Жир|200
СосисикиСсыром|||800
СосисикиСсыром| Матер.Затраты||800
СосисикиСсыром| Матер.Затраты|Мясо|800
Колбасы|||1000
КолбасаКраковская|||1000
КолбасаКраковская| Матер.Затраты||1000
КолбасаКраковская| Матер.Затраты|Жир|700
КолбасаКраковская| Матер.Затраты|Мясо|300

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


 
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #6 - 12. Апреля 2007 :: 06:55
Печать  
Еще раз изучи внимательно
artbear писал(а) 12. Апреля 2007 :: 03:20:
ИМХО
1) в запросе нужно группировку по группам отключать, т.е. нужно получить ПЛОСКУЮ ИТЗ, в которой есть только элементы продукции и нет групп.
2) Далее выполнить группировку индекс.таблицы, указав в одном из полей значок &
т.е. типа ИТЗ.Группировать("Продукция:&Продукция,- СтатьяЗатрат;ДругиеКолонки", КолонкиСумм)
При использовании подобной группировки ИТЗ сама разделит все по группам
ЗЫ подробнее смотри в хелпе

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #7 - 12. Апреля 2007 :: 06:58
Печать  
Т.е.  тебе нужна таблица после запроса
КолбасаКраковская| Матер.Затраты|Мясо|300
КолбасаКраковская| Матер.Затраты|Жир|700
СосисикиСсыром| Матер.Затраты|Мясо|800
СосисикиТвёрдые| Матер.Затраты|Мясо|800
СосисикиТвёрдые| Матер.Затраты|Жир|200
Т.е. никаких групп, только элементы
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #8 - 13. Апреля 2007 :: 03:45
Печать  
А можно заглянуть в ИТЗ визуально или только выборкой и методом сообщить, я имею ввиду, если выгружать ИТЗ в обычный элемент диалога формы ТЗ, то ИТЗ выгружается "один в один" или же с искажением?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #9 - 13. Апреля 2007 :: 03:48
Печать  
1. Для простой отладки можно использовать ИТЗ.Показать(Индекс="")
2. Выгрузка в обычную таблицу значений проходит, конечно, нормально, с сортировкой и фильтрацией согласно указанному индексу
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #10 - 15. Апреля 2007 :: 17:07
Печать  
Цитата:
1) в запросе нужно группировку по группам отключать, т.е. нужно получить плоскую ТЗ, в которой есть только элементы продукции и нет групп.
2) Далее выполнить группировку индекс.таблицы, указав в одном из полей значок &
т.е. типа ИТЗ.Группировать("Продукция:&Продукция,- СтатьяЗатрат;ДругиеКолонки", КолонкиСумм)
При использовании подобной группировки ИТЗ сама разделит все по группам


Цитата:
Сделай как я сказал, и все получится.
ИМХО максимум, что тебе нужно сделать, это правильно расставить остальные группировочные колонки.


ИТЗ.Группировать("ИндМесяц: Месяц; ИндПродукция: &Продукция; ИндЗатрата: Затрата","СуммаПриход");

Всё сделал как в цитате. Но похоже одной ИТЗ не обойтись. Т.к. непонятно как при такой группировке обходить ИТЗ для получения нужной мне печатной формы, у меня в печатной секции для каждой строки выводится секция "Значение", а к ней присоединяются секции "Период". То есть для вывода строк нужен Цикл по значениям группировки, а для построчного присоединения секций "Период" Цикл по периодам в пределах значения строки. При такой же группировке значения по группировкам Продукция, Затрата спрятаны в тзПотомки и для вывода одной строки мне нужно попасть во все тзПотомки группировки первого уровне по дате Смущённый . Может в данном случае как-то помочь метод УстановитьФильтр?

  
Наверх
 
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #11 - 15. Апреля 2007 :: 17:50
Печать  
+ к тому же мне нужно сортировать строки группировок на каждом уровне в порядке убывания "СуммаПриход" в пределах всего периода отчёта (с декабрь 2006-март 2007), а при такой группировке у меня строки группировок изолированы друг от друга в тзПотомки конкретного периода (например февраль 2007)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексы в Индексированной Таблицы
Ответ #12 - 16. Апреля 2007 :: 05:37
Печать  
ИМХО ты слишком запутал задачу.
Я лично уже не понимаю, что же тебе нужно.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #13 - 16. Апреля 2007 :: 09:45
Печать  
Цитата:
ИМХО ты слишком запутал задачу.
Я лично уже не понимаю, что же тебе нужно.

Извини, похоже я слишком погрузился в частности при описании, и за этими частностями стало не видно общей картины. Если отбросить подробности, то получим.
нужно получить
Печатная форма отчёта должна отображать ряд абсолютных и относительных показателей в разрезе группировок и периодов. Группировки (продукция, вид затрат, статья затрат) выводятся в строках, периоды (год или квартал или месяц или неделя)  выводятся в столбцах. Абсолютные показатели получаем непосредственно из запроса, относительные рассчитываем. То есть чем-то похоже на бухгалтерский отчёт Журнал-ордер по субконто.
что делаю
из запроса с группировкой по, например "Месяц, Продукция, Затрата" получаю плоскую ТЗ.
Создаю две ИТЗ. И выгружаю ТЗ в каждую из них.

Первая ИТЗ_ДляСтрок - это таблица строк печатной формы, то есть в ней нужны показатели за весь период отчёта без детализации по промежуточным периодам. Поэтому в ИТЗ_ДляСтрок удаляю колонку "Месяц" и выполняю ИТЗ.Группировать("ИндПродукция:&Продукция;ИндЗатрата:Затрата;", "КоличествоПриход,СуммаПриход"). Затем рекурсивным обходом ИТЗ_ДляСтрок на каждом уровне группировки добавляю колонки дополнительных рассчитываемых показателей и заполняю их рассчитанными значениями. Затем опять-таки рекурсивным обходом ИТЗ_ДляСтрок на каждом уровне группировки добавляю индекс сортировки по одному из рассчитанных показателей, например ДобавитьИндексСортировки(ИТЗДляСтрок,1,"ИндСуммаУдельная","-СуммаУдельная");
ИТЗ_ДляСтрок готова, т.к. в ней группировки расположены с учётом вложенности друг в друга и с учётом иерархии справочника Продукция и на каждом уровне имеют нужный мне индекс сортировки.
Вторая ИТЗ_ДляКолонок - это таблица значений ячеек, образующихся на пересечении строк-группировок и столбцов-дат. В этой таблице нужна максимальная детализация. Достигаю её атрата;", "КоличествоПриход,СуммаПриход");
Получил ИТЗ_ДляКолонок.

Теперь запуская Цикл по ИТЗ_ДляСтрок я вывожу секцию таблицы "Строка|Показатель" и вложенным циклом по  ИТЗ_ДляКолонок присоединяю секции "Строка|Период"

Вопрос
Не могу соориентироваться как организовать Цикл по ИТЗ_ДляКолонок, ведь для каждой строки отчёта мне нужно получать значения группировки на каждый из периодов, а эти значения находятся в разных тзПотомки, принадлежащих каждая свой строке с датой.
Пробовал "развернуть" древовидную структуру ИТЗ_ДляКолонок путём выгрузки в плоскую ИТЗ, но получается замножение за счёт того, что на каждом уровне группировки в тзПотомки помимо колонок группируемого уровня заполнены значения колонок выше и ниже расположенных уровней.

То есть вопрос в том, как развернуть древовидную ИТЗ, полученную в результате метода Группировать в плоскую, чтобы не было замножения суммовых показателей за счёт присутствия в тзПотомки показателей всех уровней
  
Наверх
 
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: Индексы в Индексированной Таблицы
Ответ #14 - 16. Апреля 2007 :: 15:59
Печать  
Может можно как-то проще получить описанное в нужно получить ? С помощью индексов и фильтров? Кто подскажет?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать