Здравствуйте,у меня вопрос,как мне кажется очень банальный,но я не могу додуматься уже как 4 часа.У меня есть таблица значений,мне нужно удалить строку если в колонке есть 0,когда я решил что у меня все получилось и начал радоваться то пришла новая непонятная проблемка.
Сейчас выложу код а потом опишу проблему
НомСтроки = 0;
ОбластьСтроки = Макет.ПолучитьОбласть("СТР");
Для Каждого Сч из ТаблицаЗапроса Цикл
Если Сч.Количество = 0 Тогда ТаблицаЗапроса.Удалить(Сч);
Иначе ОбластьСтроки.Параметры.Заполнить(Сч);
КонецЕсли;
НомСтроки = НомСтроки +1;
ОбластьСтроки.Параметры.Индекс = НомСтроки;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
Так вот здесь есть странная законномерность,если записей в таблице 1 или 2,то дублируется последняя запись и получается что записи не 1,а 2,и если 2 записи то выводит 3 строки,ДУБЛИРУЕТ ПОСЛЕДНЮЮ!!!
ЕСЛИ ЖЕ 3 ИЛИ БОЛЕЕ СТРОК,ТО ВЫВОДИТ ХОРОШО,КАК ДОЛЖЕН!!!
Голова уже не варит,а сдать охото сегодня обработку,помогите пожалуйста!!!
Сейчас выложу код а потом опишу проблему
НомСтроки = 0;
ОбластьСтроки = Макет.ПолучитьОбласть("СТР");
Для Каждого Сч из ТаблицаЗапроса Цикл
Если Сч.Количество = 0 Тогда ТаблицаЗапроса.Удалить(Сч);
Иначе ОбластьСтроки.Параметры.Заполнить(Сч);
КонецЕсли;
НомСтроки = НомСтроки +1;
ОбластьСтроки.Параметры.Индекс = НомСтроки;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
Так вот здесь есть странная законномерность,если записей в таблице 1 или 2,то дублируется последняя запись и получается что записи не 1,а 2,и если 2 записи то выводит 3 строки,ДУБЛИРУЕТ ПОСЛЕДНЮЮ!!!
ЕСЛИ ЖЕ 3 ИЛИ БОЛЕЕ СТРОК,ТО ВЫВОДИТ ХОРОШО,КАК ДОЛЖЕН!!!
Голова уже не варит,а сдать охото сегодня обработку,помогите пожалуйста!!!
По теме из базы знаний
- О цикле обратном замолвите слово...
- Что не так с таблицами формы?
- Как передать Таблицу Значений в Динамический Список?
- Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений
- Удаление строк из таблицы значений различными способами с замером производительности
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Это стандартная проблема обходить так таблицу значений нельзя. Потому что как при удалении строки счет сразу собъется
Стр=0;
Пока Стр<ТаблицаЗначений.Количество() Цикл
НашаСтрока=ТаблицаЗначений[Стр];
Если НашаСтрока.Сумма=0 Тогда
ТаблицаЗначений.Удалить(НашаСтрока);
Стр=Стр-1;
КонецЕсли;
Стр=Стр+1;
КонецЦикла;
Показать
Вопрос РЕШЕН!!!!!!
Дело в том,что когда последняя строчка с количеством 0,то цикл идет дальше,и он выводит значение СЧ то какое было раньше!Решается все очень банально!Словом ПРОДОЛЖИТЬ!
НомСтроки = 0;
ОбластьСтроки = Макет.ПолучитьОбласть("СТР");
Для Каждого Сч из ТаблицаЗапроса Цикл
Если Сч.Количество = 0 Тогда
ТаблицаЗапроса.Удалить(Сч);
Продолжить;
Иначе ОбластьСтроки.Параметры.Заполнить(Сч);
КонецЕсли;
НомСтроки = НомСтроки +1;
ОбластьСтроки.Параметры.Индекс = НомСтроки;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
Дело в том,что когда последняя строчка с количеством 0,то цикл идет дальше,и он выводит значение СЧ то какое было раньше!Решается все очень банально!Словом ПРОДОЛЖИТЬ!
НомСтроки = 0;
ОбластьСтроки = Макет.ПолучитьОбласть("СТР");
Для Каждого Сч из ТаблицаЗапроса Цикл
Если Сч.Количество = 0 Тогда
ТаблицаЗапроса.Удалить(Сч);
Продолжить;
Иначе ОбластьСтроки.Параметры.Заполнить(Сч);
КонецЕсли;
НомСтроки = НомСтроки +1;
ОбластьСтроки.Параметры.Индекс = НомСтроки;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
(7) andadra, Вроде верно. Я бы сделал замечания:
* Лучше сначала обработать таблицу, потом выводить. Так нагляднее.
* Ваш алгоритм верный, но сделает столько циклов по ТЗ, сколько нулевых строк. Если ТЗ большая, можно сэкономить так (циклов в несколько раз меньше):
* Лучше сначала обработать таблицу, потом выводить. Так нагляднее.
* Ваш алгоритм верный, но сделает столько циклов по ТЗ, сколько нулевых строк. Если ТЗ большая, можно сэкономить так (циклов в несколько раз меньше):
ЕстьПустые = Истина;
Пока ЕстьПустые цикл
ЕстьПустые = Ложь;
Для Каждого Сч из ТаблицаЗапроса Цикл
Если Сч.Количество = 0 Тогда
ТаблицаЗапроса.Удалить(Сч);
ЕстьПустые = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
Алгоритмы в один цикл:
1)
Перебор ТЗ0 в обратной последовательности. (уже предлагали)
2)
Создаешь новую ТЗ1
В цикле перебираешь ТЗ0 в любой последовательности и при выполнении условия копируешь строку в ТЗ1
За один проход создается требуетая таблица значений.
1)
Перебор ТЗ0 в обратной последовательности. (уже предлагали)
2)
Создаешь новую ТЗ1
В цикле перебираешь ТЗ0 в любой последовательности и при выполнении условия копируешь строку в ТЗ1
За один проход создается требуетая таблица значений.
Нужен был текст запроса в цикле, с переменными в параметрах запроса
Так работает, может пригодится
Так работает, может пригодится
Если ТЗ.Количество() > 0 Тогда
Пока ТЗ.Количество() > 0 Цикл
N = ТЗ.Количество()-1;//Индекс последней строки
ВременнаяТЗ = Новый ТаблицаЗначений;
ВременнаяТЗ = ТЗ.СкопироватьКолонки();
МассивНоменклатураДатаЦеныПоДатаЦены = ТЗ.НайтиСтроки(Новый Структура("ДатаЦены", ТЗ[N].ДатаЦены));
Для Каждого Элт Из МассивНоменклатураДатаЦеныПоДатаЦены Цикл
НовСтр = ВременнаяТЗ.Добавить();
НовСтр.Номенклатура = Элт.Номенклатура;
НовСтр.ДатаЦены = Элт.ДатаЦены;
ТЗ.Удалить(Элт);
КонецЦикла;
// Копия Запрос.Текст, только:
// в начало добавлено |ОБЪЕДИНИТЬ ВСЕ
//&МассивНоменклатуры изменён на &МассивНоменклатуры"+N+"
//&Дата изменён на &Дата"+N+"
Запрос.УстановитьПараметр("МассивНоменклатуры"+N, ВременнаяТЗ.ВыгрузитьКолонку("Номенклатура"));
Запрос.УстановитьПараметр("Дата"+N, ВременнаяТЗ[0].ДатаЦены);
Запрос.Текст = Запрос.Текст + "
Показать
(18) А чего страшного? Самый правильный подход в (2), только там примера нет, остальные варианты подходят только для перебора и удаления строки из ТЗ по 1шт, а в моём примере
может выбрать все строки ТЗ за одну итерацию, после чего удалит все строки.
НайтиСтроки(Новый Структура("ДатаЦены", ТЗ[N].ДатаЦены));
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот