Имя: Пароль:
1C
1С v8
Головоломка в цикле
, , ,
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) снимаю...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.