Коллеги, добрый день, подскажите пожалуйста, суть в чем есть запрос, который получает остатки по разным организациям, например Товар1 КоличествоОстаток = 2 шт Организация1 и Товар1 КоличествоОстаток = 1шт Организация2, в общем итоге на остатках по складу 3 шт. В обработке запросом я получаю эти данные и на основании этих данных мне необходимо заполнить таблицу по количеству которое требуется, т.е. в цикле я получил Товар 1 Организация 1 КоличествоОстаток = 2, а переместить мне необходимо 1 шт., т.е. если в итоговую таблицу переместилось нужное количество, то по данному товару надо прервать цикл, и другая ситуация если КоличествоОстаток = 2 по одной Организации и КоличествоОстаток = 1 шт. по другой организации и надо переместить допустим 4 шт, то надо переместить 2 шт. по одной организации и 1 шт. по другой, т.е получается что надо высчитывать оставшееся количество для перемещения, помогите пожалуйста не могу настроить алгоритм в цикле?
---
```1c
    Для Каждого Стр Из ТаблицаТребуется Цикл

    ОсталосьСписать = Стр.Количество;

    ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));

    Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл

    Если СтрОстаток.КоличествоОстаток <= 0 Тогда
    Продолжить;
    КонецЕсли;

    НоваяСтрока = ТаблицаСписаний.Добавить();
    НоваяСтрока.Номенклатура = Стр.Номенклатура;
    НоваяСтрока.Организация = СтрОстаток.Организация;

    КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
    НоваяСтрока.Количество = КоличествоСписать;

    СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
    ОсталосьСписать = ОсталосьСписать - КоличествоСписать;

    Если ОсталосьСписать = 0 Тогда
    Прервать;
    КонецЕсли;

    КонецЦикла;

    Если ОсталосьСписать > 0 Тогда
    НоваяСтрока = ТаблицаСписаний.Добавить();
    НоваяСтрока.Номенклатура = Стр.Номенклатура;
    НоваяСтрока.Количество = ОсталосьСписать;
    КонецЕсли;

    КонецЦикла;
```
---
145 слов, 805 знаков без пробелов и все это в целых двух предложениях.

А мы пытаемся научить народ прозрачный и понятный код писать, эх...
---
Код вот такой:

```1c
    Пока Выборка.Следующий() Цикл
    Если Выборка.Количество < 0 Тогда
    Продолжить;
    КонецЕсли;
    Если Выборка.Количество <= Выборка.КоличествоДляПеремещения Тогда
    Данные = Объект.Данные.Добавить();
    Данные.Номенклатура = Выборка.Номенклатура;
    Данные.Организация = Выборка.Организация;
    Данные.Склад = Объект.СкладОтправитель;
    Данные.Количество = Выборка.Количество;
    Если Выборка.КоличествоДляПеремещения > 0 Тогда
    Требуется = Выборка.КоличествоДляПеремещения - Выборка.Количество;
    Иначе;
    Прервать;
    КонецЕсли;
    ИначеЕсли Выборка.Количество >= Выборка.КоличествоДляПеремещения Тогда
    Данные = Объект.Данные.Добавить();
    Данные.Номенклатура = Выборка.Номенклатура;
    Данные.Организация = Выборка.Организация;
    Данные.Склад = Объект.СкладОтправитель;
    Данные.Количество = Требуется;
    КонецЕсли;

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

Где Выборка.Количество это КоличествоОстаток, а КоличествоДляПеремещения это то количество которое должно попасть в итоговую таблицу, вся проблема в том что в цикле идет обход по нескольким организациям, и когда проходит одну организацию, а потом другую то получается что КоличествоДляПеремещения проверяет снова.
---
```1c
    Для Каждого Стр Из ТаблицаТребуется Цикл

    ОсталосьСписать = Стр.Количество;

    ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));

    Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл

    Если СтрОстаток.КоличествоОстаток <= 0 Тогда
    Продолжить;
    КонецЕсли;

    НоваяСтрока = ТаблицаСписаний.Добавить();
    НоваяСтрока.Номенклатура = Стр.Номенклатура;
    НоваяСтрока.Организация = СтрОстаток.Организация;

    КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
    НоваяСтрока.Количество = КоличествоСписать;

    СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
    ОсталосьСписать = ОсталосьСписать - КоличествоСписать;

    Если ОсталосьСписать = 0 Тогда
    Прервать;
    КонецЕсли;

    КонецЦикла;

    Если ОсталосьСписать > 0 Тогда
    НоваяСтрока = ТаблицаСписаний.Добавить();
    НоваяСтрока.Номенклатура = Стр.Номенклатура;
    НоваяСтрока.Количество = ОсталосьСписать;
    КонецЕсли;

    КонецЦикла;
```
---
Все получилось, спасибо Вам огромное!
---
Сообщение было скрыто модератором.
---
1) Про индексы согласен, думал, это само собой разумеется. про свернуть – виртуальная таблица Остатки и так сворачивает по выбранным измерениям.
2) Я лишь хотел подсветить момент, когда количества на остатках может не хватать. Что в этом случае делать, решать автору. Зависит от того, какая логика используется для контроля остатков. Лично я всегда за то чтобы списывать в минус.
(7) В этом условии нет смысла, так как если после цикла ОсталосьСписать > 0, можно быть уверенным, что остатков по текущей номенклатуре нет.
---
Сообщение было скрыто модератором.
---
Да, там условие пришлось дописать Если ОсталосьСписать > 0 И СтрОстаток.Количество > 0 Тогда В этом случает все функционирует как надо. Спасибо еще раз Slava Kron!
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.
---
Сообщение было скрыто модератором.