Проблема с циклом при выборке элементов справочника.

Новая тема
Показывать по 10 20 40 сообщений
"Здравствуйте!
Ситуация следующая. Есть самописная конфигурация учета студентов. В справочнике они находятся в разных группах, в зависимости от курса + статуса (учащийся, отчислен, академ): абитуриент, [1-5] курс, отчислен, академ, выпускник. В конфигурации предыдущими разработчиками не была предусмотрена ситуация перепроведения приказов, к-рые меняют статус или курс, стоящими перед последним проведенным документом. В результате чего студенты могли попадать в группу на курс меньше фактической. Т.е. 3-курсник мог находится в группе 2-курсников, отчисленный в группе какого-либо курса и т.д. Встала задача написать обработку, которая бы поднимала последний документ, проходящий по конкретному студенту, сравнивать курс или статус, в зависимости от типа документа, с родителем студента, и исправлять родителя в соотвествии с последним документом. Обработку написал, но без записи изменений в справочник. Просто несоотвествия выводил в таблицу, чтоб посмотреть, корректно ли отрабатывают условия. На этом этапе все нормально, находились сотни несоотвествий. Но когда дело дошло до внесения измений - изменении родителя на нужного и записи изменений (Спр.Записать();), обработка находила только 4 справочника (хотя перебирала значительно больше), записывала изменения, и останавливалась. Стоит закоментить строчку Спр.Записать();, цикл пробегает всех. Встает вопрос: что происходит при записи элемента (у справочника изменяется родитель.)? Переменная в цикле позиционируется на следующем элементе в группе, на которую был изменен родитель у справочника, продолжает выборку в ней, не находит, и завершает работу?
------------
Доп. инфо.
Группы справочника Студенты:
Абитуриенты
1 Курс
-\-\-\-
5 Курс
Академ
Выпускник
Отчислен
------------
Часть кода:
Период = СоздатьОбъект("Периодический");
ТекСтуд = Справочник.СоздатьОбъект("Справочник.Студенты");
Студ = Справочник.СоздатьОбъект("Справочник.Студенты");
Студ.ВыбратьЭлементы();
Пока Студ.ПолучитьЭлемент() = 1 Цикл
ТекСтуд.НайтиЭлемент(Студ.ТекущийЭлемент()); //Никак по другому не спозиционироваться на элементе //справочника, чтоб внести в него изменения
Период.ИспользоватьОбъект("Состояние_студента",ТекуСтуд);
Период.ОбратныйПорядок();//Берем последний документ
Период.ВыбратьЗначения();
Пока Период.ПолучитьЗначение() = 1 Цикл
ТекДок = Период.ТекущийДокумент();
Если СтрЧислоВхождений(ТекДок,"Приказ о переводе") > 0 Тогда
Если СтрЧислоВхождений(ТекСтуд.Родитель.Наименование, Лев(Строка(ТекДок.КурсКонечный),5)) > 0 Тогда
ТЗ.НайтиЗначение(ТекДок.КурсКонечный,Стр,);//Что такое ТЗ - ниже.
ТекСтуд.Родитель = ТЗ.ПолучитьЗначение(Стр,2);
ТекСтуд.Записать();
Прервать;//Прервать цикл, чтоб не трогать более ранние документы
КонецЕсли;
КонецЕсли;
КонецЦикла;
Прервать;//Или прервать цикл, если условие не выполнено и считается, что у этого справочника все //ок.
КонецЦикла;
ТЗ - таблица значений соответствия статусов-курсов студентов группам.
В первую колонку заносятся статусы-курсы, типа перечисления, во вторую - соотвествующие группы, типа справочники.
ТЗ.НайтиЗначение(ТекДок.КурсКонечный,Стр,) - В переменную Стр возвращается номер строки, в которой найден курс, указанный в документе и который должен быть у студента, если он не отчислен, по этой переменной и колонке 2 получаем значение, соотвествующей нужной группе.
Итак, если ТекСтуд.Записать(); закоментить, цикл обрабатывает гораздо больше студентов, чем с раскоменченной строчкой, условие обрабатывается четырежды и цикл останавливается. Конечно, можно посчитать, сколько раз нужно включать выборку элементов и запускать цикл с помощью цикла Для, но это кривой выход, к кторому можно будет прибегнуть позже...
В чем может быть дело? Надеюсь, не перегрузил информацией. Заранее благодарю за помощь, коллеги."
Многа букав! :)
Вкратце ответ на вопрос "Встает вопрос: что происходит при записи элемента"
Зачастую при этом "слетает" выборка справочника. Один из способов борьбы: выборку сбрасываем в список значений, затем перебираем список значений, правим и записываем.
Как было написано ValeraH - не делайте исправление элемента справочника выборки.
А вот совет стоит немного изменить - если надо изменить текущий элемент, до добавляете его и группу в которую его поместить в ТаблицуЗначений (Студент, ПравильнаяГруппа). А после окончания цикла с выборкой - делаете цикл по ТаблицеЗначений.
Еще как вариант, зачем нужно это распределение по группам если уже ввели статусы студента (как по уму и надо было сделать изначально)?
Спасибо! Ответ получен. Вобщем, предполагал, что выборка слетает.  Тож была идея забить все в список значений. Переделаю немного.
Согласен, букав много, но хотел более полно раскрыть проблему. :) Спасибо за совет!
Не понял вопрос. Статуса у студента 4: учащийся, отчислен, академ и выпускник. Уже по этим статусам их надо распихивать по соотвествующим группам. Если статус у студента "учащийся", то группами у него являются группы-курсы: 1 курс, 2 курс и т.д.
Кстати, а при работе с таблицей значений не будет проблем с позиционированием? (Понятно, что значения в таблице будут храниться нужного типа)
"Статус" нужно было делать реквизитом справочника студентов. Реквизит этот был бы видо перечисления "СтатусыСтудентов" и периодический.
> Кстати, а при работе с таблицей значений не будет проблем с позиционированием? (Понятно, что значения в таблице будут храниться нужного типа)

нет
Читают тему
(гостей: 1)

Быстрый переход