Списание партий по FIFO одним запросом #593563


#0 by experimentator76
Вот запрос. Смысл - одним запросом рассчитать количество к списанию в разрезе партий по множеству номенклатуры. На выходе только товары, по которым достаточно партий. Просьба проверить - все ли корректно работает. ВЫБРАТЬ               РегистрНакопления.Партии.Остатки(               ВТ1.Партия,
#1 by palpetrovich
хм, дежавю пару за сегодня раз видел подобную тему ...или это резюме?
#2 by experimentator76
сегодня только зарегился - не судите строго за косяки с движком я слышал давно что одним запросом сие нереализуемо набросал - работает - есть подозрение что где-то может быть косяк, так как "программ без багов не бывает" если косяка нет - буду применять тогда
#3 by GROOVY
Вполне реализуемо, только при большом количестве парти (обычное дело) такой запрос буде дико тормозить при соединениях.
#4 by GROOVY
Зачем хотите именно в запросе рассчитать партии списания? Не проще ли это делать уже в модуле. И писать проще, и для системы легче.
#5 by Пират
я бы разделил в таком случае количественный и суммовой учет по партиям на два регистра
#6 by Поpyчик-4
Лисапед. Штатные механизмы ужо не канают, нам бы тоже самое, но с квадратно-перламутровыми?
#7 by experimentator76
не скрою что был еще спортивный интерес :)
#8 by experimentator76
не факт - надо проверять теоретически запросом должно быть быстрее - для модуля остается проверка и сигнализация частью пакетного запроса о несписанных товарах + отказ а результат запроса можно без дополнительных расчетов записывать в регистр суммового собственно в запросе не предусмотрено, но если он корректно в принципе работает то можно прикрутить в смысле - те что в типовых конфигурациях ? прям вот так выпилить из типовой и применять в своей ?
#9 by experimentator76
а партии чтоб не залеживались надо быстро пускать в расход :)
#10 by Reaper_1c
Проверено. Факт. Железобетонный. Медленнее минимум в 1.5-2 раза. Транзакция растягивается, конфликты блокировок множатся. Автора лишают премии.
#11 by Азазелло
Нет, ну в свое время @Ненавижу1С проявлял теоретический интерес к возможности решения СЛАУ запросами. Здесь, можно сказать, тот же случай :)
#12 by experimentator76
верю :)))
#13 by experimentator76
ну не всеж только рутина в обмен на премии :) хочется эдакий изврат забацать тормоза проверю на выхах - надо выбрать базу для насилия
#14 by Азазелло
Завтра проверим ;)
#15 by experimentator76
кстати соединения производятся временной таблицей на саму себя может и не будет падения производительности завтра нельзя - нащальника строгая :))) ;)
#16 by Reaper_1c
Так и 1Сники проявляли. Не взлетело.
#17 by experimentator76
это кто такие ? разработчики платформы?
#18 by МуМу
Доказано теоритически что партионка расчитывается на SQL только курсорами а стало быть смысла писать одним запросом нет.(проще на клиенте в цикле) Конечно может чего нибудь в 1С на сервер приложений намудрили с кешированием но это врядли.
#19 by Reaper_1c
Ничего не мутили. Я по глупости когда 8-ку осваивал проверял. Списание силами сервера приложений делает супермегазапрос как стоячего.
#20 by experimentator76
наверное мой уровень не позволяет мне понять что Вы написали поясните - как чего стоячего? как выяснили что делает супермегазапрос ?
#21 by experimentator76
наверное не в теории смогу проверить только сам что там в результате будет мегастоять
#22 by Пират
если приложение управляемое, то лучше все-таки запросом, имхо
#23 by experimentator76
только 8.2, только на сервере и только запросом аминь :)
#24 by Новиков
не знаю сколько тебе лет, сколько ты чего видел в жизни, но открой типовые и посмотри там реализацию фифо. И да - там не дебилы написали списание именно кодом, а не запросом.
#25 by experimentator76
в типовых ошибки находил - бывало но суть не в том - знаю я или не знаю типовой подход суть в
#26 by experimentator76
год рождения указан в нике
#27 by Reaper_1c
Это ты сейчас кого теоретиком обозвал? Если ты не знаешь в какую позу поставишьь СУБД соединением таблиц по условию типа ">=" по дате - флаг тебе в руки, барабан на шею...
#28 by Ненавижу 1С
#29 by experimentator76
не хотел никоим образом оскорбить но наверное согласитесь что один практик стоит трех теоретиков похожий алгоритм - я его видел однажды и его часть с соединениями использовал для расчета накопительных итогов спасибо за идею, которая подтолкнула меня ее развить дальше и реализовать запрос чтобы избежать переборов и вычислений кодом вне запроса (так называемый и почитаемый в народе "типовой подход") как обещал на выхах потестю эти соединения на вшивость возможно вы ребята и правы и теория это сила :))
#30 by Immortal
в простых случаях запрос быстрее
#31 by experimentator76
подскажите пример сложного случая - я его воссоздам
#32 by Злопчинский
на Исе поищите - обсуждались эти вопросы вроде активно... или я туплю - может и здесь было...
#33 by Эмбеддер
Тут целых 4 запроса вместо 1
#34 by experimentator76
верно подмечено! два первых непосредственно к данным, один контрольный и один расчетныйрезультирующий НО пакетный один и выполняться должен быстрее чем 4 отдельных последовательных запроса туплю - иса это где ?
#35 by Эмбеддер
я на 7-ке когда выбирал данные прямыми запросами, использовал курсоры, чтобы код выполнялся не в 1С, а на сервере. хотя была альтернатива или все на 1С или запросами
#36 by experimentator76
скуль это другая песня :) с прямыми запросами в семерке работал, но непосредственно в самом скуле мало писал я слышал что там можно организовать рекурсивность запроса - а это новые возможности для закура сейчас работаю с 8.2 и интересно ее мощами реализовать, не выходя за рамки ограниченности ее платформы
#37 by Эмбеддер
Рекурсивный запрос хотел использовать для иерархии номенклатуры в 7-ке. Просто иерархию можно было получить, но в реальном запросе с итогами применить не удалось из-за ограничений
#38 by experimentator76
я видел как на скуле решается задача получения иерархии справочника сейчас есть неявное желание оставаться в рамках платформы 8.2 но отсутствие рекурсивности в запросах восьмерки тормозит реализацию целого ряда задач к примеру можно было бы реализовать возможно проще и без соединений а также решить задачу умножения между строками
#39 by БалбесВ1с
Иса - инф0старт
#40 by experimentator76
спасибо - почитаю по этой теме
#41 by Эмбеддер
Тут остается или поверить мне на слово что на практике рекурсивный запрос бесполезен с существующими ограничениями или попробовать самому а по поводу списания в запросе мое мнение что скорости не добавит, если не наоборот
#42 by experimentator76
буду готовить базу - проверю скорость типовым подходом и пакетным запросом
#43 by experimentator76
Вот нашел на ИСЕ нечто похожее
#44 by Immortal
списание партий в типовой - это сложный случай
#45 by Immortal
и, наверное, прав.
#46 by кащщей
Надо бы на NuLL проверить еще...вроде бы не забыть.
#47 by hhhh
а разве моменты времени сравниваются на >= ? Что-то я пропустил.
#48 by experimentator76
тестовая база создана случайным образом 2000 уникальных товаров 30000 партийприходов 3500 расходов - больше создать терпения не хватило число строк товаров 1..50 проведение таким запросом не вешает базу поправлю позже алгоритм подбора партий чтобы списывалось все количество сразу а не частями как сейчас так как это долго происходит при таком количестве партий впереди тестирование общепринятого алгоритма списания и одним запросом
#49 by experimentator76
плата за универсальность этого механизма мне показалось что это семерочный подход или я не понял высказывание товары соединяются с партиями внутренне и товары только те на которые есть остатки в принципе проверку на недостаток партий допишу - это + запрос в пакет еще как сравниваются!
#50 by experimentator76
да и платформа 8.2 - база SQL
#51 by кащщей
, При соединениях, тем более внутренних принято проверять значения полей на значение NULL, Иначе такие выражения в запросе как   СУММА(ВТ2.Остаток) - ВТ1.Остаток КАК ПредыдущийОстаток, дадут совершенно непредсказуемый результат, точнее не дадут вооще. даже если есть Вт2.остаток
#52 by Азазелло
o_O NULL никак не может получиться при _внутреннем_ соединение...
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С