Имя: Пароль:
1C
1С v8
Остатки
0 mirror1982
 
18.04.13
12:06
Самописная конфа. Есть справочник Номенклатуры, как сделать так, чтобы при открытии справочника списка, отображались только те элементы, которые есть на складе. Нужен алгоритм, который будет работать быстрее всего. Мой работает достаточно медленно:

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
   
   МойСписок=Новый СписокЗначений();
   Выборка=Справочники.Изделия.Выбрать();
   Пока Выборка.Следующий() Цикл
        Если (глОперацияИзделия="ПриходМатрас")ИЛИ(глОперацияИзделия="РасходМатрас") Тогда
             Если Выборка.Владелец.ТипНоменклатуры<>Перечисления.ВидНоменклатуры.СерийныйТовар Тогда
                  Продолжить;
             КонецЕсли;
        КонецЕсли;
        Если (глОперацияИзделия="Приход")ИЛИ(глОперацияИзделия="Расход") Тогда
             Если Выборка.Владелец.ТипНоменклатуры<>Перечисления.ВидНоменклатуры.Изделие Тогда
                  Продолжить;
             КонецЕсли;
        КонецЕсли;
        мОтбор=Новый Структура;
        мОтбор.Вставить("ID",Выборка.Ссылка);
        мОтбор.Вставить("Склад",глСкладДокумента);
        Остатки=РегистрыНакопления.ОстаткиТМЦ.Остатки(глДатаДокумента,мОтбор);
        Количество=0;
        Если Остатки.Количество()>0 Тогда
             Количество=Остатки.Итог("Количество");
        КонецЕсли;
        Если (Количество=0)И(глОперацияИзделия="ПриходМатрас")И(Выборка.Владелец.ТипНоменклатуры=Перечисления.ВидНоменклатуры.СерийныйТовар) Тогда
             МойСписок.Добавить(Выборка.Ссылка);
        КонецЕсли;
        Если (Количество<>0)И(глОперацияИзделия="РасходМатрас")И(Выборка.Владелец.ТипНоменклатуры=Перечисления.ВидНоменклатуры.СерийныйТовар) Тогда
             МойСписок.Добавить(Выборка.Ссылка);
        КонецЕсли;
        Если (Количество=0)И(глОперацияИзделия="Приход") Тогда
             МойСписок.Добавить(Выборка.Ссылка);
        КонецЕсли;
        Если (Количество<>0)И(глОперацияИзделия="Расход") Тогда
             МойСписок.Добавить(Выборка.Ссылка);
        КонецЕсли;
   КонецЦикла;
   СправочникСписок.Отбор.ССылка.ВидСравнения=ВидСравнения.ВСписке;
   СправочникСписок.Отбор.ССылка.Значение=МойСписок;
   СправочникСписок.Отбор.Ссылка.Использование=Истина;
   СправочникСписок.Порядок.Установить("Код");
   
КонецПроцедуры
1 Wobland
 
18.04.13
12:08
выбрать фсех из РН.ТоварыНаСкладах.Остатки
2 mirror1982
 
18.04.13
12:08
Как увеличить скорость выполнения. На компьютере, на котором находится база справочник открывается через 1,5 секунды, а на компьютерах в сети (3-х) через 15 секунд.
3 mirror1982
 
18.04.13
12:09
(1) не понял.
4 Defender aka LINN
 
18.04.13
12:10
(0) Аллергия на запросы?
5 zak555
 
18.04.13
12:12
если остатка нет, номенклатура не отображается, то как оприходовать номенклатуру, который нет на складе ?
6 mirror1982
 
18.04.13
12:12
(4) как запрос на конечный остаток номенклатуры на складе написать?, я для подсчета остатков всегда пользовался:

РегистрыНакопления.ОстаткиТМЦ.Остатки

А для выборки Запросом.
7 Wobland
 
18.04.13
12:12
(5) Отбор.Доступность=Истина; Отбор.Использование=Ложь;
8 mirror1982
 
18.04.13
12:13
(5) это для реализации
9 Defender aka LINN
 
18.04.13
12:13
(6) А "подсчет" от "выборки" чем-то отличается?
10 Wobland
 
18.04.13
12:13
(4) отсутсвтвие намёков на реляционное мышление. см (6)
11 Defender aka LINN
 
18.04.13
12:14
(8) Главное - не смотри, как в типовых сделано
12 mirror1982
 
18.04.13
12:16
На сколько быстрее будет работать запрос, чем метод остатки? И будет ли он быстрее?
13 Defender aka LINN
 
18.04.13
12:17
(12) Стаж: 5 г. 6 мес. Омистинеть
14 mirror1982
 
18.04.13
12:18
(13) не умничай, а ответь!
15 Defender aka LINN
 
18.04.13
12:21
(14) Кулаком по столу еще хлопни. Я тебе уже ответил.
16 Wobland
 
18.04.13
12:22
(12) во зьми и за мерь
17 DUDE
 
18.04.13
12:35
такое ощущение, что человек в основном работал с 7.7 и без использования запросов
18 unregistered
 
18.04.13
12:52
(12) >> На сколько быстрее будет работать запрос, чем метод остатки?

Если правильно написать запрос - то в разы.
А вообще зависит от размера справочника и количества элементов, по которым есть остатки. Одно дело когда у тебя всего в справочнике 100 позиций и почти по всем есть остатки (прирост будет мало заметен) и совсем другое, когда справочник большой (десятки тысяч элементов), но на остатках есть относительно мало из них (прирост будет на порядки).
19 mirror1982
 
18.04.13
12:57
(18) у меня второй случай!
20 1Сергей
 
18.04.13
12:58
(19) тогда откуда такая запрософобия?
21 mirror1982
 
18.04.13
13:06
Код дайте: РегистрНакопления: ОстаткиТМЦ. Измерения: Склад, Номенклатура. Ресурс: количество.

Как получить выборку на определенном складе, только тех элементов, которые есть на складе?
22 Фрэнки
 
18.04.13
13:07
(19) а зачем ты на форме показываешь поле списока из справочника, когда логичней выгрузить результаты запроса в таблицу значений и все? Ну можно еще поставить смену группы если номенклатура навалена в справочник по группам. Тогда лучше на форме разместить отдельно поле для дерева групп и отображение табличного поля с остатками для текущей группы
23 1Сергей
 
18.04.13
13:08
(21) вот, ты лентяй....
24 Фрэнки
 
18.04.13
13:08
(21) запросом? ты что совсем ничего не умеешь?
25 Wobland
 
18.04.13
13:09
(21) дарю: Запрос.Выполнить().Выбрать();
26 Фрэнки
 
18.04.13
13:09
(21) в модуле формы в нужном тебе месте жми ПКМ и там есть когнструктор для лентяев или новичков
27 Лефмихалыч
 
18.04.13
13:10
(0) динамический список...запрос к виртуальной таблице остатков
28 Wobland
 
18.04.13
13:11
(26) не надо про новичков! удобная штучка. плюс к прочему умеет контролировать синтаксическую верность "рукопашных" запросов ;)
29 Tashiro
 
18.04.13
13:11
(21) Жесть
30 mirror1982
 
18.04.13
13:18
(25) Меня интересует то, чтобы в выборке был итог по количеству, т.е. мне не нужно, чтобы выбирались движения по этому регистру.

Запрос=Новый Запрос("Выбрать * Из РегистрНакопления.ОстаткиТМЦ Где Склад=&МойСклад");

Как изменить этот код, чтобы выбирались только остатки номенклатуры на этом складе, а не движения
31 mirror1982
 
18.04.13
13:20
(30) ресурс один - количество
32 Defender aka LINN
 
18.04.13
13:22
(30) Если мы за тебя запросы писать будем, то давай тогда и зарплату тоже будем за тебя получать.
33 Wobland
 
18.04.13
13:25
(30) вернись к началу ветки и прозрей
34 1Сергей
 
18.04.13
13:26
ВЫБРАТЬ
   ОстаткиТМЦ.Номенклатура,
   ОстаткиТМЦ.КоличествоОстаток
ИЗ
   РегистрНакопления.ОстаткиТМЦ.Остатки(&ДатаОстатков, Склад = &Склад) КАК ОстаткиТМЦ
35 Tashiro
 
18.04.13
13:27
(34) Ну блин =(
36 mirror1982
 
18.04.13
13:28
(34) спасибо!
37 unregistered
 
18.04.13
13:48
(36) (34)
Только правильнее будет сразу в тексте запроса учитывать ТипНоменклатуры, ВидОперации (ну и прочие условия, которые ты там перебираешь).
Короче на выходе в результате запроса должен быть уже готовый список для отбора, который не надо будет дополнительно обрабатывать, проверяя всякие там условия.
Только в таком случае будет реальный прирост производительности.
38 mirror1982
 
18.04.13
14:05
Задачка №2. А как отобрать те, которых нет на складе?
39 mirror1982
 
18.04.13
14:09
чтобы не попали, которые на остатках?
40 zak555
 
18.04.13
14:10
(38) спрНоменклатура по рнОстаки есть Null
41 mirror1982
 
18.04.13
14:12
(40) расшифруй, не до конца понял!
42 DUDE
 
18.04.13
14:12
(34) как-то сразу вспомнилась присказка Фиксина "мой скромный Гений дарит вам..." :) запрос с барского плеча :)
43 GANR
 
18.04.13
14:13
Замер производительности что говорит???
Получение данных из цикла надо убрать однозначно:
1. Выборка.Владелец.ТипНоменклатуры=Перечисления.ВидНоменклатуры.СерийныйТовар, каждая такая операция - это запрос с левым соединением
2. Остатки=РегистрыНакопления.ОстаткиТМЦ.Остатки(глДатаДокумента,мОтбор); а это что внутри цикла делает.
А уж  к а к  убрать - тебе должно быть виднее.
44 mirror1982
 
18.04.13
14:15
(43) я это уже поправил.

   Если глОперацияИзделия="РасходМатрас" Тогда
        Запрос=Новый Запрос("Выбрать МоиОстатки.ID Как ID Из РегистрНакопления.ОстаткиТМЦ.Остатки(&ДатаОстатков,Склад=&Склад) КАК МоиОстатки Где МоиОстатки.Номенклатура.ТипНоменклатуры=&МойТип");
        Запрос.УстановитьПараметр("ДатаОстатков",глДатаДокумента);
        Запрос.УстановитьПараметр("Склад",глСкладДокумента);
        Запрос.УстановитьПараметр("МойТип",Перечисления.ВидНоменклатуры.СерийныйТовар);
        Выборка=Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
               МойСписок.Добавить(Выборка.ID);
        КонецЦикла;
        ИначеЕсли глОперацияИзделия="Расход" Тогда
                  Запрос=Новый Запрос("Выбрать МоиОстатки.ID Как ID Из РегистрНакопления.ОстаткиТМЦ.Остатки(&ДатаОстатков,Склад=&Склад) КАК МоиОстатки Где МоиОстатки.Номенклатура.ТипНоменклатуры=&МойТип");
                  Запрос.УстановитьПараметр("ДатаОстатков",глДатаДокумента);
                  Запрос.УстановитьПараметр("Склад",глСкладДокумента);
                  Запрос.УстановитьПараметр("МойТип",Перечисления.ВидНоменклатуры.Изделие);
                  Выборка=Запрос.Выполнить().Выбрать();
                  Пока Выборка.Следующий() Цикл
                       МойСписок.Добавить(Выборка.ID);
                  КонецЦикла;
   КонецЕсли;
45 zak555
 
18.04.13
14:16
(44) запрос в цикле ?
46 mirror1982
 
18.04.13
14:17
(45) нет. формируется список значений, он и выводится в справочник список:

   СправочникСписок.Отбор.ССылка.ВидСравнения=ВидСравнения.ВСписке;
   СправочникСписок.Отбор.ССылка.Значение=МойСписок;
   СправочникСписок.Отбор.Ссылка.Использование=Истина;
47 mirror1982
 
18.04.13
14:19
(45) мне теперь надо, написать алгоритм, как поместить в справочник список те элементы, которых нет на складе. Не перебирая каждый и проверяя на остаток
48 GANR
 
18.04.13
14:19
Вообще эти РегистрыНакопления.ОстаткиТМЦ.Остатки и Справочники.Изделия.Выбрать(); выкинуть надо из платформы ]:->
49 mirror1982
 
18.04.13
15:00
Так?:

                  Запрос=Новый Запрос("Выбрать МоиОстатки.ID Как ID Из РегистрНакопления.ОстаткиТМЦ.Остатки(&ДатаОстатков,Склад=&Склад) Есть NULL КАК МоиОстатки Где МоиОстатки.Номенклатура.ТипНоменклатуры=&МойТип");
50 mirror1982
 
18.04.13
15:55
ау
51 GANR
 
18.04.13
16:24
(49) Это не будет работать

ВЫБРАТЬ
   МоиОстатки.ID КАК ID
ИЗ
   РегистрНакопления.ОстаткиТМЦ.Остатки(&ДатаОстатков,
       Склад=&Склад
       И Номенклатура.ТипНоменклатуры=&МойТип)  КАК МоиОстатки
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший