Имя: Пароль:
1C
 
ТиС 7.7. Найти последнее поступление
0 es3000
 
23.02.16
05:01
Здравствуйте!
Помогите, плиз, разобраться.

Есть список номенклатур, фирм, складов.
Нужно найти последнее поступление от поставщика для каждой комбинации на конкретную дату.

Сейчас я сделал по регистру остатков типа так:


ТЗПоступления = СоздатьОбъект("ТаблицаЗначений";
РегОстатки = СоздатьОбъект("Регистр.ОстаткиТМЦ");
РегОстатки.УстановитьФильтр(лФирма, лНоменклатура, лСклад);
РегОстатки.ОбратныйПорядок(1);
РегОстатки.ВыбратьДвижения(,ДатаКонца);
Пока РегОстатки.ПолучитьДвижение() = 1 Цикл
    Если (РегОстатки.ТекДок().Вид() = "ПоступлениеТМЦ") ИЛИ
        ТЗПоступления.НоваяСтрока();
         ....

Работает медленно.
Наверно потому что для каждого движения приходится проверять документ, так как по самому движению не ясно, что это за операция.

Как это можно ускорить?
По регистру партий быстрее будет работать?
1 lowepro
 
23.02.16
06:17
Черный запрос попробовать?
2 VladZ
 
23.02.16
07:13
(0) Для начала попробовать ограничить объем анализируемой информации. Фильтр по регистру  - это хорошо. Но в любом случае это большой объем. Почему бы не получать эту инфу запросом по документам "ПоступлениеТМЦ"? Причем сразу с условием по контрагенту. Объем анализируемой инфы будет значительно меньше.
3 vcv
 
23.02.16
07:14
Мне кажется, быстрее будет запрос к документам поступления с группировками Фирма, Склад, Номенклатура, ДатаДок, Документ.
Запрос выгрузить в индексированную таблицу и свернуть по фирме, складу, номенклатуре. Перебрать полученную таблицу, сортируя вложенные таблицы по дате документе и получая документ на самую свежую дату.
4 vcv
 
23.02.16
07:17
В общем случае задача быстро не решается. Вдруг у вас база за 10 лет, сто тысяч номенклатурных позиций, по десятку поступлений в день и какая-то номенклатура могла последний раз приходить лет девять назад?
5 trdm
 
23.02.16
07:35
(4) > В общем случае задача быстро не решается.

Пожно прописать в справочник ТМЦ даты первой/последней закупки и опираться на это.
6 trdm
 
23.02.16
07:35
(0) > По регистру партий быстрее будет работать?

По регистру продаж.
7 es3000
 
23.02.16
07:59
(1) что такое "черный запрос"?
8 es3000
 
23.02.16
08:01
(2)
контрагент не важен, нужна просто дата последнего поступления,
кстати оказалось склад тоже не важен,
то есть надо найти последнее поступление по фирме + номенклатура
9 es3000
 
23.02.16
08:03
(4) так и есть: база 7 лет, по некоторым товарам поступление х\з когда было
10 es3000
 
23.02.16
08:05
(5) не совсем понял

"прописать даты первой\последней закупки" - как прописать? обработкой? и как эти даты будут меняться в дальнейшем?
11 es3000
 
23.02.16
08:05
(6) почему "по регистру продаж"?
мне же поступления нужны
12 Мимохожий Однако
 
23.02.16
08:12
Сделай запрос по справочнику Партии.
13 trdm
 
23.02.16
09:53
(0) Это у тебя отчет?
14 es3000
 
23.02.16
10:00
(13) да, это нужно для отчета
15 es3000
 
23.02.16
10:02
(12) в справочнике партий партии создаются не только при поступлении,
еще и при перемещениях, при возвратах,
как из справочника отбирать партии только для поступлений?
16 Масянька
 
23.02.16
10:04
(15) Партия.ПриходныйДокумент.Вид() - "Поступление" (где-то так, дословно - не помню).
17 hhhh
 
23.02.16
10:57
(15) а если по документам поступления сделать запрос? Слабо?
18 Mikeware
 
23.02.16
11:00
(17) у запроса по документам поступления во-первых как минимум одно соединение (журнал с таблицей табчасти), а во-вторых, номенклатура в табчасти- не индексирована.
регистр в этом плане гораздо лучше, а значит - быстрее.
19 palpetrovich
 
23.02.16
11:23
в 77 выборка по документам поступления в обратном порядке может дать фору запросу  :)
...с прерыванием при первом нахождении искомого конечно
20 es3000
 
23.02.16
11:49
(18) ну вот сейчас по регистру сделано - очень медленно работает
21 es3000
 
23.02.16
11:51
(18)+ вернее сейчас не полностью по регистру,
приходится  по каждому движению в документ "заглядывать"
22 Mikeware
 
23.02.16
11:52
(20) "по регистру" можно тоже сделать "по-всякому"...
23 Смотрящий
 
23.02.16
11:53
(20) У тебя перебор идет движений - он медленный.

Регистры Остатки ТМЦ, ПартииНаличие/ПартииОтданные - остатков - ты не получишь через СоздатьОбъект("Регистр.ОстаткиТМЦ") движения за период;

Либо делать регистр оборотов по приходу и перепроводить доки, что нереально (хотя регистр подсунуть можно в движения доков, вопрос будешь ли парится), либо использовать чОрный запрос.
24 Масянька
 
23.02.16
12:01
(21)

Функция ДатаПрихода(ВыбЗнач)

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

    ТаблОстатков.Сортировать("Партия+");
    
    КолВоСтрок = ТаблОстатков.КоличествоСтрок();

    ТаблОстатков.ВыбратьСтроки();
    Если КолВоСтрок <> 0 Тогда
        ТаблОстатков.ПолучитьСтрокуПоНомеру(КолВоСтрок);
        Док = ТаблОстатков.Партия.ПриходныйДокумент;
    Иначе
        Док = "";
    КонецЕсли;

    Возврат Док;
    
КонецФункции // ДатаПрихода
25 Смотрящий
 
23.02.16
12:04
(24) Не пойдет. Не вернет документ прихода в котором была номенклатура но на момент обращения к функции остаток = 0.
Например кончился ходовой товар.
26 es3000
 
23.02.16
12:49
(23) так что такое "чорный запрос"?
27 Mikeware
 
23.02.16
12:51
(26) да обычный запрос.который "не прямой"
28 Смотрящий
 
23.02.16
12:53
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Период с 01.01.00 по '" + ТекущаяДата() + "';
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;
|Функция ПриходНоменклатура = Приход(Количество);
|Условие(Номенклатура в спВыбНоменклатура);
|";

Если Запрос.Выполнить(ТЕкстЗапроса) = 0 Тогда Возврат; КонецЕсли;
29 Злопчинский
 
23.02.16
13:13
(24)  при учете по среднему по партиям не получится
30 lowepro
 
23.02.16
13:34
(7) в (0) код краными и синими буквами, а бывает запрос черными буквами.
31 Смотрящий
 
23.02.16
13:35
(29) Все получится; но будет (25)
32 palpetrovich
 
23.02.16
13:58
ёк

Процедура Сформировать()

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Товар = Справочник.Номенклатура.ТекущийЭлемент;
    |Функция Счётчик = Счётчик();
    |Группировка Товар без групп;
    |Условие(Товар в МФВыбТовары);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ,0,0);
    
    ТЗрез = СоздатьОбъект("ТаблицаЗначений");
    ТЗрез.НоваяКолонка("Товар", "Справочник.Номенклатура");
    ТЗрез.НоваяКолонка("ПрихДокумент", "Документ.ПриходнаяНакладная");
    
    ДокПрих = СоздатьОбъект("Документ.ПриходнаяНакладная");
    ДокПрих.УстановитьФильтр(1);
    ДокПрих.ОбратныйПорядок(1);
    ДокПрих.ВыбратьДокументы(, ВыбКонПериода);
    Пока ДокПрих.ПолучитьДокумент() = 1 Цикл
        Состояние("Обрабатываю " + ДокПрих);
        ДокПрих.ВыбратьСтроки();
        Пока ДокПрих.ПолучитьСтроку() = 1 Цикл
            Если ТЗ.КоличествоСтрок() = 0 Тогда
                Возврат;
            КонецЕсли;
            стр = 0;
            Если ТЗ.НайтиЗначение(ДокПрих.Товар , стр, "Товар")=0 Тогда
                Продолжить;
            КонецЕсли;
            ТЗ.УдалитьСтроку(стр);
            ТЗрез.НоваяСтрока();
            ТЗрез.Товар = ДокПрих.Товар;
            ТЗрез.ПрихДокумент = ДокПрих.ТекущийДокумент();
        КонецЦикла;
    КонецЦикла;

    ТЗрез.ВыбратьСтроку();    
    
КонецПроцедуры
33 Lazy Stranger
 
23.02.16
14:01
Если перебором - можно для расхода вид документа не вытаскивать

Пока РегОстатки.ПолучитьДвижение() = 1 Цикл
Если РегОстатки.Приход=0 тогда
продолжить;
КонецЕсли;

но вообще надо в отладчике смотреть где время тратится
34 Злопчинский
 
24.02.16
01:30
(31) не получится. будет ссылка на пустую партию.
35 Aleksey
 
24.02.16
02:30
А еще партию может породить документ оприходование или документ возврат от покупателя
36 Злопчинский
 
24.02.16
03:07
(35)  оприходование да, а возврат от покупателя вроде нет, там идет привязка к уже существующим патиям
37 es3000
 
24.02.16
04:30
(36) часто возвраты от покупателя не привязывают к продаже, тогда этот возврат создает новую партию
38 Aleksey
 
24.02.16
04:48
(36) Даже если возврат введен не на основании?
39 HawkEye
 
24.02.16
08:58
(0) ты пытаешься предыдущую цену поступления сравнить с текущей и все это в момент проведения или записи документа?
40 HawkEye
 
24.02.16
08:59
(36) если возврат без основания он создаст новую партию
41 Злопчинский
 
24.02.16
13:15
(37) только в том случае, если вручную не указана партия. При отсутсвии документа-основания - партию можно указать вручную.
42 Злопчинский
 
24.02.16
13:15
(40) см (41)
43 trdm
 
24.02.16
17:36
(0) Решил задачку?
44 trdm
 
24.02.16
17:37
Кстати скуль? DBF?
45 es3000
 
25.02.16
12:43
(44) SQL
46 Mikeware
 
25.02.16
12:44
(45) ну так сделай прямым запросом и не парься