|   |   | 
| 
 | ТиС 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) ну так сделай прямым запросом и не парься     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |