Добрый день. Помогите пожалуйста правильно написать цикл. Есть Тч справочника, нужно обойти ее в цикле и создать три элемента другого справочника.
---
В отсортированной по номеру этапа таблице

```1c
    НомерПредыдущегоЭтапа = Неопределено;
    Для Каждого СтрокаТЧ Из ТЧ Цикл
    Если СтрокаТЧ.НомерЭтапа <> НомерПредыдущегоЭтапа Тогда
    // действия, связанные с появлением нового этапа
    // .............................................
    НомерПредыдущегоЭтапа = СтрокаТЧ.НомерЭтапа;
    КонецЕсли;
    КонецЦикла;
```
---
По различным значениям из первой колонки?

```1c
    НаСервере
    ТЗОбхода = ВашСправочникСсылка.ВашаТЧ.Выгрузить();
    ТЗОбхода.Свернуть("ВашаПерваяКолонка");
    Для каждого СтрокаТЧ из ТЗобхода цикл
    чтото делаем
    КонецЦИкла;
```
---
```1c
    ТЗСпр = ЭлементСправочника.ТЧ.Выгрузить();
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТЗСпр", ТЗСпр);
    Запрос.Текст = "ВЫБРАТЬ
    | ТЗСпр.НомерЭтапа КАК НомерЭтапа,
    | ТЗСпр.НомерСледЭтапа КАК НомерСледЭтапа,
    | ТЗСпр.НомерОперации КАК НомерОперации
    |ПОМЕСТИТЬ ВТ_ТабЧасть
    |ИЗ
    | &ТЗСпр КАК ТЗСпр
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_ТабЧасть.НомерЭтапа КАК НомерЭтапа,
    | ВТ_ТабЧасть.НомерСледЭтапа КАК НомерСледЭтапа,
    | ВТ_ТабЧасть.НомерОперации КАК НомерОперации
    |ИЗ
    | ВТ_ТабЧасть КАК ВТ_ТабЧасть
    |ИТОГИ ПО
    | НомерЭтапа";

    ВыборкаЭтапов = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаЭтапов.Следующий() Цикл
    НовыйЭлемент = НужныйСправочник.СоздатьЭлемент(); // или ищем уже существующий...
    //заполняем чем надо
    //если нужны данные из строк ТЧ по этапу
    ДетальнаяВыборка = ВыборкаЭтапов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ДетальнаяВыборка.Следующий() Цикл
    //ну а если не надо, то этот цикл лишний и пойдёт код из (2)
    КонецЦикла;
    НовыйЭлемент.Записать();
    КонецЦикла;
```
---
Быстрее это будет ну после тысяч 5 элементов в ТЧ.... При этом писанины в разы больше
---
Так я и написал, что если есть необходимость в данных из этой таб части, кроме номера этапа, в противном случае да - и Свернуть пойдёт.
---
Такая необходимость действительно есть, надо было выкладывать скрин подробнее. Спасибо, попозже попробую приладить.
---
Самый правильный способ написать цикл - не писать цикл))
---
Может, в каких-то случаях через запрос и быстрее будет. Но это отнюдь не "серебрянная пуля", как многие видимо считают.
Лично меня чуть-ли не физически плющит, когда все данные уже в памяти и вместо того, чтобы их довольно тривиально обработать - загоняют на сервер БД чтобы использовать его вместо калькулятора.
Для меня это один из показателей деградирования одинэсников как программистов.
---
Способов много, я привёл лишь один из. Про "серебряную пулю" вроде ни слова не было.
---
Всерьез рассматривать это как один из допустимых вариантов - это и есть то, о чем я писал. ИМХО, конечно.
Извиняюсь за резкий наезд - просто наболело. Я это наблюдаю вокруг как некий тренд.
Дергать ради такой чепухи СУБД - для меня выглядит настолько запретительным, что даже в голову прийти не может.
Это ж СУБД. В общем случае - это физически отдельный сервак. Необходимо сериализовать данные, передать по сети на сервер СУБД, там обработать, передать результат по сети обратно, выполнить десериализацию... Вместо тривиального обхода коллекции, уже находящейся в оперативной памяти. А ведь такое часто делают еще и с клиента, ничтоже сумняшеся генерируя еще и ненужный серверный вызов. Для меня это анекдот какой-то, а не "один из способов".
---
В отсортированной по номеру этапа таблице

```1c
    НомерПредыдущегоЭтапа = Неопределено;
    Для Каждого СтрокаТЧ Из ТЧ Цикл
    Если СтрокаТЧ.НомерЭтапа <> НомерПредыдущегоЭтапа Тогда
    // действия, связанные с появлением нового этапа
    // .............................................
    НомерПредыдущегоЭтапа = СтрокаТЧ.НомерЭтапа;
    КонецЕсли;
    КонецЦикла;
```
---
А если в таблице много строк с одинаковыми значениями этапа? Много раз бежим по циклу просто так...
---
Много раз бежим по циклу просто так...
Если данные в ОЗУ, нет чтения из БД и работы с данными, то пусть бегает.
---
По циклу бежим один раз. Это быстро даже для больших коллекций. Куда уж проще. Привел этот вариант просто как альтернативную основу для более универсальных решений. Так-то в лоб чаще всего свертку и используют, если подходит.
---
```1c
    Для А = 0 по ТЧ.Количество() - 2 Цикл
    Если ТЧ[А].Этап = ТЧ[А + 1].Этап Тогда
    // тот же этап - следующая операция из ТЧ[А+1].Операция ну и т.д.
    Иначе
    // финальный передел этапа ТЧ[А] - это финальный передел, тут у нас готовый полуфабрикат,
    КонецЕсли;
    КонецЦикла;
    //ТЧ[А] - здесь у нас финальный этап и продукция
```