0. bforce 427 01.04.14 00:37 Сейчас в теме

Решение транспортной задачи запросом

Списание по двум последовательностям партий запросом (без программной обработки)

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. ildarovich 6513 30.04.14 20:30 Сейчас в теме
Отличное оформление!

Для полноты картины добавлю пару ссылок:
1)ФИФО для любопытных - описание не такое детальное и наглядное, но задача та же и условие соединения в запросе чуть проще. Кстати, в комментарии http://forum.infostart.ru/forum24/topic32459/message361880/#message361880 к той статье дается оценка быстродействия запросного метода. Она совсем не такая оптимистичная, как в этой статье, но на примере списания остатков заказов этого заметно не будет. Также в комментарии http://forum.infostart.ru/forum24/topic32459/message361861/#message361861 приведен рисунок - ментальная модель, используемая при синтезе запроса. Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат. Двумерная модель транспортной задачи, приведенная в данной статье, очевидно, нагляднее.
2)Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая) - также говорится об использовании аналогии между списанием по партиям и транспортной задачей, правда для скорости она решается не запросом, а программно. Обратите внимание на скриншоты хода решения задачи - они очень похожи на рисунки из статьи.

Ну и остались вопросы по постановке задачи. Что-то из серии "угадал все буквы, но не смог назвать слова" (это я про себя). Понятно, когда есть несколько заказов и требуется закрыть их одним поступлением. Тогда закрываем их по ФИФО. Например, заполняем товары и количество, затем запускаем обработку заполнения табличной части и она разбивает строки по заказам. То есть запрос в ОЗТЧ? Но почему не свернуть ТЧ по одинаковым товарам перед вызовом ОЗТЧ. Это ведь сам подбор делает (серии?). Как кладовщик решает, что заказа нет? В этом случае оформляет ордер? В какой момент на ордер поступление делается? То есть непонятна роль ордера и причины возникновения строк с одинаковым товаром. Или обработка одним запросом сразу много поступлений обрабатывает? - Разъясните, пожалуйста!
jobkostya1c8; dour-dead; DO_WHILE_LOOP; Артано; igormiro; dark_wolf; DrAku1a; bulpi; Aleks_Antonuk; Redokov; bforce; +11 Ответить
2. bforce 427 02.05.14 00:00 Сейчас в теме
(1), спасибо за отзыв.
Интересные ссылки! Жаль, что они мне не попались в процессе работы над задачей.

В первой статье, действительно, интересное решение и его проще осознать. Я бы добавил туда несколько иллюстраций.
Над оценкой трудоемкости запроса я задумался. Мой перебор далеко не оптимален, у него трудоемкость О(n * m). Да и запросы на стороне SQL, как я понимаю, приводят к полному соединению таблиц, и только потом применению условия (я клоню к тому, что трудоемкость не должна делиться на два n * m / 2) . Пусть даже так, но почему тогда запрос отрабатывает быстрее? На досуге я над этим поработаю.
Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат.

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

По поводу постановки задачи. В статье я немного упростил ее. Возможно, в этом причина вопросов.
Начну с кладовщика. У него свой АРМ. В нем он просто сканирует штрихкод товара и переносит его в табличную часть. По нажатию кнопки "Принять" АРМ делает за него всю работу: анализирует остатки по Заказам поставщику, по Поступлениям товаров и услуг и создает соответствующие документы. Если поступления нет - перед нами излишек (Ордер на излишки), а если есть - обычный товар (Приходный ордер на товары). В целях сохранности товара кладовщик не знает какой документ был создан.

А теперь интересное. Нет никакой ОЗТЧ. Сам запрос в обработке проведения (о, ужас!). Подбор в поступление позволяет выбрать только товары из заказов, пусть, даже, нескольких. Таким образом, эти строки никогда не свернутся.
В момент проведения Поступления мы должны закрыть два взаимосвязанных регистра: +Товары к поступлению (какие товары предстоит принять на складе), -Излишки (какие товары из этого поступления уже находятся на складе). Если мы находим товар в излишках, значит, в Товары к поступлению мы его не пишем.

Надеюсь, я не слишком выболтал бизнес-процессы фирмы, и Вам стало яснее.
18. AlexO 126 18.07.14 12:32 Сейчас в теме
(1) (17) так когда будет чектий и конкретный запрос на все эти "графы"?!
Все жду, что вот-вот, создадут идеальный запрос, который можно будет везде использовать без переписывания 2/3.
3. Synoecium 632 06.05.14 09:30 Сейчас в теме
Шикарно оформлено, прям курсовая работа. И задача интересная.
4. Bukaska 130 06.05.14 10:39 Сейчас в теме
Однозначно ставлю +, не перевелись ещё на форуме специалисты)))
5. Гошик54 07.05.14 06:37 Сейчас в теме
Это конечно все интересно. Но мне кажется, что в этом примере нет чистоты эксперимента, а именно:
1. Исходный массив данных. На примере рассматривается не большой массив данных тут и так понятно что прямой перебор справится быстрее SQl (SQL - это как межгалактический челнок, но его нужно разогнать). Было бы интересно посмотреть графики скорости с нарастанием объема обрабатываемых данных до сотен тысяч позицый.
2. Может я и ошибаюсь но в эксперименте данные обрабатываются из виртуальной таблицы значений(из кэша памяти), а не поднимаются с файловой системы. В этом случае прямому перебору данные предоставили прямо на блюдечке.
9. bforce 427 07.05.14 12:52 Сейчас в теме
(5), вы немного все переиначили.
  1. У меня получилось, что запрос отрабатывает быстрее, чем перебор, а не наоборот! В моем примере прямой перебор медленнее. Или вы ведете к тому, что преимущества запроса можно еще больше улучшить?
  2. Исходный массив данных. Об этом я обязательно должен был написать (и думал, что написал). Я не тестировал алгоритм на супер больших объемах. Например, таблица 1000 х 1000 у меня решалась несколько минут. Больше делать не стал.
  3. Здесь вы тоже не верно все истолковали. Для перебора используется таблицы объекта (внешней обработки). Непосредственно в них происходят вычисления. Для запроса же эти таблицы выгружаются в параметры запроса, при выполнении запроса помещаются во временные, и только потом используются для расчета нарастающего итога и дальнейших вычислений.
    То есть, действий запросный метод выполняет больше.
6. human_new 328 07.05.14 08:39 Сейчас в теме
Вот это я понимаю подход! Все с разъяснениями. Подобного рода задачи постоянно приходится решать, например, в ЗУПе когда НДФЛ нужно грамотно перекрыть и не держать остатков по периодам или перекрыть любой отрицательный остаток по регисту положительными остатками по этому же регистру. Но то что это Транспортная задача я даже не задумался.
7. alek111--- 07.05.14 09:15 Сейчас в теме
8. wolfsoft 2420 07.05.14 11:36 Сейчас в теме
Дельный материал доступным языком.
10. bulpi 155 07.05.14 13:11 Сейчас в теме
Поставил + за изложение. Но вот за это :

"нередки ситуации, когда менеджер не успевает оформить Заказ поставщику и принимаемый товар записывается как излишек. Если с течением времени будет введен документ Поступление товаров и услуг по этому Заказу, то товар снимается с излишков и все - он уже на складе."

нужно бить линейкой по рукам того, кто придумал (организатора учета) . Сильно, больно и долго.
Это не уменьшает теоретической и методической ценности статьи.
11. rasswet 82 08.05.14 09:47 Сейчас в теме
шикарное оформление, респект!
12. tr75 24.05.14 14:08 Сейчас в теме
13. tr75 24.05.14 14:08 Сейчас в теме
14. oberonm 9 27.05.14 11:05 Сейчас в теме
15. yelena-ppm 1 30.05.14 14:36 Сейчас в теме
Отличное практическое применение элегантной теории :)
16. Abbra 21 17.07.14 23:33 Сейчас в теме
Подскажите, пожалуйста, кто знает, как в примере с курсами валют реализовать на языке запросов следующее: "В третьей группе мы соединяем эти две таблицы по условию ПериодКурса, в результате чего получаем избыточное количество записей. Но достаточно сгруппировать их по дате документа и выбрать максимальное из значений ПериодКурса, как мы получим требуемую таблицу."
17. bforce 427 18.07.14 11:43 Сейчас в теме
(16), вы можете обратиться к статье Срез последних на каждую дату в запросе, там есть то, что нужно.
19. Abbra 21 22.07.14 01:27 Сейчас в теме
(17), спасибо. Из этой статьи я понял как объединить таблицу, содержащую все даты периода с колонкой дат известных остатков, а потом уже объединить с колонкой сумм известных остатков.
у Вас же присоединяются сразу две колонки и я не представляю, что потом с этой таблицей делать, чтобы выделить из нее нужное
20. jobkostya1c8 25.08.14 23:15 Сейчас в теме
Отличная статья. Все для производительности.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Консультант 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программист стажер 1С
Нижний Новгород
зарплата от 30 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству