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