Имя: Пароль:
1C
1С v8
Цикл в цикле
, ,
0 capllary
 
14.11.14
13:00
Подскажите, возможен ли цикл в цикле? Вот так:

к = 0;
    Пока к < ЗапросПоСкладам.Склад Цикл
    Сообщить("Раз");    
            
        
    // Зададим параметры макета
    ТабДок=Новый ТабличныйДокумент;
    ТабДок.ПолеСверху         = 0;
    ТабДок.ПолеСлева          = 0;
    ТабДок.ПолеСнизу          = 0;
    ТабДок.ПолеСправа         = 0;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АвансовыйОтчет_М4";
    Макет = ПолучитьМакет("М4");
        
    //Заполним Шапку
    Шапка=Макет.ПолучитьОбласть("Шапка");
    Шапка.Параметры.Заполнить(Шапка);
    СведенияОПокупателе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка_запрос.Организация, Шапка_запрос.ДатаСоставления);
    Адрес = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "ЮридическийАдрес");
    Телеф = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "Телефоны");
    Шапка.Параметры.ПредставлениеОрганизации = СсылкаНаОбъект.Организация.НаименованиеСокращенное + "  "+Адрес+"  "+Телеф;
    Шапка.Параметры.ОрганизацияПоОКПО        = СведенияОПокупателе.КодПоОКПО;
    Шапка.Параметры.НомерДокумента           = ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка_запрос);
    ТабДок.Вывести(Шапка);
    
    // Заполним заголовок докмента
    ЗаголовокДокумента=Макет.ПолучитьОбласть("ЗаголовокДокумента");
    ЗаголовокДокумента.Параметры.Заполнить(ЗаголовокДокумента);
    ЗаголовокДокумента.Параметры.Заполнить(Шапка_запрос);
    ЗаголовокДокумента.Параметры.Дата = Шапка_запрос.ДатаСоставления;
    ПредставлениеКонтрагента = Шапка_запрос.Поставщик;
    ЗаголовокДокумента.Параметры.ПоставщикНаименование = ПредставлениеКонтрагента;
    ТабДок.Вывести(ЗаголовокДокумента);

    // Заполним ЗаголовокТаблицы
    ЗаголовокТаблицы=Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ЗаголовокТаблицы.Параметры.Заполнить(ЗаголовокТаблицы);
    ТабДок.Вывести(ЗаголовокТаблицы);
    
    //Заполним Строка
    Строка=Макет.ПолучитьОбласть("Строка");
    Строка.Параметры.Заполнить(Строка);

    // Инициализация итогов в документе
    ИтогоКоличествоПринято = 0;
    ИтогоСуммаБезНДС       = 0;
    ИтогоСуммаНДС          = 0;
    ИтогоВсегоСНДС         = 0;
    Ном                    = 0;
    НомерСтраницы   = 1;
    НомерСтроки     = 0;
    КоличествоСтрок = ЗапросТовары.Количество();
            
    Для Каждого ВыборкаСтрок Из ЗапросТовары Цикл
    Строка.Параметры.Заполнить(ВыборкаСтрок);
        Кратность = ?(Шапка_запрос.Кратность = 0, 1, Шапка_запрос.Кратность);
        ВсегоСНДС = (ВыборкаСтрок.Стоимость
                  + ?(Шапка_запрос.СуммаВключаетНДС, 0, ВыборкаСтрок.СуммаНДС));

        КоличествоПринято = ВыборкаСтрок.КоличествоПринято;
        СуммаНДС          = ВыборкаСтрок.СуммаНДС;
        Цена              = (ВсегоСНДС - СуммаНДС) / ?(КоличествоПринято = 0, 1, КоличествоПринято);

        Строка.Параметры.КоличествоПринято = КоличествоПринято;
        Строка.Параметры.ВсегоСНДС         = ВсегоСНДС;
        Строка.Параметры.СуммаБезНДС       = ВсегоСНДС - СуммаНДС;
        Строка.Параметры.СуммаНДС          = СуммаНДС;
        Строка.Параметры.Цена              = Цена;
        Строка.Параметры.ТоварНаименование = СокрЛП(ВыборкаСтрок.ТоварНаименование);
        ТабДок.Вывести(Строка);
        ИтогоКоличествоПринято = ИтогоКоличествоПринято + КоличествоПринято;
        ИтогоСуммаБезНДС       = ИтогоСуммаБезНДС       + ВсегоСНДС - СуммаНДС;
        ИтогоСуммаНДС          = ИтогоСуммаНДС          + СуммаНДС;
        ИтогоВсегоСНДС         = ИтогоВсегоСНДС         + ВсегоСНДС;
        КонецЦикла;
    
        // Заполним Итого
        Итого=Макет.ПолучитьОбласть("Итого");
        Итого.Параметры.Заполнить(Итого);
        Итого.Параметры.ИтогоКоличествоПринято = ИтогоКоличествоПринято;
        Итого.Параметры.ИтогоСуммаБезНДС       = ИтогоСуммаБезНДС;
        Итого.Параметры.ИтогоСуммаНДС          = ИтогоСуммаНДС;
        Итого.Параметры.ИтогоВсегоСНДС         = ИтогоВсегоСНДС;
        ТабДок.Вывести(Итого);    
        
        // Заполним Подвал
        Подвал = Макет.ПолучитьОбласть("Подвал");
        Подвал.Параметры.Заполнить(Подвал);
        ПредставлениеКонтрагента = Шапка_запрос.Поставщик;
        Подвал.Параметры.ФИОМОЛ=ПредставлениеКонтрагента;
        Руководители = ОбщегоНазначения.ОтветственныеЛица(СсылкаНаОбъект.Организация, СсылкаНаобъект.Дата, ПодразделениеОтветственныхЛиц );        
        Подвал.Параметры.ДолжностьПоставщика = Руководители.РуководительДолжность;
        Подвал.Параметры.ФИОПоставщика = Руководители.РуководительПредставление;
        ТабДок.Вывести(Подвал);

    Возврат ТабДок;
    
    Если к = ЗапросПоСкладам.Склад Тогда
        Сообщить("ПОКА");
           Прервать;
    КонецЕсли;
    Сообщить("Привет");
    к = к + 1;
    КонецЦикла;
1 Ненавижу 1С
 
гуру
14.11.14
13:00
Цикл в цикле возможен
2 capllary
 
14.11.14
13:01
При значении ЗапросПоСкладам.Склад = 2 Цикл общий должен повторяться, а он идет только один раз.
3 GROOVY
 
14.11.14
13:01
Хорошим тоном считается использование одинакового итератора в обоих циклах.
4 GROOVY
 
14.11.14
13:02
(2) Я думаю, что Склад это не число.
5 Ненавижу 1С
 
гуру
14.11.14
13:03
(2) ты "к" меняешь внутри вложенного цикла, тогда да
нужно менять внутри основного, но вовне вложенного
6 capllary
 
14.11.14
13:03
(4) Число. Это количество разных складов в табчасти.
//Запрос кол-ва складов
    ЗапросПоСкладам = Новый Запрос();
    ЗапросПоСкладам.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
    ЗапросПоСкладам.Текст = "ВЫБРАТЬ
                            |    ЕСТЬNULL(ВложенныйЗапрос.Склад, 0) КАК Склад
                            |ИЗ
                            |    (ВЫБРАТЬ
                            |        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ АвансовыйОтчет.Склад) КАК Склад
                            |    ИЗ
                            |        Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчет
                            |    ГДЕ
                            |        АвансовыйОтчет.Ссылка = &ТекущийДокумент) КАК ВложенныйЗапрос";
    ЗапросПоСкладам = ЗапросПоСкладам.Выполнить().Выбрать();
    ЗапросПоСкладам.Следующий();
7 capllary
 
14.11.14
13:03
(5) То есть?
8 GROOVY
 
14.11.14
13:04
(6) Отладчиком прогуляйся по тексту, смотри значения переменных.
9 Ненавижу 1С
 
гуру
14.11.14
13:04
всё, у тебя тупо в цикле Возврат стоит
10 МойКодУныл
 
14.11.14
13:04
Возврат ТабДок; ни кого не смутил?
11 capllary
 
14.11.14
13:05
(9) Т.е. его надо в конец выгнать.
12 capllary
 
14.11.14
13:05
(9) Щас попробую.
13 Ненавижу 1С
 
гуру
14.11.14
13:06
(11) Возврат прерывает не только цикл, но и всю функциюю
14 capllary
 
14.11.14
13:08
В общем цель такая - в зависимости от количества разных складов в табчасти документа формировать такое же кол-во печатных форм. Есть идеи по реализации?
15 МойКодУныл
 
14.11.14
13:09
(11) Тебе надо иницировать ТабДок вообще вне циклов, а то вернет только последний.
А в конце, где счетчик к увеличиваешь, еще и принудительный разделитель страниц бы вывести для красоты. Чтобы новый склад на новом листе.
16 Ненавижу 1С
 
гуру
14.11.14
13:09
(14) загнать все в функцию и уже ее вызывать несколько раз
17 capllary
 
14.11.14
13:10
(15) Спасибо, попробую.
18 МойКодУныл
 
14.11.14
13:10
(14) вынеси печать по складу в отдельную процедуру и вызывай несколько раз в цикле.
19 capllary
 
14.11.14
13:10
(16) Кстати, как вариант, не подумал об этом.
20 capllary
 
14.11.14
13:11
Пошел кодить, о результатах отпишусь.
21 capllary
 
14.11.14
13:24
Оставил все в одной функции, все заработало, цикл ходит по несколько раз, в конце общего цикла поставил разделить страниц, но следующая страница не формируется. Как я понимаю, она перезаписывает первую страницу.
Как ей указать на то чтобы формировалась следующая страница уже после разделителя?
22 capllary
 
14.11.14
13:25
Вот теперь такая концовка:

    // Заполним Подвал
        Подвал = Макет.ПолучитьОбласть("Подвал");
        Подвал.Параметры.Заполнить(Подвал);
        ПредставлениеКонтрагента = Шапка_запрос.Поставщик;
        Подвал.Параметры.ФИОМОЛ=ПредставлениеКонтрагента;
        Руководители = ОбщегоНазначения.ОтветственныеЛица(СсылкаНаОбъект.Организация, СсылкаНаобъект.Дата, ПодразделениеОтветственныхЛиц );        
        Подвал.Параметры.ДолжностьПоставщика = Руководители.РуководительДолжность;
        Подвал.Параметры.ФИОПоставщика = Руководители.РуководительПредставление;
        ТабДок.Вывести(Подвал);
        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        
    Если к = ЗапросПоСкладам.Склад Тогда
        Сообщить("ПОКА");
           Прервать;
    КонецЕсли;
    Сообщить("Привет");
    к = к + 1;
    КонецЦикла;
    
    Возврат ТабДок;
23 User_Agronom
 
14.11.14
13:28
(3) Один иттератор во вложенных циклах?! И это хороший тон? Жуть! Или блеск?
24 DS
 
14.11.14
13:29
(21) Потому что каждый раз создаешь табдок. Поставь его перед циклом.
25 capllary
 
14.11.14
13:31
(24) Вот теперь четко) и осталось последний штришок это разделить формы по складам.
26 capllary
 
14.11.14
13:32
(24) Но это я думаю сам справлюсь.