новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Форум

Обсуждение к контенту: Обработка для иллюстрации начинающим программистам правильной и неправильной методики удаления строк из таблицы значений.

    • #1
    • 11.08.2014 20:10
    0
    • #2
    • 15.08.2014 14:01
    0
    Для удаления по условию (по простому условию проверки на равенство) есть гораздо более быстрый и простой метод удаления
    	УдСтроки=Таб.НайтиСтроки(Новый Структура("ФлагУдаления",Истина));
    	Для Каждого Стр из УдСтроки Цикл
    	    Таб.Удалить(Стр);
    	КонецЦикла;
    


    И хотелось бы узнать для чего каждый раз вызываются методы
    ТЗ = Таб.Выгрузить();
    и
    Таб.Загрузить(ТЗ);
    ?
    • #3
    • 21.11.2014 09:11
    0
    Верно замечено, насчет упрощения
    	УдСтроки=Таб.НайтиСтроки(Новый Структура("ФлагУдаления",Истина));
    	Для Каждого Стр из УдСтроки Цикл
    	    Таб.Удалить(Стр);
    	КонецЦикла;
    

    Тут на общий случай рассматривали, когда критерий из нескольких условий и не на равенство. Например, удалить все строки из таблицы значений когда в одной из колонок число меньше А или больше Б и отбор с методом таблицы значений (или табличной части)
     ТЗ.НайтиСтроки(Новый Структура ("Поле1, поле2,...", ЗначениеПоля1, ЗначениеПоля2, ...) 
    уже не сработает. Потому и методы именно для ТаблицыЗначений, а не для табличной части (раз были такие условия тестовой задачи).
    Даже дальше стало интересно и продолжили дискуссию по обмену данными и получили забавные результаты.
    http://forum.infostart.ru/forum9/topic114943/ вот эта самая дискуссия, где не по теме продолжили.
    Как то метод перебора коллекции именно для удаления элементов из коллекции применять боюсь (мало ли какие изменения в платформе). Проще - но дело вкуса.

    Рассмотрели в отладчике ситуацию с удалением строки:
    Пример выполенения
    ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Колонка");
        
        Стр1 = ТЗ.Добавить();
        Стр1.Колонка = 555;
        Стр2 = ТЗ.Добавить();
        Стр2.Колонка = 777;
        Стр3 = ТЗ.Добавить();
        Стр3.Колонка = 999;
        
        ВнутрСтрока1 = ЗначениеВСтрокуВнутр(ТЗ);
        ТЗ.Удалить(Стр2);
        ВнутрСтрока2 = ЗначениеВСтрокуВнутр(ТЗ);
    
        ...
    
        А = ЗначениеВСтрокуВнутр(ТЗ[0]);
        Б = ЗначениеВСтрокуВнутр(ТЗ[1]);
        С = ЗначениеВСтрокуВнутр(ТЗ);
    
    


    Получилось, что, до удаления, т.е ВнутрСтрока1 =
    {"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
    {8,
    {1,
    {0,"Колонка",
    {"Pattern"},"",0}
    },
    {2,1,0,0,
    {1,3,
    {2,0,1,
    {"N",555},0},
    {2,1,1,
    {"N",777},0},
    {2,2,1,
    {"N",999},0}
    },0,2}
    }
    }
    Скрыть

    После удаления, ВнутрСтрока2 =
    {"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
    {8,
    {1,
    {0,"Колонка",
    {"Pattern"},"",0}
    },
    {2,1,0,0,
    {1,2,
    {2,0,1,
    {"N",555},0},
    {2,2,1,
    {"N",999},0}
    },0,2}
    }
    }

    Обратите внимание на последовательность символов "{2,0,1,{"N",555},0}", "{2,2,1,{"N",999},0}"
    Можно, предположить, что это и есть строка ТЗ. Причем видно, что "{2,1,1,{"N",777},0}" - после удаления исчезло из внутреннего представления. Скорее всего выделенные символ "{2,0,1", {2,1,1" и есть идентификаторы строк ТЗ. Собственно, поэтому при использования Для Каждого Из - индексы "не сбиваются" при удалении строк. Кстати, еще интересный вывод. Передавая, например, в функцию строку ТЗ, мы на самом деле передаем всю таблицу значений (точнее, указатель)
    Чем дальше в лес, тем больше дров :)
    • #4
    • 21.11.2014 09:11
    0
    Таблица в отладчике
    • #5
    • 21.11.2014 09:11
    • Отредактировано: 21.11.2014 09:13:34
    0
    Такие интересные результаты по работе с таблицей значений
Для участия в обсуждении Вам необходимо авторизоваться либо   зарегистрироваться