|   |   | 
| 
 | Списание партий по FIFO одним запросом | ☑ | ||
|---|---|---|---|---|
| 0
    
        experimentator76 02.02.12✎ 20:12 | 
        Вот запрос. 
  Смысл - одним запросом рассчитать количество к списанию в разрезе партий по множеству номенклатуры. На выходе только товары, по которым достаточно партий. Просьба проверить - все ли корректно работает. ВЫБРАТЬ РасходТовары.Номенклатура, СУММА(РасходТовары.Количество) КАК Количество ПОМЕСТИТЬ ТоварыВсе ИЗ Документ.Расход.Товары КАК РасходТовары ГДЕ РасходТовары.Ссылка = &Расход СГРУППИРОВАТЬ ПО РасходТовары.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПартииОстатки.Номенклатура КАК Номенклатура, ПартииОстатки.Партия КАК Партия, ПартииОстатки.Партия.МоментВремени КАК МоментВремени, ПартииОстатки.КоличествоОстаток КАК Остаток ПОМЕСТИТЬ Партии ИЗ РегистрНакопления.Партии.Остатки( , Номенклатура В (ВЫБРАТЬ ТоварыВсе.Номенклатура ИЗ ТоварыВсе КАК ТоварыВсе)) КАК ПартииОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТоварыВсе.Номенклатура, ТоварыВсе.Количество ПОМЕСТИТЬ Товары ИЗ ТоварыВсе КАК ТоварыВсе ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Партии.Номенклатура КАК Номенклатура, СУММА(Партии.Остаток) КАК ОстатокОбщий ИЗ Партии КАК Партии СГРУППИРОВАТЬ ПО Партии.Номенклатура) КАК П ПО (П.Номенклатура = ТоварыВсе.Номенклатура) И (П.ОстатокОбщий >= ТоварыВсе.Количество) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Товары.Номенклатура, ВТ1.Партия, ВТ1.Остаток, СУММА(ВТ2.Остаток) КАК ОстатокИтог, СУММА(ВТ2.Остаток) - ВТ1.Остаток КАК ПредыдущийОстаток, ВЫБОР КОГДА СУММА(ВТ2.Остаток) - ВТ1.Остаток = 0 ТОГДА ВЫБОР КОГДА Товары.Количество < ВТ1.Остаток ТОГДА Товары.Количество ИНАЧЕ ВТ1.Остаток КОНЕЦ ИНАЧЕ ВЫБОР КОГДА Товары.Количество - ВЫБОР КОГДА Товары.Количество < СУММА(ВТ2.Остаток) - ВТ1.Остаток ТОГДА Товары.Количество ИНАЧЕ СУММА(ВТ2.Остаток) - ВТ1.Остаток КОНЕЦ < ВТ1.Остаток ТОГДА Товары.Количество - ВЫБОР КОГДА Товары.Количество < СУММА(ВТ2.Остаток) - ВТ1.Остаток ТОГДА Товары.Количество ИНАЧЕ СУММА(ВТ2.Остаток) - ВТ1.Остаток КОНЕЦ ИНАЧЕ ВТ1.Остаток КОНЕЦ КОНЕЦ КАК Списать ИЗ Товары КАК Товары ВНУТРЕННЕЕ СОЕДИНЕНИЕ Партии КАК ВТ1 ПО Товары.Номенклатура = ВТ1.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Партии КАК ВТ2 ПО (ВТ1.Номенклатура = ВТ2.Номенклатура) И (ВТ1.МоментВремени >= ВТ2.МоментВремени) СГРУППИРОВАТЬ ПО Товары.Номенклатура, ВТ1.Партия, ВТ1.МоментВремени, ВТ1.Остаток, Товары.Количество ИМЕЮЩИЕ Товары.Количество > СУММА(ВТ2.Остаток) - ВТ1.Остаток УПОРЯДОЧИТЬ ПО ВТ1.МоментВремени | |||
| 1
    
        palpetrovich 02.02.12✎ 21:09 | 
        хм, дежавю 
  пару за сегодня раз видел подобную тему ...или это резюме? | |||
| 2
    
        experimentator76 02.02.12✎ 21:22 | 
        сегодня только зарегился - не судите строго за косяки с движком
  я слышал давно что одним запросом сие нереализуемо набросал - работает - есть подозрение что где-то может быть косяк, так как "программ без багов не бывает" если косяка нет - буду применять тогда | |||
| 3
    
        GROOVY 02.02.12✎ 21:27 | 
        Вполне реализуемо, только при большом количестве парти (обычное дело) такой запрос буде дико тормозить при соединениях.     | |||
| 4
    
        GROOVY 02.02.12✎ 21:28 | 
        Зачем хотите именно в запросе рассчитать партии списания? Не проще ли это делать уже в модуле. И писать проще, и для системы легче.     | |||
| 5
    
        Пират 02.02.12✎ 21:29 | 
        (0) я бы разделил в таком случае количественный и суммовой учет по партиям на два регистра     | |||
| 6
    
        Поpyчик-4 02.02.12✎ 21:31 | 
        (0) Лисапед. Штатные механизмы ужо не канают, нам бы тоже самое, но с квадратно-перламутровыми?     | |||
| 7
    
        experimentator76 02.02.12✎ 21:52 | 
        не скрою что был еще спортивный интерес :)     | |||
| 8
    
        experimentator76 02.02.12✎ 21:59 | 
        (3) не факт - надо проверять
  (4) теоретически запросом должно быть быстрее - для модуля остается проверка и сигнализация частью пакетного запроса о несписанных товарах + отказ а результат запроса можно без дополнительных расчетов записывать в регистр (5) суммового собственно в запросе не предусмотрено, но если он корректно в принципе работает то можно прикрутить (6) в смысле - те что в типовых конфигурациях ? прям вот так выпилить из типовой и применять в своей ? | |||
| 9
    
        experimentator76 02.02.12✎ 22:01 | 
        (4) а партии чтоб не залеживались надо быстро пускать в расход :)     | |||
| 10
    
        Reaper_1c 02.02.12✎ 22:08 | 
        (8) Проверено. Факт. Железобетонный. Медленнее минимум в 1.5-2 раза. Транзакция растягивается, конфликты блокировок множатся. Автора лишают премии.     | |||
| 11
    
        Азазелло 02.02.12✎ 22:15 | 
        (10) Нет, ну в свое время @Ненавижу1С проявлял теоретический интерес к возможности решения СЛАУ запросами. Здесь, можно сказать, тот же случай :)     | |||
| 12
    
        experimentator76 02.02.12✎ 22:16 | 
        (10) верю :)))     | |||
| 13
    
        experimentator76 02.02.12✎ 22:18 | 
        (11) ну не всеж только рутина в обмен на премии :) хочется эдакий изврат забацать
  тормоза проверю на выхах - надо выбрать базу для насилия | |||
| 14
    
        Азазелло 02.02.12✎ 22:19 | 
        (13) Завтра проверим ;)     | |||
| 15
    
        experimentator76 02.02.12✎ 22:21 | 
        кстати соединения производятся временной таблицей на саму себя
  может и не будет падения производительности (14) завтра нельзя - нащальника строгая :))) ;) | |||
| 16
    
        Reaper_1c 02.02.12✎ 22:22 | 
        (11) Так и 1Сники проявляли. Не взлетело.     | |||
| 17
    
        experimentator76 02.02.12✎ 22:23 | 
        (16) это кто такие ? разработчики платформы?     | |||
| 18
    
        МуМу 02.02.12✎ 22:50 | 
        Доказано теоритически что партионка расчитывается на SQL только курсорами а стало быть смысла писать одним запросом нет.(проще на клиенте в цикле) Конечно может чего нибудь в 1С на сервер приложений намудрили с кешированием но это врядли.     | |||
| 19
    
        Reaper_1c 02.02.12✎ 22:54 | 
        (18) Ничего не мутили. Я по глупости когда 8-ку осваивал проверял. Списание силами сервера приложений делает супермегазапрос как стоячего.     | |||
| 20
    
        experimentator76 02.02.12✎ 23:12 | 
        (18) наверное мой уровень не позволяет мне понять что Вы написали
  (19) поясните - как чего стоячего? как выяснили что делает супермегазапрос ? | |||
| 21
    
        experimentator76 02.02.12✎ 23:13 | 
        наверное не в теории смогу проверить только сам что там в результате будет мегастоять     | |||
| 22
    
        Пират 02.02.12✎ 23:21 | 
        (18) если приложение управляемое, то лучше все-таки запросом, имхо     | |||
| 23
    
        experimentator76 02.02.12✎ 23:25 | 
        (22) только 8.2, только на сервере и только запросом
  аминь :) | |||
| 24
    
        Новиков 02.02.12✎ 23:33 | 
        (23) не знаю сколько тебе лет, сколько ты чего видел в жизни, но открой типовые и посмотри там реализацию фифо. И да - там не дебилы написали списание именно кодом, а не запросом.     | |||
| 25
    
        experimentator76 02.02.12✎ 23:39 | 
        (24) в типовых ошибки находил - бывало
  но суть не в том - знаю я или не знаю типовой подход суть в (0) | |||
| 26
    
        experimentator76 02.02.12✎ 23:39 | 
        год рождения указан в нике     | |||
| 27
    
        Reaper_1c 03.02.12✎ 09:41 | 
        (21) Это ты сейчас кого теоретиком обозвал? Если ты не знаешь в какую позу поставишьь СУБД соединением таблиц по условию типа ">=" по дате - флаг тебе в руки, барабан на шею...     | |||
| 28
    
        Ненавижу 1С гуру 03.02.12✎ 09:42 | ||||
| 29
    
        experimentator76 03.02.12✎ 21:25 | 
        (27) не хотел никоим образом оскорбить
  но наверное согласитесь что один практик стоит трех теоретиков (28) похожий алгоритм - я его видел однажды и его часть с соединениями использовал для расчета накопительных итогов спасибо за идею, которая подтолкнула меня ее развить дальше и реализовать запрос (0) чтобы избежать переборов и вычислений кодом вне запроса (так называемый и почитаемый в народе "типовой подход") как обещал на выхах потестю эти соединения на вшивость возможно вы ребята и правы и теория это сила :)) | |||
| 30
    
        Immortal 03.02.12✎ 22:15 | 
        (10)в простых случаях запрос быстрее     | |||
| 31
    
        experimentator76 03.02.12✎ 22:20 | 
        (30) подскажите пример сложного случая - я его воссоздам     | |||
| 32
    
        Злопчинский 04.02.12✎ 03:57 | 
        на Исе поищите - обсуждались эти вопросы вроде активно... или я туплю - может и здесь было...     | |||
| 33
    
        Эмбеддер 04.02.12✎ 07:30 | 
        (0) Тут целых 4 запроса вместо 1     | |||
| 34
    
        experimentator76 04.02.12✎ 10:05 | 
        (33) верно подмечено! два первых непосредственно к данным, один контрольный и один расчетный\результирующий
  НО пакетный один и выполняться должен быстрее чем 4 отдельных последовательных запроса (32) туплю - иса это где ? | |||
| 35
    
        Эмбеддер 04.02.12✎ 10:22 | 
        (34) я на 7-ке когда выбирал данные прямыми запросами, использовал курсоры, чтобы код выполнялся не в 1С, а на сервере. хотя была альтернатива или все на 1С или запросами     | |||
| 36
    
        experimentator76 04.02.12✎ 10:39 | 
        (35) скуль это другая песня :) с прямыми запросами в семерке работал, но непосредственно в самом скуле мало писал
  я слышал что там можно организовать рекурсивность запроса - а это новые возможности для закура сейчас работаю с 8.2 и интересно ее мощами реализовать, не выходя за рамки ограниченности ее платформы | |||
| 37
    
        Эмбеддер 04.02.12✎ 10:50 | 
        (36) Рекурсивный запрос хотел использовать для иерархии номенклатуры в 7-ке. Просто иерархию можно было получить, но в реальном запросе с итогами применить не удалось из-за ограничений     | |||
| 38
    
        experimentator76 04.02.12✎ 10:56 | 
        (37) я видел как на скуле решается задача получения иерархии справочника
  сейчас есть неявное желание оставаться в рамках платформы 8.2 но отсутствие рекурсивности в запросах восьмерки тормозит реализацию целого ряда задач к примеру (0) можно было бы реализовать возможно проще и без соединений а также решить задачу умножения между строками | |||
| 39
    
        БалбесВ1с 04.02.12✎ 11:04 | 
        (34)Иса - инф0старт     | |||
| 40
    
        experimentator76 04.02.12✎ 11:07 | 
        (39) спасибо - почитаю по этой теме     | |||
| 41
    
        Эмбеддер 04.02.12✎ 11:09 | 
        (38) Тут остается или поверить мне на слово что на практике рекурсивный запрос бесполезен с существующими ограничениями или попробовать самому
  а по поводу списания в запросе мое мнение что скорости не добавит, если не наоборот | |||
| 42
    
        experimentator76 04.02.12✎ 11:18 | 
        (41) буду готовить базу - проверю скорость типовым подходом и пакетным запросом     | |||
| 43
    
        experimentator76 04.02.12✎ 11:26 | 
        Вот нашел на ИСЕ нечто похожее
  http://forum.infostart.ru/forum24/topic41395/message462692/#message462692 | |||
| 44
    
        Immortal 06.02.12✎ 21:09 | 
        (31)списание партий в типовой - это сложный случай     | |||
| 45
    
        Immortal 06.02.12✎ 21:10 | 
        и, наверное, (18) прав.     | |||
| 46
    
        кащщей 06.02.12✎ 21:22 | 
        Надо бы на NuLL проверить еще...вроде бы не забыть.     | |||
| 47
    
        hhhh 06.02.12✎ 21:29 | 
        а разве моменты времени сравниваются на >= ? Что-то я пропустил.     | |||
| 48
    
        experimentator76 06.02.12✎ 21:59 | 
        тестовая база создана случайным образом
  2000 уникальных товаров 30000 партий\приходов 3500 расходов - больше создать терпения не хватило число строк товаров 1..50 проведение таким запросом не вешает базу поправлю позже алгоритм подбора партий чтобы списывалось все количество сразу а не частями как сейчас так как это долго происходит при таком количестве партий впереди тестирование общепринятого алгоритма списания и одним запросом | |||
| 49
    
        experimentator76 06.02.12✎ 22:04 | 
        (44) плата за универсальность этого механизма
  (45) мне показалось что это семерочный подход или я не понял высказывание (46) товары соединяются с партиями внутренне и товары только те на которые есть остатки в принципе проверку на недостаток партий допишу - это + запрос в пакет (47) еще как сравниваются! | |||
| 50
    
        experimentator76 06.02.12✎ 22:14 | 
        да и платформа 8.2 - база SQL     | |||
| 51
    
        кащщей 06.02.12✎ 22:24 | 
        (49), При соединениях, тем более внутренних принято проверять значения полей на значение NULL, Иначе такие выражения в запросе как  
  СУММА(ВТ2.Остаток) - ВТ1.Остаток КАК ПредыдущийОстаток, дадут совершенно непредсказуемый результат, точнее не дадут вооще. даже если есть Вт2.остаток | |||
| 52
    
        Азазелло 06.02.12✎ 23:51 | 
        (51) o_O NULL никак не может получиться при _внутреннем_ соединение...     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |