Имя: Пароль:
1C
1С v8
Списание по партиям запросом
0 BolshoySmal
 
27.01.20
23:13
Доброй ночи Коллеги.
Пытаюсь решить Вот такую задачу
Имеются две таблицы. Первая содержит остатки товара на складах: товар, склад, количество. Вторая содержит потребность контрагента в товарах: дата потребности, товар, контрагент, количество. Необходимо запросом получить таблицу, в которой будет распределение количества товара на складах между контрагентами, позволяющее сделать резерв, максимально удовлетворив контрагентов с минимальной датой потребности. Входные параметры для запроса – обе таблицы.



Таблица1


Товар1                 Склад1                10

Товар2                 Склад1                20

Товар2                 Склад3                15



Таблица2



01.01.20               Товар1                 Контрагент1     12

02.02.20               Товар1                 Контрагент2     5

03.01.20               Товар2                 Контрагент2     25



Результат

Товар1                 Контрагент1     Склад1                10

Товар1                 Контрагент1                           2

Товар1                 Контрагент2                           5

Товар2                 Контрагент2     Склад1                20

Товар2                 Контрагент2     Склад3                5

Подскажите,как решить.
Таблицы я заружаю.
Сводные остатки по партияи (таблица 1 я получаю)
А как сделать правильное соединение с таблицей 2 я не знаю. Понимаю, что должно быть соединение таблицы самой с собой и выбор остатка Сумма по партиям (1 таблица) и потребность 2 таблица ,но по каким правлиам мне не совсем понятно.
Брал за основу http://catalog.mista.ru/public/270186/,но тут немного не то что у меня.
Опыта решения подобных задач нет совсем.
Заранее спасибо.
1 PCcomCat
 
27.01.20
23:35
(0) Думаю, что такое одним запросом не решить. Можно посмотреть алгоритм заполнения документа возврата на основании поступления с учетом остатков, например, в УПП. Нужно нечто подобное. Т.е. соединить все остатки со всеми потребностями, отсортировать по убыванию по дате потребности, а затем регулировать остатками.
2 catena
 
28.01.20
05:48
Скажите, плз, почему такое острое желание сделать это именно запросом?
3 DEVIce
 
28.01.20
05:59
(2) Так все говорят, что надо одним запросом чтобы все делалось, иначе это плохой стиль программирования. Были бы доступны курсоры скулевые, можно было бы одним запросом. :)
4 1ctube
 
28.01.20
06:07
(3)  "курсоры скулевые"
Что это?
5 catena
 
28.01.20
06:07
(3)Кто эти все и где они это говорят?
6 DEVIce
 
28.01.20
06:20
(4) Это не важно. В 1С ими все-равно нельзя пользоваться.
7 DEVIce
 
28.01.20
06:21
(5) Ты как будто первый день на свете живешь.
8 catena
 
28.01.20
06:32
(7)Как раз наоборот, стадию "ТолькоЗапросыТолькоХардкор" я уже пережила) Надо из новичков это выбивать как можно скорее.
9 d4rkmesa
 
28.01.20
08:54
(1) Да не, тут, кажется, у ТС задача-челлендж, а не банальное списание по партиям. Как по мне, "назвался груздем...". Какой смысл спрашивать на форуме?
10 Ненавижу 1С
 
гуру
28.01.20
09:03
не надо только про не оптимальность использования сервера мне говорить:


ВЫБРАТЬ
    "Товар1" КАК Товар,
    "Склад1" КАК Склад,
    10 КАК Количество
ПОМЕСТИТЬ Остатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Товар2",
    "Склад1",
    20

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Товар2",
    "Склад3",
    15
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДАТАВРЕМЯ(2020, 1, 1) КАК Дата,
    "Товар1" КАК Товар,
    "Контрагент1" КАК Контрагент,
    12 КАК Количество
ПОМЕСТИТЬ Заказы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2020, 2, 2),
    "Товар1",
    "Контрагент2",
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2020, 1, 3),
    "Товар2",
    "Контрагент2",
    25
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Остатки.Товар,
    СУММА(Остатки.Количество) КАК Количество
ПОМЕСТИТЬ ОстаткиОбщие
ИЗ
    Остатки КАК Остатки

СГРУППИРОВАТЬ ПО
    Остатки.Товар
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Заказы.Товар,
    СУММА(Заказы.Количество) КАК Количество
ПОМЕСТИТЬ ЗаказыОбщие
ИЗ
    Заказы КАК Заказы

СГРУППИРОВАТЬ ПО
    Заказы.Товар
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказыОбщие.Товар,
    ЕСТЬNULL(ОстаткиОбщие.Количество, 0) КАК КоличествоОт,
    ЗаказыОбщие.Количество КАК КоличествоДо
ПОМЕСТИТЬ КоридорДефицита
ИЗ
    ЗаказыОбщие КАК ЗаказыОбщие
        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиОбщие КАК ОстаткиОбщие
        ПО ЗаказыОбщие.Товар = ОстаткиОбщие.Товар
ГДЕ
    ЗаказыОбщие.Количество > ЕСТЬNULL(ОстаткиОбщие.Количество, 0)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Заказы.Дата КАК Дата,
    Заказы.Товар КАК Товар,
    Заказы.Контрагент КАК Контрагент,
    ЕСТЬNULL(СУММА(Заказы1.Количество), 0) КАК КоличествоОт,
    ЕСТЬNULL(СУММА(Заказы1.Количество), 0) + Заказы.Количество КАК КоличествоДо
ПОМЕСТИТЬ ЗаказыНарастающе
ИЗ
    Заказы КАК Заказы
        ЛЕВОЕ СОЕДИНЕНИЕ Заказы КАК Заказы1
        ПО Заказы.Товар = Заказы1.Товар
            И (Заказы.Дата > Заказы1.Дата
                ИЛИ Заказы.Дата = Заказы1.Дата
                    И Заказы.Контрагент > Заказы1.Контрагент)

СГРУППИРОВАТЬ ПО
    Заказы.Контрагент,
    Заказы.Дата,
    Заказы.Товар,
    Заказы.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Остатки.Товар КАК Товар,
    Остатки.Склад КАК Склад,
    ЕСТЬNULL(СУММА(Остатки1.Количество), 0) КАК КоличествоОт,
    ЕСТЬNULL(СУММА(Остатки1.Количество), 0) + Остатки.Количество КАК КоличествоДо
ПОМЕСТИТЬ ОстаткиНарастающе
ИЗ
    Остатки КАК Остатки
        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки1
        ПО Остатки.Товар = Остатки1.Товар
            И Остатки.Склад > Остатки1.Склад

СГРУППИРОВАТЬ ПО
    Остатки.Склад,
    Остатки.Товар,
    Остатки.Количество

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    КоридорДефицита.Товар,
    NULL,
    КоридорДефицита.КоличествоОт,
    КоридорДефицита.КоличествоДо
ИЗ
    КоридорДефицита КАК КоридорДефицита
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказыНарастающе.Дата КАК Дата,
    ЗаказыНарастающе.Товар КАК Товар,
    ЗаказыНарастающе.Контрагент КАК Контрагент,
    ОстаткиНарастающе.Склад КАК Склад,
    ВЫБОР
        КОГДА ЗаказыНарастающе.КоличествоДо < ОстаткиНарастающе.КоличествоДо
            ТОГДА ЗаказыНарастающе.КоличествоДо
        ИНАЧЕ ОстаткиНарастающе.КоличествоДо
    КОНЕЦ - ВЫБОР
        КОГДА ЗаказыНарастающе.КоличествоОт > ОстаткиНарастающе.КоличествоОт
            ТОГДА ЗаказыНарастающе.КоличествоОт
        ИНАЧЕ ОстаткиНарастающе.КоличествоОт
    КОНЕЦ КАК Количество
ИЗ
    ЗаказыНарастающе КАК ЗаказыНарастающе
        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНарастающе КАК ОстаткиНарастающе
        ПО ЗаказыНарастающе.Товар = ОстаткиНарастающе.Товар
            И ЗаказыНарастающе.КоличествоОт < ОстаткиНарастающе.КоличествоДо
            И ЗаказыНарастающе.КоличествоДо > ОстаткиНарастающе.КоличествоОт
11 BolshoySmal
 
28.01.20
10:27
Ненавижу 1С  - спасибо огромное. Должен буду как земля колхозу !!!