Имя: Пароль:
1C
1С v8
Помогите организовать цикл
0 BayoNet
 
05.08.13
16:52
Сижу туплю. Есть таблица значений две колонки: "номенклатура" и "ТипНоменклатуры" под типом номенклатуры подразумевается является ли она готовым комплектом или комплектующей. ТаблицаЗначений по строкам строится таким образом: комплект, потом несколько строк входящих в нее комплектующих, потом новый комплект итд, количество комплектующих для разных комплектов разное.
Запускаю цикл по каждой строке ТЗ, нужно перед каждым новым комплектом открыть модально форму для записи новой спецификации.
1 BayoNet
 
05.08.13
16:53
Фрм = ПолучитьФорму("ФормаСпецификации");
        Если Стр.Тип = "М" Тогда
            Фрм.СтрокаМ = Стр.Строка;
            СтрокаМеню = Фрм.тзМеню.Добавить();
            СтрокаМеню.Блюдо = ИдентификацияНоменклатуры.Найти(Стр.Строка,"Строка").Элемент;
        Иначе
            СтрокаСпециф = Фрм.Спецификация.Добавить();
            СтрокаСпециф.Комплектующая = ИдентификацияНоменклатуры.Найти(Стр.Строка,"Строка").Элемент;
        КонецЕсли;
        Если Стр.Тип = "М" Тогда
            Фрм.ОткрытьМодально();
        КонецЕсли;
2 salvator
 
05.08.13
16:55
Что спросить-то хотел?
3 BayoNet
 
05.08.13
16:56
что то никак не придумаю, как отловить последнюю комплектующую, перед новым комплектом
4 salvator
 
05.08.13
16:58
(3) Сделай дерево
5 Сти
 
05.08.13
16:59
(3) Зачем отлавливать последнюю комплектующую, когда все можно сделать в момент, когда позиция в ТЗ уже на строке с новым комплектом?
6 BayoNet
 
05.08.13
17:02
(5) как?
7 fisher
 
05.08.13
17:03
(6) Признаком начала нового комплекта является номенклатура, отличная от номенклатуры в предыдущей строке (в отсортированной таблице). Ну и последний комплект отработать.
8 fisher
 
05.08.13
17:07
Если совсем ступор - то можешь и последнюю отлавливать. "Заглядывая" в следующую. Хуже, но не сильно.
9 fisher
 
05.08.13
17:10
Вообще, лучше, конечно, избегать этой фигни в принципе.
Работать с вложенными коллекциями, обходом по группировкам и т.п.
10 BayoNet
 
05.08.13
17:11
(8) Я так и думаю уже, по номеру строки "загляну" в тип следующей, что то не хочется с деревом связываться из-за разовой работы загрузки. Спасибо
11 Сти
 
05.08.13
17:14
Как-то так

Фрм.СтрокаМ = ТЗ[0].СтрокаМ    // самое первое блюдо до цикла, тогда форма не откроется на первой итерации
Для каждого Стр из ТЗ Цикл
    Если Стр.Тип = "М" тогда
        Если Фрм.СтрокаМ <> Стр.Строка Тогда // изменился комплект
            СтрокаМеню = Фрм.тзМеню.Добавить();
            СтрокаМеню.Блюдо = ИдентификацияНоменклатуры.Найти(Фрм.СтрокаМ,"Строка").Элемент;    // ищем старое значение, сохраненное в форме
            Фрм.ОткрытьМодально();
            Фрм.СтрокаМ = Стр.Строка;
        КонецЕсли;
    Иначе
        СтрокаСпециф = Фрм.Спецификация.Добавить();
        СтрокаСпециф.Комплектующая = ИдентификацияНоменклатуры.Найти(Стр.Строка,"Строка").Элемент;
    КонецЕсли;
КонецЦикла;

СтрокаМеню = Фрм.тзМеню.Добавить();
СтрокаМеню.Блюдо = ИдентификацияНоменклатуры.Найти(Фрм.СтрокаМ,"Строка").Элемент;    // ищем старое значение, сохраненное в форме
Фрм.ОткрытьМодально();


Также можно не использовать ТЗ[0], используя переменные вместо Фрм.СтрокаМ и поставив проверки условий в цикле.


А можно вообще бежать по ТЗ с конца к началу, типа
ТЗКолСтрок = ТЗ.Количество();
Для x = 0 по ТЗКолСтрок Цикл
   Строка = ТЗ[ТЗКолСтрок - x - 1]
КонецЦикла;
Тогда, натыкаясь на М, открывать форму.
12 SherifSP
 
05.08.13
17:15
Дерево самый оптимальный, читабельный и быстрый вариант, а то что ты тут пытаешься разработать, это велосипед )
13 Сти
 
05.08.13
17:18
(12) Деревья лучше, конечно. Но не всегда, например, сортировка в многоуровневом дереве это нечто. А была как-то нужна, и тогда с ТЗ оказалось все быстрее, хотя жутко некрасиво, нечитабельно, и непонятно, да и поля лишние в ТЗ появились. Сам не мог понять свой код через пару месяцев )
14 SherifSP
 
05.08.13
17:19
(13) А представь если бы читал кто то другой)
15 SherifSP
 
05.08.13
17:20
+(14) Вон Fish например, он бы тебя не раз вспомнил))
16 Сти
 
05.08.13
17:24
(15) Да пусть вспоминает, я икать не буду ) А тот код тоже был одноразовым, просто порядок в файловом хламе наводил, и пытался понять что это было и зачем, нужно или нет.
17 Сти
 
05.08.13
17:27
(11) а тут так, конечно же, в том посте споткнулся в одном месте:

ТЗКолСтрок = ТЗ.Количество();
Для x = 1 по ТЗКолСтрок Цикл
   Строка = ТЗ[ТЗКолСтрок - x]
КонецЦикла;