|
Цикл в цикле | ☑ | ||
---|---|---|---|---|
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) Но это я думаю сам справлюсь.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |