Имя: Пароль:
1C
 
Как перекинуть значение с одной строки ТЗ в другую строку, а эту удалить?
,
0 VID1234
 
14.12.21
18:25
Здравствуйте. Подскажите пожалуйста, как мне лучше написать код, чтобы при условии, если Число в определенной колонке меньше нужной, тогда это значение перенести на следующую строку, а эту строку удалить!
Пример: имеем 3 строки, в ней разные значения но в колонке число, следующие числа 2, 1, 5
При обходе строк,
КодВыделить
Если Стр.Число <5 Тогда
Переносим значение 2, в следующую строку или любую строку, кроме этой
ТЗ.Удалить(Стр)
Иначе
Продолжить;
КонецЕсли;
1 ГдеСобака Зарыта
 
14.12.21
18:31
Постановку задачи озвучь полностью. То что хочешь сделать ты попахивает ересью, и можно на костер отправится за такое
2 2S
 
14.12.21
18:31
Т.е. это не сортировка о_О?
3 VID1234
 
14.12.21
18:33
(1) мне нужно чтобы в таблице значений все данные были больше или равно 5, но общее число (итог) должен быть одинаков.
4 acanta
 
14.12.21
18:34
Переменная не нужна?
5 VID1234
 
14.12.21
18:35
(4) Да пробую только иногда пропускает строки!
Если ТЗ.Количество() > 1 Тогда
           ДляСохраненияЧасовОтУдаленнойСтроки = 0;
           Для Каждого СтрокиТЗ ИЗ ТЗ Цикл
             СтрокиТЗ.ЧасовНаПроект = СтрокиТЗ.ЧасовНаПроект + ДляСохраненияЧасовОтУдаленнойСтроки;
               ДляСохраненияЧасовОтУдаленнойСтроки = 0;
               Если СтрокиТЗ.ЧасовНаПроект < 8 Тогда
                   ДляСохраненияЧасовОтУдаленнойСтроки = СтрокиТЗ.ЧасовНаПроект;
                   ТЗ.Удалить(СтрокиТЗ);
                   Продолжить;
               Иначе
                   СтрокаТаблицыДоляЧасов = ТЗ_ДоляЧасовВПроекте.Добавить();
                   СтрокаТаблицыДоляЧасов.Сотрудник = НеРукиНК.Сотрудник;
                   СтрокаТаблицыДоляЧасов.Проект = СтрокиТЗ.Проект;
                    СтрокаТаблицыДоляЧасов.Часы = СтрокиТЗ.ЧасовНаПроект;
                   СтрокаТаблицыДоляЧасов.Сумма = НеРукиНК.Сумма;
                  
               КонецЕсли;
              
            КонецЦикла;
       КонецЕсли;
6 2S
 
14.12.21
18:36
Нихера не понял
Отсортируй и проверяй сумму на цел/5 >1
7 VID1234
 
14.12.21
18:37
(6) Как?
8 lEvGl
 
гуру
14.12.21
18:38
при удалении строк всегда надо цикл крутить через счетчик, если удалил, то счетчик не менять, и наоборот
9 lEvGl
 
гуру
14.12.21
18:38
для каждого цикл будет работать некорректно
10 lEvGl
 
гуру
14.12.21
18:39
(3) не понял, правда
11 lEvGl
 
гуру
14.12.21
18:40
что значит "общее число одинаков", сумма по всей таблице что ли
12 lEvGl
 
гуру
14.12.21
18:40
тогда это не перенос значения будет, а суммирование того что в строке уже есть + то что меньше 5 на текущей итерации
13 VID1234
 
14.12.21
18:42
(10) у нас в ТЗ в колонке Число куча цифр их итог 100, когда я уберу 1,2,3,4 из этой ТЗ сумма должна остаться 100, т.е. я допустим в переменную записал 1, в следующем цикле прибавил эту единицу к строке, ее обработал, если она меньше 5, то дальше и так далее!
14 VID1234
 
14.12.21
18:43
(12) если бы можно было так сделать, то было бы круто
Типа: если число меньше 5, то суммировать!
15 lEvGl
 
гуру
14.12.21
18:50
вцелом задача - чешуя какая то

как то так, приблизительно

Индекс = ТаблицаЗначений.Количество() - 1;
    Пока Индекс >= 0 Цикл  
        Если ТаблицаЗначений[Индекс].Число < 5 Тогда
            ТаблицаЗначений[Индекс - 1].Число = ТаблицаЗначений[Индекс + 1].Число + ТаблицаЗначений[Индекс].Число;
            ТаблицаЗначений.Удалить(Индекс);
        Иначе
            Индекс = Индекс - 1;
        КонецЕсли;
    КонецЦикла;
16 VID1234
 
14.12.21
18:52
(15) Хорошо, спасибо. попробую!
17 lEvGl
 
гуру
14.12.21
18:52
и предусмотреть ситуацию, когда индекс будет указывать на первую строку (тут идем с конца таблицы)
ТаблицаЗначений[Индекс - 1] вызовет ошибку получения строки
18 VID1234
 
14.12.21
18:57
(17) Это как так? Я так то не силен в индексах, а тут еще и предусмотреть что-то))))
19 acht
 
14.12.21
19:02
(18) Зачем тогда за заджчи берешся?
20 _Дайвер_
 
14.12.21
21:08
Я бы сделал по другому, через отборы.
Т.е. делаю 2 копии основной ТЗ
Далее в них делаю отбор по условию
Далее основную таблицу очищаю
Далее загружаю в нее ту таблицу по условию которой в ней должны остаться строки
Далее во второй копии ТЗ через получаю Итог("ИмяКолонки")
Далее суммирую этот итог с твоим конечным итогом(!!!не подвалом ТЧ!!!)
За решение и пример 5000 рублей
21 Ёпрст
 
14.12.21
23:34
(6) твоятаблтчка.сортировать("количество");
Массив = новый массив;
Количество =0;
Для каждоґо строкатаблички из табличка цикл
Едели строкатаблички.количестпо<условиеНаМинимальноеКоличество тогда
   Количество = Количество+строкатаблички.количество;
Массив.добавить(строкатабличкт);
Конецежели;
Для каждого элементмассива из массив
  Табличка.удалить(элементмассива)
Конеццикла
Табличка[0].количество =количкство +Табличка[0].количество

Условие на пустую табличку сам добавишь
22 Dmitry77
 
15.12.21
00:13
если постановка в (3) то тз.свернуть() - самое короткое решение
23 acht
 
15.12.21
00:14
(22) Вот только хотел написать =)
24 Pohoo
 
16.12.21
09:27
//Определим переменную, где будем хранить часы из строк, которые надо удалить
ОсталосьЧасовНаПроект = 0;

//Определим массив для хранения строк, которые нужно удалить
МассивСтрокДляУдаления = Новый Массив;

//Обходим исходную таблицу в цикле
Для Каждого Стр Из ТЗ Цикл
    
    Если Стр.ЧасовНаПроект < 8 Тогда
        //Если строка не проходит по условию, то запомним её значение
        ОсталосьЧасовНаПроект = ОсталосьЧасовНаПроект + Стр.ЧасовНаПроект;
        
        //И добавим строку в массив для дальнейшего удаления
        МассивСтрокДляУдаления.Добавить(Стр);
    ИначеЕсли ОсталосьЧасовНаПроект > 0 Тогда
        //Если текущая строка проходит по условию, то добавим к ней значения из строк, которые были до неё. но по условию не прошли
        Стр.ЧасовНаПроект = Стр.ЧасовНаПроект + ОсталосьЧасовНаПроект;
        ОсталосьЧасовНаПроект = 0;
    КонецЕсли;
    
КонецЦикла;

//Удалим строки, которые не прошли по условию из исходной таблицы
Для Каждого СтрУдалить Из МассивСтрокДляУдаления Цикл
    ТЗ.Удалить(СтрУдалить);    
КонецЦикла;

//У нас может быть ситуация, что последняя строка исходной таблицы не прошла по условию
//Надо значение из нее распределить на первую строку
Если ОсталосьЧасовНаПроект > 0 Тогда
    ТЗ[0].ЧасовНаПроект = ТЗ[0].ЧасовНаПроект + ОсталосьЧасовНаПроект;
КонецЕсли;
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс