Как в цикле посчитать нужное количество

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. 5225688vd 12.01.23 12:14 Сейчас в теме
Коллеги, добрый день, подскажите пожалуйста, суть в чем есть запрос, который получает остатки по разным организациям, например Товар1 КоличествоОстаток = 2 шт Организация1 и Товар1 КоличествоОстаток = 1шт Организация2, в общем итоге на остатках по складу 3 шт. В обработке запросом я получаю эти данные и на основании этих данных мне необходимо заполнить таблицу по количеству которое требуется, т.е. в цикле я получил Товар 1 Организация 1 КоличествоОстаток = 2, а переместить мне необходимо 1 шт., т.е. если в итоговую таблицу переместилось нужное количество, то по данному товару надо прервать цикл, и другая ситуация если КоличествоОстаток = 2 по одной Организации и КоличествоОстаток = 1 шт. по другой организации и надо переместить допустим 4 шт, то надо переместить 2 шт. по одной организации и 1 шт. по другой, т.е получается что надо высчитывать оставшееся количество для перемещения, помогите пожалуйста не могу настроить алгоритм в цикле?
По теме из базы знаний
Найденные решения
3. SlavaKron 12.01.23 13:03 Сейчас в теме
Для Каждого Стр Из ТаблицаТребуется Цикл
	
	ОсталосьСписать = Стр.Количество;
	
	ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
	
	Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл
		
		Если СтрОстаток.КоличествоОстаток <= 0 Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяСтрока = ТаблицаСписаний.Добавить();
		НоваяСтрока.Номенклатура = Стр.Номенклатура;
		НоваяСтрока.Организация = СтрОстаток.Организация;
		
		КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
		НоваяСтрока.Количество = КоличествоСписать;
		
		СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
		ОсталосьСписать = ОсталосьСписать - КоличествоСписать;
		
		Если ОсталосьСписать = 0 Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ОсталосьСписать > 0 Тогда
		НоваяСтрока = ТаблицаСписаний.Добавить();
		НоваяСтрока.Номенклатура = Стр.Номенклатура;
		НоваяСтрока.Количество = ОсталосьСписать;
	КонецЕсли;
	
КонецЦикла;
Показать
user1881120; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. user1863362 12.01.23 13:05 Сейчас в теме
145 слов, 805 знаков без пробелов и все это в целых двух предложениях.

А мы пытаемся научить народ прозрачный и понятный код писать, эх...
Fatenm; user1881120; +2 Ответить
2. 5225688vd 12.01.23 12:56 Сейчас в теме
Код вот такой:
Пока Выборка.Следующий() Цикл
		Если Выборка.Количество < 0 Тогда
			Продолжить;
		КонецЕсли;
		Если Выборка.Количество <= Выборка.КоличествоДляПеремещения Тогда
			Данные = Объект.Данные.Добавить();
			Данные.Номенклатура = Выборка.Номенклатура;
			Данные.Организация = Выборка.Организация;
			Данные.Склад = Объект.СкладОтправитель;
			Данные.Количество = Выборка.Количество;
			Если Выборка.КоличествоДляПеремещения > 0 Тогда
				Требуется = Выборка.КоличествоДляПеремещения - Выборка.Количество;
				Иначе;
            Прервать;
        КонецЕсли;
		ИначеЕсли  Выборка.Количество >= Выборка.КоличествоДляПеремещения  Тогда
			Данные = Объект.Данные.Добавить();
			Данные.Номенклатура = Выборка.Номенклатура;
			Данные.Организация = Выборка.Организация;
			Данные.Склад = Объект.СкладОтправитель;
			Данные.Количество = Требуется;
		КонецЕсли;
		
	КонецЦикла;
Показать

Где Выборка.Количество это КоличествоОстаток, а КоличествоДляПеремещения это то количество которое должно попасть в итоговую таблицу, вся проблема в том что в цикле идет обход по нескольким организациям, и когда проходит одну организацию, а потом другую то получается что КоличествоДляПеремещения проверяет снова.
3. SlavaKron 12.01.23 13:03 Сейчас в теме
Для Каждого Стр Из ТаблицаТребуется Цикл
	
	ОсталосьСписать = Стр.Количество;
	
	ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
	
	Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл
		
		Если СтрОстаток.КоличествоОстаток <= 0 Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяСтрока = ТаблицаСписаний.Добавить();
		НоваяСтрока.Номенклатура = Стр.Номенклатура;
		НоваяСтрока.Организация = СтрОстаток.Организация;
		
		КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
		НоваяСтрока.Количество = КоличествоСписать;
		
		СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
		ОсталосьСписать = ОсталосьСписать - КоличествоСписать;
		
		Если ОсталосьСписать = 0 Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ОсталосьСписать > 0 Тогда
		НоваяСтрока = ТаблицаСписаний.Добавить();
		НоваяСтрока.Номенклатура = Стр.Номенклатура;
		НоваяСтрока.Количество = ОсталосьСписать;
	КонецЕсли;
	
КонецЦикла;
Показать
user1881120; +1 Ответить
5. 5225688vd 12.01.23 13:56 Сейчас в теме
(3)Все получилось, спасибо Вам огромное!
6. пользователь 12.01.23 14:24
Сообщение было скрыто модератором.
...
12. SlavaKron 12.01.23 15:23 Сейчас в теме
(6)
1) Про индексы согласен, думал, это само собой разумеется. про свернуть – виртуальная таблица Остатки и так сворачивает по выбранным измерениям.
2) Я лишь хотел подсветить момент, когда количества на остатках может не хватать. Что в этом случае делать, решать автору. Зависит от того, какая логика используется для контроля остатков. Лично я всегда за то чтобы списывать в минус.
(7) В этом условии нет смысла, так как если после цикла ОсталосьСписать > 0, можно быть уверенным, что остатков по текущей номенклатуре нет.
13. пользователь 12.01.23 15:42
Сообщение было скрыто модератором.
...
7. 5225688vd 12.01.23 14:31 Сейчас в теме
(6)Да, там условие пришлось дописать Если ОсталосьСписать > 0 И СтрОстаток.Количество > 0 Тогда В этом случает все функционирует как надо. Спасибо еще раз Slava Kron!
8. пользователь 12.01.23 14:43
Сообщение было скрыто модератором.
...
9. пользователь 12.01.23 14:54
Сообщение было скрыто модератором.
...
10. пользователь 12.01.23 14:58
Сообщение было скрыто модератором.
...
14. пользователь 12.01.23 15:54
Сообщение было скрыто модератором.
...
11. пользователь 12.01.23 15:02
Сообщение было скрыто модератором.
...
15. пользователь 12.01.23 17:22
Сообщение было скрыто модератором.
...
16. пользователь 12.01.23 17:28
Сообщение было скрыто модератором.
...
18. пользователь 13.01.23 06:05
Сообщение было скрыто модератором.
...
19. пользователь 13.01.23 08:20
Сообщение было скрыто модератором.
...
20. пользователь 13.01.23 09:05
Сообщение было скрыто модератором.
...
21. пользователь 13.01.23 09:22
Сообщение было скрыто модератором.
...
17. пользователь 12.01.23 21:11
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот