Имя: Пароль:
1C
1С v8
туплю ... общий алгоритм
,
0 lamme
 
05.11.13
16:34
Есть некая сумма. Скажем 30 000
Есть некая ТЗ с колонкой Сумма. Строк - неограниченное кол-во.
Надо выбрать строки (перебор с верху вниз) на сумму 30 000
То что выбрано - или удалить или обнулить сумму в строке
та строка которая с остатком - ну в нее вывести остаток ...
1 lamme
 
05.11.13
16:35
знаю - что элементарно .. но чего то пиндыр ...
2 Быдло замкадное
 
05.11.13
16:36
перебором...
3 Ksandr
 
05.11.13
16:36
НайтиСтроки
4 Ksandr
 
05.11.13
16:36
а, не правильно понял. Перебором проще всего. Можно запрос с нарастающим итогом
5 Быдло замкадное
 
05.11.13
16:37
процедуры ПеребратьСНизуВверхОбнулениеДоПредела в платформе точно нет
6 МихаилМ
 
05.11.13
16:37
7 pessok
 
05.11.13
16:38
Сумма = 0;
МассивСтрок = Новый Массив;
ит = Тч.количество()-1
Пока Сумма <= 30000 Цикл
МассивСтрок.Добавить(тч[ит]);
сумма = сумма = тч[ит];
ит = ит + 1;
КонецЦикла;
8 Пенза58
 
05.11.13
16:38
(0) Сумма должна быть ровно 30000 ?

или когда сумма строк будет больше 30000?
9 pessok
 
05.11.13
16:38
сумма = сумма + тч[ит] есессно
10 pessok
 
05.11.13
16:38
мля :) тч[ит].сумма;

пора домой, сложный вторнедельник
11 Пенза58
 
05.11.13
16:38
сумма = сумма + тч[ит].сумма
12 lamme
 
05.11.13
16:39
уху .. делаю перебором

НекаяЗакрСумма=30000;

для каждого Стр из ТаблицаЗадолженностей_Копия цикл
СуммаТЧ = Стр.Сумма;
ОстатокОтЗакрСуммы = НекаяЗакрСумма -СуммаТЧ
Стр.Сумма = 0; // обнуляем ту строку кот уже использована
Если СуммаТЧ<=0 тогда
Стр.Сумма = ОстатокОтЗакрСуммы
прервать
конецесли;



конеццикла;
13 pessok
 
05.11.13
16:39
(11) угу, и ит = ит - 1;
14 lamme
 
05.11.13
16:39
(8)
когда больше.
ровно - это идеально .. но такого редко
15 pessok
 
05.11.13
16:40
(14) см (7) + (10)/(11) + (13)
16 lamme
 
05.11.13
16:42
(15)
гы


уху
17 Serg_1960
 
05.11.13
16:42
Хмм...не так всё просто. Порядок строк важен (точнее - суммы, которые в этих строках). И если нужно минимизировать остаток - вопрос о порядке подбора/отбора строк становится первоочередным и принципиальным.
18 pessok
 
05.11.13
16:42
(17) ТЧ.Сортировать("Сумма Убыв")?
19 Serginio1
 
05.11.13
16:43
Можно сначала выбрать бинарным поиском на меньше или равно на нужное значение до тех пор пока сумма будет меньше нужной.
20 Serginio1
 
05.11.13
16:45
Но вообще это задача рюкзака
wiki:%C7%E0%E4%E0%F7%E0_%EE_%F0%E0%ED%F6%E5
21 lamme
 
05.11.13
16:46
(20)
чего так сложно то ...
22 Serginio1
 
05.11.13
17:03
(21) Ну попробуй для начала 19. Это для 7 ки. Приложи его для 8 ки. (Нумерация с 0 по Количество()-1 )
Функция НайтиЗначениеПоловиннымДелением(Тз,Цена)
    
    Левое=1;
Правое=Тз.КоличествоСтрок();
Пока 1=1 Цикл

Вычитаемое=Макс(Цел((Правое-Левое)/2),1);
Середина=Правое-Вычитаемое;
РасчетнаяЦена= Тз.ПолучитьЗначение(Середина,"Цена");
if Цена<РасчетнаяЦена then
    Правое=Середина
else
    Левое=Середина;
КонецЕсли;

if Цена=РасчетнаяЦена Тогда
    Тз.ПолучитьСтрокуПоНомеру(Середина);
    возврат Середина
КонецЕсли;    

Если  (Правое-Левое)<=1 Тогда
    Прервать;
КонецЕсли;    
КонецЦикла;


Тз.ПолучитьСтрокуПоНомеру(левое);
Возврат левое;

КонецФункции // НайтиЗначениеПоловиннымДелением
23 Serginio1
 
06.11.13
10:29
22 Да там нужно сделать еще краевую проверку
Если Правое=Тз.КоличествоСтрок() Тогда
Если Тз.ПолучитьЗначение(Правое,"Цена")<=Цена Тогда
Тз.ПолучитьСтрокуПоНомеру(правое);
    возврат правое

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