8.х Удаление строк из ТЧ документа.

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

  1. TopicStarter Overlay
    Korovay
    Offline

    Korovay Опытный в 1С

    Регистрация:
    3 авг 2009
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Необходимо удалить несколько записей из таблицы в соответствии с условием.
    Первый раз запускаю, удаляются записи, но не все. Все удаляются с раза 4-5.

    Пример кода:
    Код:
    Объект = Документ.Ссылка.ПолучитьОбъект();
    Для Каждого СтрНач Из Объект.Начисления Цикл
    Запрос.УстановитьПараметр("Физлицо", СтрНач.Физлицо);
    Запрос.УстановитьПараметр("СпособОтраженияВБухучете", ШаблонПроводки);
    РезультатНАч = Запрос.Выполнить();
    Если РезультатНАч.Пустой() Тогда
    Объект.Начисления.Удалить(СтрНач); 
    КонецЕсли;
    КонецЦикла;
    Если Объект.Модифицированность() Тогда
    Объект.Записать();
    Сообщить("Записан документ №" + Объект.Номер);
    КонецЕсли;
    
  2. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    1. Правильно, при удалении строки смещаются индексы. У вас неверный алгоритм.
    Вам сюда: http://www.1c-pro.ru/index.php?showtopic=24003&hl=
    2. Запрос в цикле - плохо.
  3. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Правильно Вам говорят. удалять нужно с конца
  4. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Не обязательно с конца, мне вот это намного больше нравится - как-то понятнее чтоли :)
    Код:
    Сч = 0;
    Пока Сч < Таблица.Количество() Цикл
    СтрокаТаблицы = Таблица.Получить(Сч);
    Если  СтрокаТаблицы.Удалять Тогда //здесь нужное условие
    Таблица.Удалить(СтрокаТаблицы);
    Иначе
    Сч = Сч + 1;
    КонецЕсли;
    КонецЦикла;
    
  5. TopicStarter Overlay
    Korovay
    Offline

    Korovay Опытный в 1С

    Регистрация:
    3 авг 2009
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Большое спасибо.
  6. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    В принципе алгоритм предложенный Stack_G работает, но я бы сделал по другому:

    Код:
    Фильтр = Новый Структура;
    Фильтр.Вставить("Удалять", Истина);
    НаборСтрок = Таблица.НайтиСтроки(Фильтр); //получаем набор строк таблицы, подходящие под заданный фильтр
    
    Для каждого СтрокаТЗ ИЗ НаборСтрок Цикл
    Таблица.Удалить(СтрокаТЗ);
    КонецЦикла;
    
    
    
    Этот алгоритм работает независимо от того, как будут отсортированны строки в процессе его работы. Т.е. после/перед Таблица.Удалить(); можно вызывать различные функции/процедуры, которые в свою очередь могут менять порядок строк (главное, чтобы в них строки не удалялись)
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    этот метод не всегда работает. например, нельзя удалить значения <> нужное.....
  8. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Код:
    Фильтр = Новый Структура;
    Фильтр.Вставить([имя колонки], "Нужное");
    НаборСтрокНужных = тзДанные.НайтиСтроки(Фильтр); //получили набор "нужных" строк
    тзНужные = тзДанные.Скопировать(НаборСтрокНужных); //получили таблицу из одних "нужных" данных
    //тзДанные.Очистить(); //удалили все, и "нужные" и "не нужные"
    тзДанные = тзНужные.Скопировать(); //в исходной таблице имеем только "нужные". Аналогично коду тзДанные = тзНужные;
    
    
    
    
    Так сойдет? :unsure:

    <> всегда можно получить из = - просто чуть дольше возиться.
  9. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Создайте временную таблицу и передайте её в запрос, там соедините результат с запросом начислений, то что вернётся просто грузите и не надо никаких циклов. Про использование таблиц писал, ищите по форуму.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    по типу значения точно не отберешь :smile:

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