Имя: Пароль:
1C
1С v8
Остатки в ТЗ и фильтр по остаткам
0 ХочуСпец
 
07.12.12
09:29
Задача: вывести пользователю в табличное поле данные по запасам товаров в разрезе складов. А также дать возможность фильтровать данные по остаткам. Строки: номенклатура. Колонки: Склады. Фильтры: н-р, для для склада СКЛАД1 остаток > 10, для склада СКЛАД2 остаток < 100 и т.д.
Задачу решил так: Запросом в ТЗ вывожу остатки номенклатуры. Выборкой дополняю остатками по складам (колонки). Используя построитель фильтрую данные по остаткам.
Проблема: не устраивает скорость работы.
Получать остатки при получении данных не вариант, фильтровать необходимо по все ТЗ, а не только по видимой части.
Может использовать СКД. В настройка добавить таблицу. Для строк – указать группировку Номенклатура, колонки – Склады. Ресурс – Остаток. Но как потом выгрузить все это в коллекцию значений, ведь по сути это кросс таблица.
1 hhhh
 
07.12.12
09:33
(0) ну возьмите в УТ 10.3 рабочее место менеджера продаж. Там классно всё показывает. И в разрезе складов.
2 Рэйв
 
07.12.12
09:35
Сделай отдельную форму с табличной частью. Заполняй таб часть остатками.  Потом легкл фильтруется по любой клонке, в том числе и по остатку.
Минус один -  остатки будут не динамическими, надо будет обновлять в случае чего...Ну так у тебя и тормозит все именно из-за динамики
3 kotletka
 
07.12.12
09:36
спрашивать про быстродейсвтие при этом непривести код и замеры производительности  = "поди туда, незнаю куда" может у тебя все верно, но запрос написан через опу и выполняется 50% времени
4 ХочуСпец
 
07.12.12
09:36
(2) так и делаю
5 ХочуСпец
 
07.12.12
09:36
(3) причем тут код. Запрос простейший. Нужна идея
6 ХочуСпец
 
07.12.12
09:37
(3) запрос выполняется быстро. Основное время занимает выборка из запроса (заполнение остатков по колонкам)
7 kotletka
 
07.12.12
09:37
(5)твоя идея впринципе верна и тормозить сильно не должно. я говорю про то что может у тебя может тормозит не алгоритм, а реализация
8 Maxus43
 
07.12.12
09:38
а отчеты юзерам смотреть не вариант чтоли?
9 ХочуСпец
 
07.12.12
09:40
(8) тут редактировать еще надо, перетаскивать и прочее
10 Maxus43
 
07.12.12
09:50
(9) подбор номенклатуры обработину смотрел же? там реализовано вроде всё что хочешь
11 Рэйв
 
07.12.12
09:52
(10)Отбора на больше-меньше там нет помоему
12 ХочуСпец
 
07.12.12
09:53
(10) да и нет отображения складов как колонок. Это динамические списки
13 ХочуСпец
 
07.12.12
09:59
хочется использовать СКД, но как в коллекцию значений запихать в таком виде?
14 Maxus43
 
07.12.12
10:01
(13) используя в СКД "Таблицу"- никак
15 ХочуСпец
 
07.12.12
10:02
(14) к сожалению
16 Maxus43
 
07.12.12
10:06
зачем заморачиватся на "Колонках" складах? пусть строками будут склады, в виде дерева норм будет, номенколатура и список складов к ней с количеством
17 ХочуСпец
 
07.12.12
10:11
похоже это единственный вариант, придется прогибать заказчика
18 Maxus43
 
07.12.12
10:14
(17) этот вариант проще и куча реализованого есть уже просто. (2) тоже вариант, но мне дично не нравится
19 ХочуСпец
 
07.12.12
10:20
(18) хм, а как тогда реализовать условие:
По складу1 остаток < 10 И По складу2 остаток > 5
20 Maxus43
 
07.12.12
10:31
(19) в ТЧ?
21 ХочуСпец
 
07.12.12
10:36
да. Ведь будет только три колонки Номенклатура, Склад, Остаток.

В моем же случае:
Номенклатура, ОстатокНаСкладе1, ОстатокНаСкладе2, ...
22 Maxus43
 
07.12.12
10:39
(21) запрос к ТЧ, там условия, Выгрузить/загрузить.
Как вариант общая ТЧ - не видна юзеру, показывается ему результат с отборами только. Запрос к ТЧ и загрузка - быстро шуршит
23 ХочуСпец
 
07.12.12
10:42
(21) это понятно
как в (16) реализовать условие в (21)

в (16) мы можем указать н-р, отобрать остаток по складам Склад1 и Склад2, и Остаток > 10, но как установить условие
что остаток на складе1 > 10, а остаток на складе 2 < 100
24 ptiz
 
07.12.12
10:48
(0) "не устраивает скорость работы." - в какой момент тормоза?
25 ХочуСпец
 
07.12.12
10:49
(24) запрос исполняется быстро. При заполнении ТЗ колонок остатками по складам (выборка)
26 ХочуСпец
 
07.12.12
10:50
Результат = Запрос.Выполнить();
   
   ВыборкаПоНоменклатуре = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Пока ВыборкаПоНоменклатуре.Следующий() цикл
       
       НоваяСтрокаПоНоменклатуре = ПродукцияОстатки.Добавить();
       Продукция = ВыборкаПоНоменклатуре.Продукция;
       НоваяСтрокаПоНоменклатуре.Продукция = Продукция;
           НоваяСтрокаПоНоменклатуре.Всего = ВыборкаПоНоменклатуре.Остаток;
       
       ВыборкаПоСкладам = ВыборкаПоНоменклатуре.Выбрать();
       
       Пока ВыборкаПоСкладам.Следующий() цикл
                       
           НоваяСтрокаПоНоменклатуре["Остаток_"+СокрЛП(ВыборкаПоСкладам.Склад.Код)] = ВыборкаПоНоменклатуре.Остаток;                
           
       КонецЦикла;    
       
       
   КонецЦикла;
27 ptiz
 
07.12.12
10:55
(26) Запрос по ТЗ?
А если делать "НайтиСтроки" по индексированной ТЗ ?
Всё равно, смотрю, группировки фиксированные.
28 ptiz
 
07.12.12
10:58
Тьфу..  понял. Построителем работаешь.
В любом случае - как-нибудь применить НайтиСтроки для отбора или хотя бы уменьшения таблицы для построителя.
29 ХочуСпец
 
07.12.12
11:00
(28) уменшить можно только уменьшением списка складов
30 ХочуСпец
 
07.12.12
11:01
(28) отбор работает мигом. Актуализация остатков страдает
31 ptiz
 
07.12.12
11:03
(30) Мне эта строчка не нравится:
ВыборкаПоСкладам.Склад.Код

замер делал?
32 Maxus43
 
07.12.12
11:06
(31) + 1, запросом тяни код
33 ХочуСпец
 
07.12.12
11:10
(32) сделаю замер
34 ХочуСпец
 
07.12.12
11:12
чуток побыстрее но все равно пока также скорость не удовлетворяет
35 Maxus43
 
07.12.12
11:14
замер делал? где затраты наибольшие?
36 ХочуСпец
 
07.12.12
13:38
(35) да сделал и пропустил косячину

Запрос:

   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    ТоварыНаСкладахОстатки.Склад,
   |    ТоварыНаСкладахОстатки.Номенклатура КАК Продукция,
   |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
   |    ТоварыНаСкладахОстатки.Склад.Код КАК СкладКод
   |ИЗ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад В (&Склады)) КАК ТоварыНаСкладахОстатки
   |ИТОГИ
   |    СУММА(Остаток)
   |ПО
   |    Продукция";

Результат = Запрос.Выполнить();
   
   ВыборкаПоНоменклатуре = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Пока ВыборкаПоНоменклатуре.Следующий() цикл
       
       НоваяСтрокаПоНоменклатуре = ПродукцияОстатки.Добавить();
       Продукция = ВыборкаПоНоменклатуре.Продукция;
       НоваяСтрокаПоНоменклатуре.Продукция = Продукция;
НоваяСтрокаПоНоменклатуре.ПродукцияНаименование = Продукция.Наименование;
           НоваяСтрокаПоНоменклатуре.Всего = ВыборкаПоНоменклатуре.Остаток;
       
       ВыборкаПоСкладам = ВыборкаПоНоменклатуре.Выбрать();
       
       Пока ВыборкаПоСкладам.Следующий() цикл
                       
           НоваяСтрокаПоНоменклатуре["Остаток_"+СокрЛП(ВыборкаПоСкладам.СкладКод)] = ВыборкаПоНоменклатуре.Остаток;                
           
       КонецЦикла;    
       
       
   КонецЦикла;


ПРОБЛЕМА: в выборке обращаясь через точку получанию Наименование что КРАЙНЕ НЕВЕРНО. Но наименование мне необходимо по итогу, как переделать запрос
37 ХочуСпец
 
07.12.12
13:41
туплю, проблема решена
38 Maxus43
 
07.12.12
13:42
а всё (5) кричал %)
39 ХочуСпец
 
07.12.12
13:45
(38) замер рулит
40 ptiz
 
07.12.12
16:44
(36) Прикольно, самую тормозную строку и не показал сразу, а мы гадаем :)