Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

Вход или Регистрация

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[Прочее]

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

XzanderX
читатель
офлайн
Дата регистрации: 02.10.2009
Сообщений: 7
Пост №1
 
02.10.2009 07:38

"Здравствуйте!<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>В чем может быть дело? Надеюсь, не перегрузил информацией. Заранее благодарю за помощь, коллеги."

ValeraH
читатель
офлайн
Дата регистрации: 31.03.2004
Сообщений: 264
Пост №2
 
02.10.2009 08:29

Многа букав! :)<br>Вкратце ответ на вопрос "Встает вопрос: что происходит при записи элемента"<br>Зачастую при этом "слетает" выборка справочника. Один из способов борьбы: выборку сбрасываем в список значений, затем перебираем список значений, правим и записываем.

BelikovS
читатель
офлайн
Дата регистрации: 05.03.2007
Сообщений: 1701
Пост №3
 
02.10.2009 09:28

Как было написано ValeraH - не делайте исправление элемента справочника выборки.<br>А вот совет стоит немного изменить - если надо изменить текущий элемент, до добавляете его и группу в которую его поместить в ТаблицуЗначений (Студент, ПравильнаяГруппа). А после окончания цикла с выборкой - делаете цикл по ТаблицеЗначений.

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №4
 
02.10.2009 14:15

Еще как вариант, зачем нужно это распределение по группам если уже ввели статусы студента (как по уму и надо было сделать изначально)?

XzanderX
читатель
офлайн
Дата регистрации: 02.10.2009
Сообщений: 7
Пост №5
 
05.10.2009 05:19

Спасибо! Ответ получен. Вобщем, предполагал, что выборка слетает. Тож была идея забить все в список значений. Переделаю немного.

XzanderX
читатель
офлайн
Дата регистрации: 02.10.2009
Сообщений: 7
Пост №6
 
05.10.2009 05:20

Согласен, букав много, но хотел более полно раскрыть проблему. :) Спасибо за совет!

XzanderX
читатель
офлайн
Дата регистрации: 02.10.2009
Сообщений: 7
Пост №7
 
05.10.2009 05:24

Не понял вопрос. Статуса у студента 4: учащийся, отчислен, академ и выпускник. Уже по этим статусам их надо распихивать по соотвествующим группам. Если статус у студента "учащийся", то группами у него являются группы-курсы: 1 курс, 2 курс и т.д.

XzanderX
читатель
офлайн
Дата регистрации: 02.10.2009
Сообщений: 7
Пост №8
 
05.10.2009 05:25

Кстати, а при работе с таблицей значений не будет проблем с позиционированием? (Понятно, что значения в таблице будут храниться нужного типа)

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №9
 
05.10.2009 09:04

"Статус" нужно было делать реквизитом справочника студентов. Реквизит этот был бы видо перечисления "СтатусыСтудентов" и периодический.

zak555 (398843952)
читатель
офлайн
Дата регистрации: 27.03.2008
Сообщений: 4656
Пост №10
 
05.10.2009 12:41

> Кстати, а при работе с таблицей значений не будет проблем с позиционированием? (Понятно, что значения в таблице будут храниться нужного типа)<br><br>нет

Показывать по 10 20 40 сообщений

Читают тему:

Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация