Суммирование в цикле

1. a3a 15 20.04.17 11:34 Сейчас в теме
Коллеги, на ровном месте произошел затык, т.е. застрял в одной простой задачке. Вроде бы элементарно но пока не получается, поомгите советом или направление дайте.

Задача:
Имеем переменную например:
ОпределеннаяСумма = 150000;

Нужно из ТЧ документа собирать в массив построчно товары сумма которых при суммировании либо равно либо не превышает вышеуказанную переменную.
Если при суммировании Сумма превышает переменную, то данная строка попадает в следующую строку массива.
Если в одной строке сумма превышает переменную то эту строчку разбиваем (делим) на переменную и добавляем в массив.

уже 2 часа сижу, идей пока нету =))
По теме из базы знаний
Найденные решения
7. Xershi 1484 20.04.17 12:40 Сейчас в теме
(5) выгружаешь ТЧ в ТЗ и добавляешь колонку порядок. Когда сумма превышает, то порядок увеличиваешь и все потом по ТЧ с порядком формируешь нужное количество заказов.
корум; herfis; +2 Ответить
6. herfis 499 20.04.17 12:35 Сейчас в теме
Тогда типа такого (массив таблиц значений нужен, как минимум):

МассивТЧ = Новый Массив;

ПределПоСумме = 150000;
СуммаПоТекущейТЧ = 0;
ТекущаяТЧ = Неопределено;
Для Каждого СтрокаТаблицы Из ОбщаяТаблицаТоваров Цикл
   Если СуммаПоТекущейТЧ + СтрокаТаблицы.Сумма > ПределПоСумме ИЛИ ТекущаяТЧ = Неопределено Тогда
      ТекущаяТЧ = Новый ТаблицаЗначений;
      ТекущаяТЧ.Колонки.Добавить("Номенклатура");
      ТекущаяТЧ.Колонки.Добавить("Сумма");
      МассивТЧ.Добавить(ТекущаяТЧ);
      СуммаПоТекущейТЧ = 0;
   КонецЕсли;
   СтрокаТЧ = ТекущаяТЧ.Добавить();
   СтрокаТЧ.Номенклатура = СтрокаТаблицы.Номенклатура;
   СтрокаТЧ.Сумма = СтрокаТаблицы.Сумма;
   СуммаПоТекущейТЧ = СуммаПоТекущейТЧ + СтрокаТаблицы.Сумма;
КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spezc 782 20.04.17 11:45 Сейчас в теме
жесть описание задачи))) в массив что надо складывать? элементы номенклатуры или суммы?
"если при суммировании... в следующую строку массива" - а до этого, в предыдущую строку массива что складывалось?

приведите пример хоть)
3. herfis 499 20.04.17 11:58 Сейчас в теме
Обожаю, когда вместо описания задачи пытаются описывать свои потуги ее решить. И потом спрашивают в стиле "что я делаю не так, когда ту штуковину заталдыкиваю в эту ерундовину?"
Что сделать-то хочешь? Сформировать пачку накладных с ограничением по сумме? Сформулируй человеческим языком. Так, чтобы человек с улицы мог понять твою проблему.
Diego_Iv; alex-l19041; +2 Ответить
4. a3a 15 20.04.17 12:11 Сейчас в теме
(3)
Сформировать пачку накладных с ограни


да, именно.
5. a3a 15 20.04.17 12:18 Сейчас в теме
Сформировать пачку накладных с ограничением по сумме.

т.е. есть заказы с большим количестом товаров и суммой. Их надо разбить на накладные не превышающие определенную сумму (указывается в переменной).
7. Xershi 1484 20.04.17 12:40 Сейчас в теме
(5) выгружаешь ТЧ в ТЗ и добавляешь колонку порядок. Когда сумма превышает, то порядок увеличиваешь и все потом по ТЧ с порядком формируешь нужное количество заказов.
корум; herfis; +2 Ответить
9. herfis 499 20.04.17 12:51 Сейчас в теме
(7) Так звучит даже лучше, но на практике редко получается. Обычно удобно передавать готовые структуры в отдельные процедуры формирования документов или вроде того. Т.е. иметь прообразы документов отдельными сущностями.
12. Xershi 1484 20.04.17 14:11 Сейчас в теме
(9) зато в голове порядок и наглядно.
6. herfis 499 20.04.17 12:35 Сейчас в теме
Тогда типа такого (массив таблиц значений нужен, как минимум):

МассивТЧ = Новый Массив;

ПределПоСумме = 150000;
СуммаПоТекущейТЧ = 0;
ТекущаяТЧ = Неопределено;
Для Каждого СтрокаТаблицы Из ОбщаяТаблицаТоваров Цикл
   Если СуммаПоТекущейТЧ + СтрокаТаблицы.Сумма > ПределПоСумме ИЛИ ТекущаяТЧ = Неопределено Тогда
      ТекущаяТЧ = Новый ТаблицаЗначений;
      ТекущаяТЧ.Колонки.Добавить("Номенклатура");
      ТекущаяТЧ.Колонки.Добавить("Сумма");
      МассивТЧ.Добавить(ТекущаяТЧ);
      СуммаПоТекущейТЧ = 0;
   КонецЕсли;
   СтрокаТЧ = ТекущаяТЧ.Добавить();
   СтрокаТЧ.Номенклатура = СтрокаТаблицы.Номенклатура;
   СтрокаТЧ.Сумма = СтрокаТаблицы.Сумма;
   СуммаПоТекущейТЧ = СуммаПоТекущейТЧ + СтрокаТаблицы.Сумма;
КонецЦикла;
Показать
10. a3a 15 20.04.17 12:52 Сейчас в теме
(6) Примерно понял, буду копать спасибо.
8. herfis 499 20.04.17 12:45 Сейчас в теме
Если могут быть строки заказов, сами по себе превышающие предел по сумме, то проще всего разбить такие строки заранее на несколько строк, вписывающихся в предел. Если появятся дополнительные условия, то задачка может превратиться в полноценную задачу комбинаторной оптимизации. Т.н. "задачу рюкзака". Так и гуглишь "задача о рюкзаке" или "задача о ранце".
11. herfis 499 20.04.17 12:59 Сейчас в теме
Хотя, если подумать, такой подход я тоже нередко юзаю в комбинации с таким (пусть не сильно оптимальным, зато наглядным):

Для Каждого Критерий Из ПолучитьМассивБезДублей(ИсходнаяТаблица.ВыгрузитьКолонку("Критерий")) Цикл
   ТаблицаКритерия = ИсходнаяТаблица.Скопировать(Новый Структура("Критерий", Критерий));
   ....
КонецЦикла;
13. a3a 15 21.04.17 08:17 Сейчас в теме
Спасибо ребята что дали направление, в итоге как в 7 после в тз обработал все строки, и те которые сами по себе превышают разбил, далее использовал пост 6, в ТЗ закинул, в конце концов из ТЗ начал создавать документы.
14. dj_serega 391 21.04.17 10:12 Сейчас в теме
(13) Ну так отметь, пожалуйста, что помогло или выложите пример решения для будущего поколения.
Оставьте свое сообщение

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