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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Вопрос по Индексированной таблице
22. Июня 2010 :: 12:36
Печать  
Добрый день, не нашел в какой раздел разместить, сорри если не в тот.

После прямого запроса получил ТЗ, перегружаю ее в ИндексированнуюТаблицу и группирую ее:

ТаблицаОстатков.Группировать("Номенклатура:*Номенклатура; Склад:*Склад; Фирма:*Фирма; ЦенаПрод:*ЦенаПрод; Сотрудник:*Сотрудник","СуммаКоличествоОстаток");

Теперь мне нужно по различным переданным параметрам получить значения узлов для складов,  фирм, цен и сотрудников

т.е. сколько Номенклатуры на:
Фирма1 = ***
Фирма2 = ***
Фирма1 и Склад1 = ***
Фирма1 и Склад2 = ***
Фирма2 и Склад1 = ***
Фирма2 и Склад2 = ***
Склад1 = ***

я делаю
КоличествоОстаток = ТЗ.ИтогПоУзлу("СуммаКоличествоОстаток","Номенклатура");
и получаю сколько всего Номенклатуры везде, а как теперь сразу получить ИтогПоУзлу по фирмам, миную тзПотомки склада или по Сотрудникам, миную всех потомков до него?
Если перегружать в другие ИндексированныеТаблицы, то получается медленно.

т.е. я вызываю функцию,
ПолучитьОстаток(Номенклатура,,,,Сотрудник);
или
ПолучитьОстаток(Номенклатура,Фирма,,Цена,);
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #1 - 22. Июня 2010 :: 12:45
Печать  
А зачем группировать для этого? Не проще сделать 2 индекса:
1) *Номенклатура,*Сотрудник;
2) *Номенклатура,*Фирма,*Цена
и получать через НайтиСтроку ИтогПоУзлу как это описано в документации?
Зачем группировать?
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #2 - 22. Июня 2010 :: 13:03
Печать  
leshik писал(а) 22. Июня 2010 :: 12:45:
А зачем группировать для этого? Не проще сделать 2 индекса:
1) *Номенклатура,*Сотрудник;
2) *Номенклатура,*Фирма,*Цена
и получать через НайтиСтроку ИтогПоУзлу как это описано в документации?
Зачем группировать?


ну мне не только 2 надо, что, для всех вариантов индексы делать?
мне нужно получить остатки номенклатуры по
фирме,
складу,
цене,
сотруднику, далее по
фирме и складу,
фирме и цене,
фирме и сотруднику, далее по
складу и цене
складу и сотруднику и в таком духе перебрать все варианты, т.е. возможность получать значения в любом из мыслимых разрезов.

зачем группировать? ну можно не группировать а как-то применить фильтр к ИндексированнойТаблице по переданным (непустым) полям. но тогда нужно будет очень много раз фильтровать таблицу, что вроде как нехорошо скажется на производительности.
Изменено:
ну и группировка разве не предназначена для получения итогов по группируемым значениям?

  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по Индексированной таблице
Ответ #3 - 22. Июня 2010 :: 13:17
Печать  
Цитата:
После прямого запроса получил ТЗ, перегружаю ее в ИндексированнуюТаблицу

Зачем ? Выгружай запрос сразу в индексированнуюТЗ
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #4 - 22. Июня 2010 :: 14:00
Печать  
Я бы тоже создал все возможные индексы и далее получал бы остаток по отфильтрованной ИТЗ. На производительности это почти не скажется. И я уверен, что это будет быстрее чем та группировка, которую придумал ты.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #5 - 23. Июня 2010 :: 08:17
Печать  
ок, добавляю индексы, правильно?


удник",1);
ТаблицаОстатков.ДобавитьИндекс("и2","*Номенклатура,*Фирма,*Склад,*ЦенаПрод",1);
ТаблицаОстатков.ДобавитьИндекс("и3","*Номенклатура,*Фирма,*Склад",1);
ТаблицаОстатков.ДобавитьИндекс("и4","*Номенклатура,*Фирма",1);
ТаблицаОстатков.ДобавитьИндекс("и5","*Номенклатура",1);
ТаблицаОстатков.ДобавитьИндекс("и6","*Номенклатура,*Склад",1);
1);
ТаблицаОстатков.ДобавитьИндекс("и8","*Номенклатура,*Склад,*Сотрудник",1);


и как теперь найти значение Номенклатура = ном1 и Фирма = фирм1 и Склад = склад1
что-то типа

ТаблицаОстатков.НайтиСтроку("Номенклатура", Ном1, 0, 1);
ТаблицаОстатков.НайтиСтроку("Фирма", Фирм1, 0, 1);
ТаблицаОстатков.НайтиСтроку("Склад", Склад1, 0, 1);

Сум = ТаблицаОстатков.ИтогПоУзлу("Сумма", "Склад"); ???????


или вообще бред?
  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #6 - 23. Июня 2010 :: 08:22
Печать  
понял, бред написал, разобрался вроде
нужно список значений использовать
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #7 - 23. Июня 2010 :: 08:29
Печать  
Не надо делать индекс уникальным! В таком случае он будет находить только одну запись по указанному фильтру.
Я бы сделал примерно так:
Код
Выбрать все
индНомФимСкл="*Номенклатура,*Фирма,*Склад";
ТаблицаОстатков.ДобавитьИндекс(индНомФимСкл,индНомФимСкл);
//добавляешь остальные индексы аналогично

Ключ = СоздатьОбъектСписокЗначений");
Ключ.ДобавитьЗначение(ном1);
Ключ.ДобавитьЗначение(фирм1);
Ключ.ДобавитьЗначение(склад1);

ТаблицаОстатков.УстановитьФильтр(Ключ, Ключ, индНомФимСкл);
СуммаИтого = ТаблицаОстатков.Итог("Сумма", индНомФимСкл);
 


Только не забывай очищать "Ключ" перед добавлением новых значений.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #8 - 23. Июня 2010 :: 08:33
Печать  
JohnyDeath
спасибо Улыбка
  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #9 - 23. Июня 2010 :: 09:07
Печать  
после применения
ТаблицаОстатков.УстановитьФильтр(Ключ, Ключ, индНомФимСкл);

таблица все равно получается не отфильтрована, (смотрю по ВыбратьСтроку())

и СуммаИтого = ТаблицаОстатков.Итог("Сумма", индНомФимСкл); возвращает 0, хотя в Ключе переданы значения, которые точно есть в таблице.

Почему такое может быть?
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #10 - 23. Июня 2010 :: 09:09
Печать  
Потому что надо использовать НайтиСтроку и ИтогПоУзлу.
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #11 - 23. Июня 2010 :: 09:13
Печать  
MaxPiter писал(а) 23. Июня 2010 :: 09:07:
после применения
ТаблицаОстатков.УстановитьФильтр(Ключ, Ключ, индНомФимСкл);

таблица все равно получается не отфильтрована, (смотрю по ВыбратьСтроку())

Так у тебя всегда будет показывать ВСЮ таблицу. Чтобы просмотреть таблицу по индексу делай так:
Код
Выбрать все
ТаблицаОстатков.Показать(индНомФимСкл); 

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #12 - 23. Июня 2010 :: 09:14
Печать  
leshik писал(а) 23. Июня 2010 :: 09:09:
Потому что надо использовать НайтиСтроку и ИтогПоУзлу.

Хочешь сказать, что мой вариант не катит? Я примерно так всю свою сознательную жизнь делал.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #13 - 23. Июня 2010 :: 09:25
Печать  
JohnyDeath писал(а) 23. Июня 2010 :: 09:14:
leshik писал(а) 23. Июня 2010 :: 09:09:
Потому что надо использовать НайтиСтроку и ИтогПоУзлу.

Хочешь сказать, что мой вариант не катит? Я примерно так всю свою сознательную жизнь делал.

Прости не прочитал выше и не увидел твой вариант. Конечно же катит.
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #14 - 23. Июня 2010 :: 09:27
Печать  
и с фильтром и с НайтиСтроку результат все равно 0...

как у меня написано, до буквы

и1 = "*Номенклатура,*Фирма,*Склад,*Сотрудник";
и2 = "*Номенклатура,*Фирма,*Склад";
ТаблицаОстатков.ДобавитьИндекс(и1,и1);
ТаблицаОстатков.ДобавитьИндекс(и2,и2);


СпЗн.УдалитьВсе();
СпЗн.ДобавитьЗначение(ТекФирма);
СпЗн.ДобавитьЗначение(ТекНоменклатура);
СпЗн.ДобавитьЗначение(Склад);
СпЗн.ДобавитьЗначение(ПоСотруднику);


Остаток = ПолучитьОстатокИзТЗ(ТаблицаОстатков,СпЗн,и1) ;

Функция ПолучитьОстатокИзТЗ(ТаблицаОстатков,СпЗн,ИндексИ) //вариант с фильтром
     ТаблЗН.УстановитьФильтр(СпЗн, СпЗн, ИндексИ);
     КоличествоОстаток = ТаблЗН.Итог("СуммаКоличествоОстаток", ИндексИ);
     ТаблЗН.ВыключитьФильтр(ИндексИ);
     Возврат(КоличествоОстаток);

КонецФункции

Функция ПолучитьОстатокИзТЗ(ТаблицаОстатков,СпЗн,ИндексИ) //вариант с найтистроку
     ТаблЗН.НайтиСтроку(ИндексИ,СпЗн);
     КоличествоОстаток = ТаблЗН.ИтогПоУзлу("СуммаКоличествоОстаток", ИндексИ);
     Возврат(КоличествоОстаток);

КонецФункции

в любом случае всегда пусто, где косяк?

  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать