Консультация № 74181
05.02.2007, 10:44
0.00 руб.
0 4 4
7.7
У меня 2 вопроса:
1. Необходимо перенести в документ сотрудников со справочника с таким условием:
Если (Сотрудник.ЭтоГруппа()=0)и(Сотрудник.ПринадлежитГруппе("А")=1) тогда
без этого условия переносит все нормально а с ним название группы не переносит но и сотрудников с группы А тоже. Если поставить (Сотрудник.ПринадлежитГруппе("А")=0) то переносит всех и из других групп тоже. Я так понял что я неправильно описую группу возможно надо по коду или еще как-то.
2. Почему если организовать цикл с пребором строк документа и в нем написать УдалитьСтроку(); то удаляет через 1 строку и половина остается при повторном нажатии удаляются тоже через 1 из оставшихся. Но если поставить условие которому сответствует токо одна строа то все нормально (на 2 или 3 я непробывал) а если болше половины строк то через одну и наплевать на условие. Эту проблему я решил через таблицу значений перенеся все строки туда потом УдалитьСтроки(); и перенося обратно строки которые соответствуют условию. Но хотелось бы узнать в чем проблема?

Обсуждение

Неизвестный
05.02.2007, 10:50
общий
это ответ
Здравствуйте, Centaur!

Ответ на второй вопрос

Удалять надо с конца,
потому как при удалении с начала
после удаления первой строки меняются индексы всех строк т.е следующая строка с номером 3 (которую нужно допустим удалить) уже идет с номером 2
Неизвестный
05.02.2007, 11:08
общий
это ответ
Здравствуйте, Centaur!
Если в ПринадлежитГруппе("А")=1: А - это и есть название группы, то читайте Синтаксис-помошник:
<Группа> - выражение со значением группы справочника.
ВЫРАЖЕНИЕ - не наименование а переменная, хранящая ссылку на элемент-группу справочника.
То есть:
Перем гр;
спр.НайтиПоНаименованию("А");
гр = спр.ТекущийЭлемент();
и вот теперь можно писать так:
ПринадлежитГруппе(гр)=1
А вашем случае это условие никогда не выполняется, а в случае сравнения с 0 наоборот - всегда выполняется.
(странно кстати что вообще ошибки не было)

По второму вопросу уже ответили - просто уточнение:
Когда вы делаете выборку - этот объект(выборка) это линейный список элементов.
То есть если вы во время прохода по нему удаляете текущий элемент, то указатель ("курсор") переходит на следующий за ним и соответсвенно на следующей итерации цикла при выполнении метода ПолучитьЭлемент() курсов переходит еще раз на следующий, пропуская тот который шел сразу за удаленным.
Таким образом выходы следующие:
- тот что предложили,
- после каждого удаления снова применять ВыбратьЭлементы() - это сильно замедлит работу
- либо примерно как сделали вы - сначала выбирать в ТЗ, а потом каждый элемент попадающий под условие удаления - находить в справочнике и удалять - тоже долго, но лучше предыдущего.
Впрочем нужно оценивать временные затраты в каждом конкретном случае.
Неизвестный
05.02.2007, 11:14
общий
это ответ
Здравствуйте, Centaur!
1. В методе ПринадлежитГруппе(<Группа>) атрибут Группа должен иметь тип значения "Справочник", т.е. снала нужно определить необходимую группу одним из стандартных методов (НайтиПоКоду(), НайтиПоНаименованию() и т.п.), а потом уже подставлять найденное значение в метод ПринадлежитГруппе(). Например:
Сотрудник.НайтиПоНаименованию("А");
Группа = Сотрудник.ТекущийЭлемент();
Сотрудник.ВыбратьЭлементы();
Пока Сотрудник.ПолучитьЭлемент() = 1 Цикл
Если (Сотрудник.ЭтоГруппа()=0) И (Сотрудник.ПринадлежитГруппе(Группа)=1) Тогда
.........

2. Добавлю. Можно попробовать так:
ВыбратьСтроки();
Стр = 1;
Пока ПолучитьСтроку() = 1 Цикл
Если <Ваше условие> = Ложь Тогда
ПолучитьСтрокуПоНомеру(Стр);
УдалитьСтроку();
Иначе
Стр = Стр + 1;
КонецЕсли;
КонецЦикла;
Неизвестный
05.02.2007, 12:26
общий
это ответ
Здравствуйте, Centaur!
1. По моему, группы "А" у вас нет а есть переменная А, следовательно (Сотрудник.ЭтоГруппа()=0)и(Сотрудник.ПринадлежитГруппе(А)=1)
2. Вначале удаляется строка №1. Строка удалена, следовательно появляется другая строка №1, а цикл то пошел дальше, вот и все, делайте выводы...

Форма ответа