8.х Удаление строк

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Dmitrij, 25 май 2010.

  1. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Подскажите пожалуйста, при удалении данных из одного поля нужно очищать таблицу, но не полностью, а с отбором по реквизиту, я делаю так:
    Код:
    Для Каждого Стр Из Товары Цикл
    Если ЭлементыФормы.Сотрудники.ТекущиеДанные.Сотрудник = Стр.Владелец Тогда
    Товары.Удалить(Стр.НомерСтроки);
    КонецЕсли;
    КонецЦикла;
    
    Это не совсем правильно удаляются не все строки так как удаляем первую строку вторая становится первой и тд
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Уже было на форуме. Воспользуйтесь поиском.
    Удаляйте строки в обратном порядке. (Используйте для этого конструкцию "Для Из Цикл", а не "Для Каждого Из Цикл")

    P.S. Имел ввиду, не конкретный кусок кода, а то как надо удалять строки.
  3. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Код:
    Отбор = Новый Структура();
    Отбор.Вставить("Владелец", ЭлементыФормы.Сотрудники.ТекущиеДанные.Сотрудник);
    СтрокиНаУдаление = Товары.НайтиСтроки(Отбор);
    Для Каждого Стр Из СтрокиНаУдаление Цикл
    Товары.Удалить(Стр);
    КонецЦикла;
    
    
  4. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Вот пример:
    Код:
    // Списание резерва
    ТаблицаПоСписанияРезерва = ТаблицаПоТоварам.Скопировать();
    Сч = 0;
    Пока Сч < ТаблицаПоСписанияРезерва.Количество() Цикл
    СтрокаТаблицы = ТаблицаПоСписанияРезерва.Получить(Сч);
    Если ЗначениеНеЗаполнено(СтрокаТаблицы.ДокументРезерва) 
    ИЛИ (ТипЗнч(СтрокаТаблицы.ДокументРезерва) <> Тип("ДокументСсылка.ЗаказПокупателя")
    И ТипЗнч(СтрокаТаблицы.ДокументРезерва) <> Тип("ДокументСсылка.ПриходныйОрдерНаТовары"))Тогда
    ТаблицаПоСписанияРезерва.Удалить(СтрокаТаблицы);
    Иначе
    Сч = Сч + 1;
    КонецЕсли;
    КонецЦикла;
    
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Вау. :)
    А почему нельзя просто так:
    Код:
    ТекущийСотрудник = ЭлементыФормы.Сотрудники.ТекущиеДанные.Сотрудник;
    КоличествоСтрок = Товары.Количество();
    Индекс = 0;
    Для Индекс = 1 По КоличествоСтрок Цикл
    Если Товары[КоличествоСтрок - Индекс].Владелец = ТекущийСотрудник Тогда
    Товары.Удалить(КоличествоСтрок - Индекс);
    КонецЕсли;
    КонецЦикла;
    
    
    
  6. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.552
    Симпатии:
    716
    Баллы:
    204
    потому что при удалении строки индекс меняется.если по индексу, то ТЧ обходить нужно с последней по первую строку
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну..Так а у меня с какой по какую?
  8. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.552
    Симпатии:
    716
    Баллы:
    204
    у тебя - не понятно с какой по какую, т.к. при удалении строк количество строк в коллекции будет менятся, а у тебя оно будет фиксированным - т.е. будет ошибка "индекс находится за пределами коллекции"
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Мда? Меня переглючило по жаре?
    Допустим в ТЧ 3 строки.
    Переменная:
    КоличествоСтрок = 3;
    Цикл: Переменная индекс меняется: 1, 2, 3.
    В цикле номер обрабатываемой строки меняется (КоличествоСтрок - Индекс): 2, 1, 0.
    Ну и в каком месте будет "индекс находится за пределами коллекции"? Я не вычисляю каждый раз КоличествоСтрок! Оно вычисляется один раз перед циклом!
  10. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.552
    Симпатии:
    716
    Баллы:
    204
    Прошу пардону - это меня глючит. Должно работать.
  11. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Пример из типовой.
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    nomad_irk нормально, у всех бывает.

    Stack_G правильность работы я не оспариваю, не проверял. Но тот код который я привел мне кажется более легким для прочтения и понимания. Помимо того что в вашем примере мы будем копировать таблицу значений, само построение цикла запутано (я не говорю, что не будет работать), но ведь мы знаем сколько у нас строк в табличной части, поэтому человеку проще видеть цикл от-до, чем гадать в цикле вашего примера, на каком моменте он завершится. Все это ИМХО.
    На своем примере ни в коем случае не настаиваю, каждый пишет так, как ему кажется правильней, лучше и проще.

Поделиться этой страницей