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

Лбход элементов табличной части документа(проблема)

Автор metalstorm_tlt, 10 сен 2010, 18:53

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

metalstorm_tlt

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

Почему то цикл: Для Каждого СтрокаДопУслуги.... делает меньшее число итераций чем должен...то есть в табличной части документа остаются неудаленные строки. Помогите пожалуйста как исправить эту проблему. Буду очень благодарен

metalstorm_tlt


Vit1501


Vit1501

попробуй перестроить код по другому. Я так полагаю что перебор идет по индексам и при удалении индексы сдвигаются, поэтому и не все обработываются строки

metalstorm_tlt

Попробую сначала выгрузить в таблицу значений, а потом пройтись по ней циклом...посмотрим что получится...

metalstorm_tlt

Ещё хотел уточнить, при обходе элементов справочника следующим способом:
Спр=Справочники.ВидыДопУслуг.Выбрать();
   Пока Спр.Следующий() Цикл

Нет необходимости вызывать метод Спр.ПолучитьОбъект(), чтобы обратиться к реквизитам элемента?

metalstorm_tlt

Попробовал так:

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

Почему то цикл Для Каждого ИндексыТБ Из ТаблЗнач.Индексы.... не делает ни одной итерации...Попробую обойти не индексы а строки из ТаблицыЗначений..

metalstorm_tlt

Хм...за два прохода удаляет все элементы (когда их 3, сначала 2 потом 1), причем заметил что при первом вызове процедуры цикл

Для Каждого СтрокаТаблЗнач Из ТаблЗнач

Считывает только две строки, а при попытке считать третью все колонки из СтрокаТаблЗнач принимают значение: "Ошибка чтения значения". А при втором вызове этой процедуры удаляет оставшийся элемент без проблем...мистика какая то...

Вот сама процедура:

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

metalstorm_tlt

Если кто знает как исправить помогите пожалуйста...а то мне сегодня надо исправить все ошибки =(

metalstorm_tlt


Теги:

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

Рейтинг@Mail.ru

Поиск