Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Коллеги, добрый день, подскажите пожалуйста, суть в чем есть запрос, который получает остатки по разным организациям, например Товар1 КоличествоОстаток = 2 шт Организация1 и Товар1 КоличествоОстаток = 1шт Организация2, в общем итоге на остатках по складу 3 шт. В обработке запросом я получаю эти данные и на основании этих данных мне необходимо заполнить таблицу по количеству которое требуется, т.е. в цикле я получил Товар 1 Организация 1 КоличествоОстаток = 2, а переместить мне необходимо 1 шт., т.е. если в итоговую таблицу переместилось нужное количество, то по данному товару надо прервать цикл, и другая ситуация если КоличествоОстаток = 2 по одной Организации и КоличествоОстаток = 1 шт. по другой организации и надо переместить допустим 4 шт, то надо переместить 2 шт. по одной организации и 1 шт. по другой, т.е получается что надо высчитывать оставшееся количество для перемещения, помогите пожалуйста не могу настроить алгоритм в цикле?
По теме из базы знаний
- Подсчёт и отображение количества строк в динамическом списке
- Как вывести итоговый вес и объем на форму документа Заказ клиента. УТ 11.4
- Концепция ORM как двигатель прогресса - выдержит ли ее ваша СУБД?
- Как готовить и есть массивы
- Как автоматизация приносит деньги? Два практических примера повышения эффективности за счёт внедрения программных продуктов
Найденные решения
Для Каждого Стр Из ТаблицаТребуется Цикл
ОсталосьСписать = Стр.Количество;
ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл
Если СтрОстаток.КоличествоОстаток <= 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаСписаний.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.Организация = СтрОстаток.Организация;
КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
НоваяСтрока.Количество = КоличествоСписать;
СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
ОсталосьСписать = ОсталосьСписать - КоличествоСписать;
Если ОсталосьСписать = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если ОсталосьСписать > 0 Тогда
НоваяСтрока = ТаблицаСписаний.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.Количество = ОсталосьСписать;
КонецЕсли;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Код вот такой:
Где Выборка.Количество это КоличествоОстаток, а КоличествоДляПеремещения это то количество которое должно попасть в итоговую таблицу, вся проблема в том что в цикле идет обход по нескольким организациям, и когда проходит одну организацию, а потом другую то получается что КоличествоДляПеремещения проверяет снова.
Пока Выборка.Следующий() Цикл
Если Выборка.Количество < 0 Тогда
Продолжить;
КонецЕсли;
Если Выборка.Количество <= Выборка.КоличествоДляПеремещения Тогда
Данные = Объект.Данные.Добавить();
Данные.Номенклатура = Выборка.Номенклатура;
Данные.Организация = Выборка.Организация;
Данные.Склад = Объект.СкладОтправитель;
Данные.Количество = Выборка.Количество;
Если Выборка.КоличествоДляПеремещения > 0 Тогда
Требуется = Выборка.КоличествоДляПеремещения - Выборка.Количество;
Иначе;
Прервать;
КонецЕсли;
ИначеЕсли Выборка.Количество >= Выборка.КоличествоДляПеремещения Тогда
Данные = Объект.Данные.Добавить();
Данные.Номенклатура = Выборка.Номенклатура;
Данные.Организация = Выборка.Организация;
Данные.Склад = Объект.СкладОтправитель;
Данные.Количество = Требуется;
КонецЕсли;
КонецЦикла;
ПоказатьГде Выборка.Количество это КоличествоОстаток, а КоличествоДляПеремещения это то количество которое должно попасть в итоговую таблицу, вся проблема в том что в цикле идет обход по нескольким организациям, и когда проходит одну организацию, а потом другую то получается что КоличествоДляПеремещения проверяет снова.
Для Каждого Стр Из ТаблицаТребуется Цикл
ОсталосьСписать = Стр.Количество;
ОстаткиНоменклатуры = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Стр.Номенклатура));
Для Каждого СтрОстаток Из ОстаткиНоменклатуры Цикл
Если СтрОстаток.КоличествоОстаток <= 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаСписаний.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.Организация = СтрОстаток.Организация;
КоличествоСписать = Мин(ОсталосьСписать, СтрОстаток.КоличествоОстаток);
НоваяСтрока.Количество = КоличествоСписать;
СтрОстаток.КоличествоОстаток = СтрОстаток.КоличествоОстаток - КоличествоСписать;
ОсталосьСписать = ОсталосьСписать - КоличествоСписать;
Если ОсталосьСписать = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если ОсталосьСписать > 0 Тогда
НоваяСтрока = ТаблицаСписаний.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.Количество = ОсталосьСписать;
КонецЕсли;
КонецЦикла;
Показать
(6)
1) Про индексы согласен, думал, это само собой разумеется. про свернуть – виртуальная таблица Остатки и так сворачивает по выбранным измерениям.
2) Я лишь хотел подсветить момент, когда количества на остатках может не хватать. Что в этом случае делать, решать автору. Зависит от того, какая логика используется для контроля остатков. Лично я всегда за то чтобы списывать в минус.
(7) В этом условии нет смысла, так как если после цикла ОсталосьСписать > 0, можно быть уверенным, что остатков по текущей номенклатуре нет.
1) Про индексы согласен, думал, это само собой разумеется. про свернуть – виртуальная таблица Остатки и так сворачивает по выбранным измерениям.
2) Я лишь хотел подсветить момент, когда количества на остатках может не хватать. Что в этом случае делать, решать автору. Зависит от того, какая логика используется для контроля остатков. Лично я всегда за то чтобы списывать в минус.
(7) В этом условии нет смысла, так как если после цикла ОсталосьСписать > 0, можно быть уверенным, что остатков по текущей номенклатуре нет.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот