Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 16:41

Не удаляется элемент табличной части

Автор Andy_NTG, 26 мар 2018, 14:31

0 Пользователей и 1 гость просматривают эту тему.

Andy_NTG

Пытаюсь через обработку удалить позицию табличной части. Ошибки нет, но позиция не удаляется почему-то. Через сообщение видно, что условие, которое передаёт управление в код удаления, отрабатывает правильно

Скриншот и база во вложении.

Код обработки:



&НаСервереБезКонтекста
Процедура ЗапуститьУдалениеНаСервере()
Приход=Документы.Приход.Выбрать();

Пока Приход.Следующий() Цикл
Индекс=0;

ПрихОбъект=Приход.ПолучитьОбъект();

Для Каждого Позиция из ПрихОбъект.Номенклатура Цикл
Если НЕ Позиция.Доступность Тогда
Сообщить("Удаляется номенклатура: "+Позиция.Наименование);
ПрихОбъект.Номенклатура.Удалить(Индекс);
КонецЕсли;
КонецЦикла;

Индекс=Индекс+1;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьУдаление(Команда)
ОчиститьСообщения();
ЗапуститьУдалениеНаСервере();
КонецПроцедуры


sertak

Примерно такой вариант должен работать:

Индекс = -1 * (ПрихОбъект.Номенклатура.Количество() - 1);
Для СчетчикСтрок = Индекс По 0 Цикл
ПрихОбъект.Номенклатура.Удалить(-1 * Индекс);
КонецЦикла;


Набросал на коленке, отладьте. Суть в том, что при удалении первой строки индекс второй меняется и т.д., посему удалять надо снизу.

Удаление может работать не только по индексу, почему попробуйте еще такой вариант:

Для Каждого Позиция из ПрихОбъект.Номенклатура Цикл
            Если НЕ Позиция.Доступность Тогда
                Сообщить("Удаляется номенклатура: "+Позиция.Наименование);
                ПрихОбъект.Номенклатура.Удалить(Позиция);
            КонецЕсли;
        КонецЦикла;


Andy_NTG

Спасибо за подсказку с индексами. Но дело в том, что если бы хотя бы один элемент удалялся, а затем выходили ошибки с индексами, тогда было бы ясно. А сейчас вообще не происходит удаление.

Удаление позиции по ссылке на сам объект тоже пробовал и такой код почему-то тоже не работает. Конфигуратор 8.3.11

oleg-x

Цитата: Andy_NTG от 26 мар 2018, 15:10
Спасибо за подсказку с индексами. Но дело в том, что если бы хотя бы один элемент удалялся, а затем выходили ошибки с индексами, тогда было бы ясно. А сейчас вообще не происходит удаление.

Удаление позиции по ссылке на сам объект тоже пробовал и такой код почему-то тоже не работает. Конфигуратор 8.3.11
Если делать удаление циклом, то только таким:
Пока Условие Цикл
КонецЦикла


Обход для каждого использовать нельзя.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

sertak

Да, действительно, через Для Каждого не прокатывает.

А в удалении через индекс я допустил ошибку. Удалить можно, но вот так:

НачальныйИндекс = -1 * (ПрихОбъект.Номенклатура.Количество() - 1);
Для Индекс = НачальныйИндекс По 0 Цикл
ПрихОбъект.Номенклатура.Удалить(-1 * Индекс);
КонецЦикла;

AIFrame

Строки для удаления положить в массив. Через НайтиСтроки(). Условие у тебя простое, тупо булево.
А еще ты меняешь объект, но не записываешь.
&НаСервереБезКонтекста
Процедура ЗапуститьУдалениеНаСервере()
    СтруктураПоиска = Новый Структура("Доступность", Истина);
    Приход=Документы.Приход.Выбрать();
       
    Пока Приход.Следующий() Цикл
        ПрихОбъект=Приход.ПолучитьОбъект();
        ТЧ = ПрихОбъект.Номенклатура;

        // Вот так удаляются строки по простому отбору.
        // Еще быстрее - только выгрузить в запрос, фильтрануть и вгрузить обратно.
        МассивНайденныхСтрок = ТЧ.НайтиСтроки(СтруктураПоиска);
       
        Для каждого СтрокаНайденных Из МассивНайденныхСтрок Цикл
            ТЧ.Удалить(СтрокаНайденных);
        КонецЦикла;

        // И вот это ты не сделал
        Проведен = ПрихОбъект.Проведен;
        Если Проведен Тогда
            ПрихОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неопреативный);
        Иначе
            ПрихОбъект.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьУдаление(Команда)
    ОчиститьСообщения();
    ЗапуститьУдалениеНаСервере();
КонецПроцедуры




Andy_NTG

А, точно. Нужно ведь сохранять изменения ещё. Спасибо, всё заработало. И с критерием поиска лаконичнее.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск