Коллеги подскажите алгоритм последовательного уменьшения значений Таблицы1 значениями Таблицы2, результирующая Таблица3

Таблица1
1. Номенклатура1 2 Поле1
2. Номенклатура1 3 Поле2
3. Номенклатура2 1 Поле3
4. Номенклатура2 1 Поле4
5. Номенклатура2 1 Поле5

Таблица2
1. Номенклатура1 3
2. Номенклатура2 2

Таблица3
1. Номенклатура1 2 Поле2
2. Номенклатура2 1 Поле5
---
В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
---
По сути всё верно. Цикл без удаления строк просто с занулением такой :

```1c
    Для каждого Стр2 Из ТЗ2 Цикл

    Пока Стр2.Количество <> 0 Цикл

    Для Каждого Стр1 Из ТЗ1 Цикл

    Если Стр1.Номенклатура = Стр2.Номенклатура Тогда

    Если Стр1.Количество > Стр2.Количество Тогда

    Стр1.Количество = Стр1.Количество-Стр2.Количество;
    Стр2.Количество = 0;

    ИначеЕсли Стр1.Количество = Стр2.Количество Тогда

    Стр1.Количество = 0;
    Стр2.Количество = 0;

    ИначеЕсли Стр1.Количество < Стр2.Количество Тогда

    Стр2.Количество = Стр2.Количество-Стр1.Количество;
    Стр1.Количество = 0;

    КонецЕсли;
    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;
```

Глаза боятся, руки делают..
---
```1c
    Для каждого Стр2 Из ТЗ2 Цикл
    НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
    Кол_во = Стр2.Количество;
    Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
    Если Стр1.Количество < Кол_во Тогда
    Кол_во = Кол_во - Стр1.Количество;
    Стр1.Количество = 0;
    Иначе
    Стр1.Количество = Стр1.Количество - Кол_во;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
```
---
покрутил и так и так. не понял алгоритм который имеется ввиду, можно "на пальцах" пояснить?)
---
Принципиально уменьшать количество последовательно. Вычитаем строку 1 Таблицы2: сначала из первой строки Таблицы1, т. к. в первой строке колличество меньше вычитаемого, то первая строка Таблицы1 уходит в ноль, а оставшееся количество уже вычитаем из второй строки....
---
1) Запросами т.е. первые 2 тч загнать в запрос. там соединиться по ключевым полям, далее обходя результат запроса по группировке Номенклатура (как с партиями например, только тут не документ партии и номенклатура) , и формируем результирующий тз
2) в цикле обходим таблицу 2, находим строки по Номенклатуре в ТЗ1, уменьшаем количество пока наше количество из тз2 не станет равно 0, Потом удаляем строки из тз1 у которых количество = 0, можно сразу сформировать массив строк в первом цикле и потом обойти его и удалить строки, но тут надо аккуратно, отсортировать строки перед циклом в обеих ТЗ чтобы не удалить не ту строку случайно после удаления строки поднимаются и можно удалить не ту
---
каким боком тут Поле 1,2,3,4,5 ?
по какому закону вы его тулите в 3 таблицу?
---
представьте что 1 таблица это данные документа, 2 таблица это остатки в регистре. и надо получить то что осталось не списано после списание по партиям. поле 1,2.... не кое поле из тч документа например сумма Номенклатурная группа, статья затрат...
---
Совершенно не понятно....
КАК получается вот такой результат? Почему в результате Поле2 а не Поле 1 ?

Номенклатура1 2 Поле1
+ Номенклатура1 3 Поле2

- Номенклатура1 3

= Номенклатура1 2 Поле2
---
у нас 2 строки в первой таблице по номенклатура1, во второй количество = 3
идем по строкам 1 таблицы, из первой строки кол = 2 - 3 = - 1 т.е. кол в 1 строке считаем равно 0 и еще 1 остается от 3, во сторой строке вычитаем из кол = 3 - 1 = 2. эта строка остается в таблице т.к. ее количество <> 0 соответственно поле2, а не поле1 , если отсрортируется строки по другому то будет другой результат да. но в примере строки отсортированы так
---
С трудом разобрался в логике...
---
Я хочу услышать ответ автора... в (3)
---
Вы ввели сначала в заблуждение... Ибо в (2) ответ - супер...

Спасибо что откорректировали 2 на 3...
---
Да, извиняюсь, перепутал сначала.
---
В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
---
По сути всё верно. Цикл без удаления строк просто с занулением такой :

```1c
    Для каждого Стр2 Из ТЗ2 Цикл

    Пока Стр2.Количество <> 0 Цикл

    Для Каждого Стр1 Из ТЗ1 Цикл

    Если Стр1.Номенклатура = Стр2.Номенклатура Тогда

    Если Стр1.Количество > Стр2.Количество Тогда

    Стр1.Количество = Стр1.Количество-Стр2.Количество;
    Стр2.Количество = 0;

    ИначеЕсли Стр1.Количество = Стр2.Количество Тогда

    Стр1.Количество = 0;
    Стр2.Количество = 0;

    ИначеЕсли Стр1.Количество < Стр2.Количество Тогда

    Стр2.Количество = Стр2.Количество-Стр1.Количество;
    Стр1.Количество = 0;

    КонецЕсли;
    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;
```

Глаза боятся, руки делают..
---
Пока Стр2.Количество <> 0 Цикл - этот цикл лишний.
Если у вас вдруг в таблице 2 количество будет больше чем в таблице 1, то из-за этого будет бесконечный цикл.
А если меньше, то и без этого цикла все будет работать.
---
```1c
    Для каждого Стр2 Из ТЗ2 Цикл
    НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
    Кол_во = Стр2.Количество;
    Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
    Если Стр1.Количество < Кол_во Тогда
    Кол_во = Кол_во - Стр1.Количество;
    Стр1.Количество = 0;
    Иначе
    Стр1.Количество = Стр1.Количество - Кол_во;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
```
---
Остался вопрос о порядке строк в таблицах...
На основании чего устанавливается порядок следования строк?
Это очень важно, потому что если отнимать сначала от второй строки, то результат будет
Номенклатура1 2 Поле 1
Из за чего и возник изначально вопрос о способе получения Поля в результате...
---
да пусть будет положение луны в пространстве, алгоритм не изменится)
---
Привел вам пример если первая строка в 1 таблице - будет второй то результат будет другим...
, то есть положение луны меняет результат все же...
---
Согласен, результат разный, но алгоритм один, меняются исходные данные. аля списание партий по FIFO LIFO. именно алгоритм и просили подсказать