|
Головоломка в цикле | ☑ | ||
---|---|---|---|---|
0
capllary
17.11.14
✎
08:30
|
Народ, помогите разобраться: есть модуль печатной формы, в ней есть цикл, при котором формируется несколько форм, в зависимости от кол-ва разных складов в табчасти документа (к примеру их три), а так же есть запрос, который выдает названия этих разных складов, список которых можно получить только циклом. Теперь вопрос, как подвязать один цикл к другому, чтобы к примеру при первом проходе цикла заполнялось первое значение наименования склада, при втором второе и т.д. (ЗаголовокДокумента.Параметры.СкладНаименование)? Сейчас фозвращается только последнее значение.
А вот сам модуль печати: ТабДок=Новый ТабличныйДокумент; //Запрос наименование складов ЗапросПоНаименованиюСкладов = Новый Запрос(); ЗапросПоНаименованиюСкладов.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка); ЗапросПоНаименованиюСкладов.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | АвансовыйОтчетТовары.Склад КАК Склад |ИЗ | Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары |ГДЕ | АвансовыйОтчетТовары.Ссылка = &ТекущийДокумент"; ЗапросПоНаименованиюСкладов = ЗапросПоНаименованиюСкладов.Выполнить().Выбрать(); Пока ЗапросПоНаименованиюСкладов.Следующий() Цикл НаименованиеСклад = ЗапросПоНаименованиюСкладов.Склад; Сообщить(НаименованиеСклад); КонецЦикла; к = 1; Пока к < ЗапросПоСкладам.Склад + 1 Цикл ТабДок.ПолеСверху = 0; ТабДок.ПолеСлева = 0; ТабДок.ПолеСнизу = 0; ТабДок.ПолеСправа = 0; ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АвансовыйОтчет_М4"; Макет = ПолучитьМакет("М4"); //Заполним Шапку Шапка=Макет.ПолучитьОбласть("Шапка"); Шапка.Параметры.Заполнить(Шапка); СведенияОПокупателе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка_запрос.Организация, Шапка_запрос.ДатаСоставления); Адрес = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "ЮридическийАдрес"); Телеф = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "Телефоны"); Шапка.Параметры.ПредставлениеОрганизации = СсылкаНаОбъект.Организация.НаименованиеСокращенное + " "+Адрес+" "+Телеф; Шапка.Параметры.ОрганизацияПоОКПО = СведенияОПокупателе.КодПоОКПО; Шапка.Параметры.НомерДокумента = (ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка_запрос))+"-"+к; ТабДок.Вывести(Шапка); // Заполним заголовок докмента ЗаголовокДокумента=Макет.ПолучитьОбласть("ЗаголовокДокумента"); ЗаголовокДокумента.Параметры.Заполнить(ЗаголовокДокумента); ЗаголовокДокумента.Параметры.Заполнить(Шапка_запрос); ЗаголовокДокумента.Параметры.Дата = Шапка_запрос.ДатаСоставления; ПредставлениеКонтрагента = Шапка_запрос.Поставщик; ЗаголовокДокумента.Параметры.СкладНаименование = НаименованиеСклад; //ЗаголовокДокумента.Параметры.СкладНаименование = ПолучитьСклад(); ЗаголовокДокумента.Параметры.ПоставщикНаименование = ПредставлениеКонтрагента; ТабДок.Вывести(ЗаголовокДокумента); // Заполним ЗаголовокТаблицы ЗаголовокТаблицы=Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ЗаголовокТаблицы.Параметры.Заполнить(ЗаголовокТаблицы); ТабДок.Вывести(ЗаголовокТаблицы); //Заполним Строка Строка=Макет.ПолучитьОбласть("Строка"); Строка.Параметры.Заполнить(Строка); // Инициализация итогов в документе ИтогоКоличествоПринято = 0; ИтогоСуммаБезНДС = 0; ИтогоСуммаНДС = 0; ИтогоВсегоСНДС = 0; Ном = 0; НомерСтраницы = 1; НомерСтроки = 0; КоличествоСтрок = ЗапросТовары.Количество(); Для Каждого ВыборкаСтрок Из ЗапросТовары Цикл Строка.Параметры.Заполнить(ВыборкаСтрок); Кратность = ?(Шапка_запрос.Кратность = 0, 1, Шапка_запрос.Кратность); ВсегоСНДС = (ВыборкаСтрок.Стоимость + ?(Шапка_запрос.СуммаВключаетНДС, 0, ВыборкаСтрок.СуммаНДС)); КоличествоПринято = ВыборкаСтрок.КоличествоПринято; СуммаНДС = ВыборкаСтрок.СуммаНДС; Цена = (ВсегоСНДС - СуммаНДС) / ?(КоличествоПринято = 0, 1, КоличествоПринято); Строка.Параметры.КоличествоПринято = КоличествоПринято; Строка.Параметры.ВсегоСНДС = ВсегоСНДС; Строка.Параметры.СуммаБезНДС = ВсегоСНДС - СуммаНДС; Строка.Параметры.СуммаНДС = СуммаНДС; Строка.Параметры.Цена = Цена; Строка.Параметры.ТоварНаименование = СокрЛП(ВыборкаСтрок.ТоварНаименование); ТабДок.Вывести(Строка); ИтогоКоличествоПринято = ИтогоКоличествоПринято + КоличествоПринято; ИтогоСуммаБезНДС = ИтогоСуммаБезНДС + ВсегоСНДС - СуммаНДС; ИтогоСуммаНДС = ИтогоСуммаНДС + СуммаНДС; ИтогоВсегоСНДС = ИтогоВсегоСНДС + ВсегоСНДС; КонецЦикла; // Заполним Итого Итого=Макет.ПолучитьОбласть("Итого"); Итого.Параметры.Заполнить(Итого); Итого.Параметры.ИтогоКоличествоПринято = ИтогоКоличествоПринято; Итого.Параметры.ИтогоСуммаБезНДС = ИтогоСуммаБезНДС; Итого.Параметры.ИтогоСуммаНДС = ИтогоСуммаНДС; Итого.Параметры.ИтогоВсегоСНДС = ИтогоВсегоСНДС; ТабДок.Вывести(Итого); // Заполним Подвал Подвал = Макет.ПолучитьОбласть("Подвал"); Подвал.Параметры.Заполнить(Подвал); ПредставлениеКонтрагента = Шапка_запрос.Поставщик; Подвал.Параметры.ФИОМОЛ=ПредставлениеКонтрагента; Руководители = ОбщегоНазначения.ОтветственныеЛица(СсылкаНаОбъект.Организация, СсылкаНаобъект.Дата, ПодразделениеОтветственныхЛиц ); Подвал.Параметры.ДолжностьПоставщика = Руководители.РуководительДолжность; Подвал.Параметры.ФИОПоставщика = Руководители.РуководительПредставление; ТабДок.Вывести(Подвал); ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); Если к = ЗапросПоСкладам.Склад Тогда Прервать; КонецЕсли; к = к + 1; КонецЦикла; Возврат ТабДок; |
|||
1
capllary
17.11.14
✎
08:33
|
Цикл в цикле уже пробовал, выходит либо нечего, либо только первое значение, либо последнее.
|
|||
2
capllary
17.11.14
✎
08:35
|
Пробовал даже этот цикл выносить в отдельную функцию, но результат так и не получил:
Функция ПолучитьСклад() Экспорт //Запрос наименование складов ЗапросПоНаименованиюСкладов = Новый Запрос(); ЗапросПоНаименованиюСкладов.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка); ЗапросПоНаименованиюСкладов.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | АвансовыйОтчетТовары.Склад КАК Склад |ИЗ | Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары |ГДЕ | АвансовыйОтчетТовары.Ссылка = &ТекущийДокумент"; ЗапросПоНаименованиюСкладов = ЗапросПоНаименованиюСкладов.Выполнить().Выбрать(); Пока ЗапросПоНаименованиюСкладов.Следующий() Цикл НаименованиеСклада = ЗапросПоНаименованиюСкладов.Склад; Сообщить(НаименованиеСклада); КонецЦикла; Возврат НаименованиеСклада; КонецФункции |
|||
3
Cube
17.11.14
✎
08:38
|
(0) Каша каша каша... И нам предлагаешь её доварить?...
Начнем с того, что этот (0) кусок кода не рабочий, т.к. не известно происхождение переменной ЗапросТовары... |
|||
4
capllary
17.11.14
✎
08:39
|
(3) Вот:
//Запрос шапки Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка); Запрос.УстановитьПараметр("ДатаДок", СсылкаНаОбъект.Дата); Запрос.УстановитьПараметр("Организация", СсылкаНаОбъект.Организация); Запрос.Текст = "ВЫБРАТЬ | АвансовыйОтчет.Номер КАК Номер, | АвансовыйОтчет.Дата КАК ДатаСоставления, | АвансовыйОтчет.Организация, | АвансовыйОтчет.Организация КАК Организация, | АвансовыйОтчет.СкладОрдер КАК МестоПриемки, | АвансовыйОтчет.СкладОрдер.Представление КАК СкладНаименование, | АвансовыйОтчет.ФизЛицо.Код КАК ПоставщикКод, | АвансовыйОтчет.ФизЛицо КАК Поставщик, | АвансовыйОтчет.ВалютаДокумента, | АвансовыйОтчет.КурсДокумента КАК Курс, | АвансовыйОтчет.КратностьДокумента КАК Кратность, | АвансовыйОтчет.СуммаВключаетНДС |ИЗ | Документ.АвансовыйОтчет КАК АвансовыйОтчет |ГДЕ | АвансовыйОтчет.Ссылка = &ТекущийДокумент"; Шапка_запрос = Запрос.Выполнить().Выбрать(); Шапка_запрос.Следующий(); //Запрос товаров ЗапросПоТоварам = Новый Запрос(); ЗапросПоТоварам.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка); ЗапросПоТоварам.Текст = "ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура, | ВЫРАЗИТЬ(ВложенныйЗапрос.Номенклатура.НаименованиеПолное КАК Строка(1000)) КАК ТоварНаименование, | ВложенныйЗапрос.Номенклатура.Код КАК ТоварКод, | ВложенныйЗапрос.ЕдиницаИзмерения.Наименование КАК ЕдиницаИзмеренияНаименование, | ВложенныйЗапрос.ЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод, | ВложенныйЗапрос.СтавкаНДС, | ВложенныйЗапрос.КоличествоПринято, | ВложенныйЗапрос.Стоимость, | ВложенныйЗапрос.СуммаНДС, | ВложенныйЗапрос.НомерСтроки |ИЗ | (ВЫБРАТЬ | АвансовыйОтчет.Номенклатура КАК Номенклатура, | АвансовыйОтчет.Номенклатура.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения, | АвансовыйОтчет.СтавкаНДС КАК СтавкаНДС, | СУММА (АвансовыйОтчет.Количество) КАК КоличествоПринято, | СУММА (АвансовыйОтчет.Сумма) КАК Стоимость, | СУММА (АвансовыйОтчет.СуммаНДС) КАК СуммаНДС, | МИНИМУМ(АвансовыйОтчет.НомерСтроки) КАК НомерСтроки | ИЗ | Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчет | | ГДЕ | АвансовыйОтчет.Ссылка = &ТекущийДокумент | | СГРУППИРОВАТЬ ПО | АвансовыйОтчет.Номенклатура, | АвансовыйОтчет.Количество, | АвансовыйОтчет.Цена, | АвансовыйОтчет.СтавкаНДС) КАК ВложенныйЗапрос | |УПОРЯДОЧИТЬ ПО | НомерСтроки"; ЗапросТовары = ЗапросПоТоварам.Выполнить().Выгрузить(); //Запрос кол-ва складов ЗапросПоСкладам = Новый Запрос(); ЗапросПоСкладам.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка); ЗапросПоСкладам.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ВложенныйЗапрос.Склад, 0) КАК Склад |ИЗ | (ВЫБРАТЬ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ АвансовыйОтчет.Склад) КАК Склад | ИЗ | Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчет | ГДЕ | АвансовыйОтчет.Ссылка = &ТекущийДокумент) КАК ВложенныйЗапрос"; ЗапросПоСкладам = ЗапросПоСкладам.Выполнить().Выбрать(); ЗапросПоСкладам.Следующий(); |
|||
5
capllary
17.11.14
✎
08:39
|
(3) Все запросы верные значения формируют.
|
|||
6
Cube
17.11.14
✎
08:40
|
Ты лучше начни с постановки задачи: покажи нам в каком виде должна быть твоя печатная форма.
Не надо тут свой портянки левой пяткой написанные вываливать... |
|||
7
capllary
17.11.14
✎
08:42
|
Должно быть во первых, количество печатных форм должно зависеть от кол-ва разных складов в табличной части документа (запрос ЗапросПоСкладам), а в них ЗаголовокДокумента.Параметры.СкладНаименование должно быть равно наименованиям склада, полученных в запросе ЗапросПоНаименованиюСкладов
|
|||
8
capllary
17.11.14
✎
08:44
|
(6) Ну и соответственно в каждой печатной форме чтобы формировались значения по складам. В первой по первому полученному складу, во второй по второму и т.д.
|
|||
9
Cube
17.11.14
✎
08:44
|
(7) Жги ещё, но учти, телепатов тут нет. Или рисуй печатную форму в экселе и показывай нам или сам разбирайся...
|
|||
10
capllary
17.11.14
✎
08:46
|
(9) Вроде все подробно описал.
|
|||
11
Cube
17.11.14
✎
08:49
|
(10) Если хочешь, чтобы я помог, подавай информацию в том виде, в каком я прошу, а не в том, в каком считаешь нужным...
Мне совершенно не видна конечная цель, следовательно, ничего посоветовать не могу, кроме позвать специалиста... |
|||
12
capllary
17.11.14
✎
08:50
|
(9) Еще хотел сказать что документ Авансовый отчет доработан, и теперь в табчасти Товары выбирается склад к которому этот товар относиться. Соответственно сколько там позиций номенклатур, столько и складов.
|
|||
13
capllary
17.11.14
✎
08:54
|
(11) Цель: После формирования документа при выпуске печатной формы Приходного ордера разделить его по складам, т.е. если в табчасти три разных склада, то и форм будет три (это уже решено), а так в каждой из этих трех печ форм информация только по одному складу.
|
|||
14
Cube
17.11.14
✎
08:58
|
(13) То есть, ты для АО делаешь ПФ "Приходный ордер на товары"? И всё? Тогда вообще не понял, где проблема...
|
|||
15
capllary
17.11.14
✎
08:58
|
Загвоздка щас только в одном, как вставлять значения полученные в ходе одного цикла в другой.
|
|||
16
capllary
17.11.14
✎
09:00
|
(15) О чем я и спрашивал в (0)
|
|||
17
capllary
17.11.14
✎
09:04
|
Есть идеи?
|
|||
18
Cube
17.11.14
✎
09:05
|
(17) Конечно есть: выкинь свой амнокод и делай так:
Процедура Печать() Экспорт ТабДокумент = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьМакета = Макет.ПолучитьОбласть("ОбластьМакета"); ТаблицаТоваров = СсылкаНаОбъект.Товары.Выгрузить(); ТаблицаТоваров.Сортировать("Склад, Номенклатура"); ТекущийСклад = Справочники.Склады.ПустаяСсылка(); Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл Если СтрокаТаблицы.Склад <> ТекущийСклад Тогда Если НЕ ТекущийСклад.Пустая() Тогда ТабДокумент.Показать(); КонецЕсли; ТабДокумент = Новый ТабличныйДокумент; КонецЕсли; ОбластьМакета.Параметры.Заполнить(СтрокаТаблицы); ТабДокумент.Вывести(ОбластьМакета); ТекущийСклад = СтрокаТаблицы.Склад; КонецЦикла; Если НЕ ТекущийСклад.Пустая() Тогда ТабДокумент.Показать(); КонецЕсли; КонецПроцедуры //Печать() |
|||
19
capllary
17.11.14
✎
09:16
|
(18) Не в обиду, но что-то и твой код не особо работает. Либо я еще не такой гуру 1с.
|
|||
20
Cube
17.11.14
✎
09:20
|
(19) Что не так, конкретнее говори.
|
|||
21
capllary
17.11.14
✎
09:23
|
(20) Вобщем результат вышел все равно по всем трем складам в каждой форме. Хотя наверное потому что я оставил цикл.
|
|||
22
Cube
17.11.14
✎
09:27
|
(21) Потому что ты напортачил. Мой код, практически, идеален^^
|
|||
23
Леха Дум
17.11.14
✎
09:31
|
вроде не пятница, неделя только началась...
|
|||
24
capllary
17.11.14
✎
09:45
|
(22) Может твой код и идеален, но я нашел решение лучше для себя:
Вместо Пока к < ЗапросПоСкладам.Склад + 1 Цикл надо было поставить Пока к < ЗапросПоСкладам.Склад + 1 И ЗапросПоНаименованиюСкладов.Следующий() Цикл. Вот об этом я и спрашивал в (0) . |
|||
25
Cube
17.11.14
✎
10:07
|
(24) Моя твоя не понимает...
|
|||
26
Salimbek
17.11.14
✎
10:14
|
(25) Ты классически пропустил важнейший момент, а автору скилла не хватит, чтобы самому догадаться:
Если СтрокаТаблицы.Склад <> ТекущийСклад Тогда Если НЕ ТекущийСклад.Пустая() Тогда ТабДокумент.Показать(); КонецЕсли; ТабДокумент = Новый ТабличныйДокумент; ТекущийСклад = СтрокаТаблицы.Склад; //<<Вот этот КонецЕсли; |
|||
27
Cube
17.11.14
✎
10:17
|
(26) Не пропустил, ты просто не внимателен: смотри перед КонецЦикла;
|
|||
28
Enders
17.11.14
✎
11:04
|
(18) А не проще ли запросом с итогами по складу и обходить результат по группировкам?
При каждом проходе верхней выборки создавать, заполнять и показывать печатную форму детальной выборкой. Или же получить ТЗ складов, обходить её циклом, при каждом проходе создавать, заполнять Товарами через метод "НайтиСтроки" и показывать печатную форму? Хотя, судя по постам, ТС ещё рано об этом знать) |
|||
29
Salimbek
17.11.14
✎
13:38
|
(27) Хех, точно, правда непонятно, для чего постоянно перезаписывать если Склад не изменился, ну это не столь важно.
Свое замечание в (26) снимаю... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |