Имя: Пароль:
1C
1С v8
Запросы и циклы (печатная форма)
0 Молодой и неопытный
 
17.06.19
13:24
Привет, я молодой и малознающий самоучка... вот впервые столкнулся с запросами вместе с циклами, прошу помочь чем можете (вероятно я жутко туплю).
Напишу много т.к. кратко не выйдет.
Буду благодарен за любую подсказку.

Смотрим в самый низ основной код... как видите у нас Дописей очень много, и мне приходится очень много возится каждый раз.
Не могу придумать как вставить дополнительное условие в цикл. Я уже многое разжевал но пока не смог переварить это...
Что мы имеем:
Отрывок кода из МХ18, печатается "отчёт производства за смену" при нажатии на кнопку Печать.
Сама форма "отчета производства за смену" выглядит вот так: http://skrinshoter.ru/s/170619/dWmOfPOD?a

В чем проблема:    
  Есть проблема в коде а именно в этом отрывке цикла, здесь идёт отбор только по наименованию характеристики номенклатуры из за этого когда  Наименование совпадают происходит сбой.
(его найдёте в самом низу в основной формуле в самом низу)


Пока Выборка.Следующий() Цикл    
ТЧ_П_ДокументОснование=Выборка.ТЧ_П_ДокументОснование;
НомерПТО=выборка.НомерПТО;
КонецЦикла;


Приведу пример где выходит неверно:
1) Следим за этими двумя позициями. Жмём печать отчета...
http://skrinshoter.ru/s/170619/TWHolkMN?a
2) Выводит отчет... где у нас видно что две наши позиции  выдало одинаковые Сложные заказы а они должны быть разные.  
http://skrinshoter.ru/s/170619/oNv3bvFE

3)Пошагово посмотрев как себя ведёт цикл в нашем случае... увидел что из за того что наименование одинаковое  цикл повторяет и назначает последнее в цикле значение (т.е. последний сложный заказ в списке отобранного запросом с одинаковым названием оно будет выбирать всегда)

На скрине показываю как выглядит эти два заказа в заказе покупателя... тут видно что мы имеем разные номера сложных заказов но одинаковые наименования.
http://skrinshoter.ru/s/170619/EtaKAjsZ?a
  

Что мне нужно:  
Мне нужно чтобы отбор был не только по Наименованию характеристики номеклатура , но и по Номеру Сложного заказа(ТЧ_П_ДокументОснование),
или хотя бы подсказку куда копать и где и что может пригодится (Материалы).

Мои действия и попытки:
при исправлении этого части формулы ... у меня выдавало ошибку что неможет найти "ТЧ_П_ДокументОснование" в ЗапросДокОснование.УстановитьПараметр("КлючСтроки2",ВыборкаСтрок.ТЧ_П_ДокументОснование);

Вот то что я менял:

//вырвано из формулы ниже...
               ЗапросДокОснование = Новый Запрос;
        ЗапросДокОснование.Текст = "ВЫБРАТЬ
        |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование,
            |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование.НомерПТО КАК НомерПТО
        |ИЗ
        |    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
        |ГДЕ
        |    ЗаказПокупателяТовары.Ссылка = &Ссылка
        |    И ЗаказПокупателяТовары.ХарактеристикаНоменклатуры = &КлючСтроки";
        |   И
        |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование= &КлючСтроки2";
  

        ЗапросДокОснование.УстановитьПараметр("Ссылка",ВыборкаСтрок.Заказ);
        ЗапросДокОснование.УстановитьПараметр("КлючСтроки",ВыборкаСтрок.Характеристика);
        ЗапросДокОснование.УстановитьПараметр("КлючСтроки2",ВыборкаСтрок.ТЧ_П_ДокументОснование);






Большой основной отрывок цикла в цикле, отвечающий за ввод данных в печатную форму
т.е. всё смотрим тут:
(если потребуется могу выложить то что было снаружи).


Для Каждого ВыборкаСтрок Из СтрокаПродукция Цикл

        Если НЕ ЗначениеЗаполнено(ВыборкаСтрок.Номенклатура) Тогда
            ОбщегоНазначения.Сообщение("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
            Продолжить;
        КонецЕсли;

        Ном = Ном + 1;
        
        // Проверим, помещается ли строка с данными и последняя строка (или итоги) на странице.
        СтрокаТаблицы = Новый Массив;
        СтрокаТаблицы.Добавить(ОбластьСтрока);
        Если Ном = КоличествоСтрок Тогда
            СтрокаТаблицы.Добавить(ОбластьИтого);
            СтрокаТаблицы.Добавить(ОбластьПодвал);
        КонецЕсли;

        Если НЕ ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, СтрокаТаблицы) Тогда
        
            // очистим итоги по странице
            ИтогоМассаБруттоНаСтранице = 0;
            ИтогоМестНаСтранице        = 0;
            ИтогоКоличествоНаСтранице  = 0;
            ИтогоСуммаНаСтранице         = 0;

            НомерСтраницы = НомерСтраницы + 1;
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
            ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
            ТабДокумент.Вывести(ЗаголовокТаблицы);

        КонецЕсли;

        ОбластьМакета.Параметры.Заполнить(ВыборкаСтрок);
        //cs+140312
        

//Вот здесь нужно видимо добавить в запрос параметр отбор по Сложному заказу но как?

        ЗапросДокОснование = Новый Запрос;
        ЗапросДокОснование.Текст = "ВЫБРАТЬ
        |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование,
            |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование.НомерПТО КАК НомерПТО
        |ИЗ
        |    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
        |ГДЕ
        |    ЗаказПокупателяТовары.Ссылка = &Ссылка
        |    И ЗаказПокупателяТовары.ХарактеристикаНоменклатуры = &КлючСтроки";
        
            
            
            
            
        ЗапросДокОснование.УстановитьПараметр("Ссылка",ВыборкаСтрок.Заказ);
        ЗапросДокОснование.УстановитьПараметр("КлючСтроки",ВыборкаСтрок.Характеристика);
        
        Результат = ЗапросДокОснование.Выполнить();
        Выборка = Результат.Выбрать();
        ТЧ_П_ДокументОснование=Документы.П_СложныйЗаказ.ПустаяСсылка();
        
        
    
        Пока Выборка.Следующий() Цикл    

            ТЧ_П_ДокументОснование=Выборка.ТЧ_П_ДокументОснование;
            НомерПТО=выборка.НомерПТО;
            
        КонецЦикла;
        
        Если ЗначениеЗаполнено(ТЧ_П_ДокументОснование)=Ложь Тогда
             Сообщить("Не найдена ссылка на Расчет заказа, проверьте правильность заполнения характеристики и поля Расчет заказа в табличной части товары в Заказе покупателя");
         КонецЕсли;
         Если НЕ ЗначениеЗаполнено (НомерПТО) Тогда

        ОбластьМакета.Параметры.ТоварНаименование =?(ТипЗнч(ВыборкаСтрок.Заказ)=Тип("ДокументСсылка.ЗаказПокупателя"),"Заказ № "+?(ЗначениеЗаполнено(ТЧ_П_ДокументОснование),ОбщегоНазначения.ПолучитьНомерНаПечать(ТЧ_П_ДокументОснование),"")+"  ","")+ СокрЛП(ВыборкаСтрок.ТоварНаименование) + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрок);
        Иначе

        ОбластьМакета.Параметры.ТоварНаименование =?(ТипЗнч(ВыборкаСтрок.Заказ)=Тип("ДокументСсылка.ЗаказПокупателя"),"Заказ № "+?(ЗначениеЗаполнено(ТЧ_П_ДокументОснование),ОбщегоНазначения.ПолучитьНомерНаПечать(ТЧ_П_ДокументОснование),"")+" "+"("+" "+Строка(НомерПТО)+" "+")"+"  ","")+ СокрЛП(ВыборкаСтрок.ТоварНаименование) + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрок);

        КонецЕсли;
        //cs+140312

        Если НЕ ЗначениеЗаполнено(ЕдиницаИзмеренияВеса) Тогда
            МассаБрутто = 0;
        Иначе
            МассаБрутто = ВыборкаСтрок.МассаБрутто;
            МассаБрутто = ?(МассаБрутто <> Неопределено И МассаБрутто <> NULL, МассаБрутто, 0);
        КонецЕсли;

        Мест        = ВыборкаСтрок.КоличествоМест;
        Мест        = ?(Мест <> Неопределено И Мест <> NULL, Мест, 0);

        Количество  = ВыборкаСтрок.Количество;

        ОбластьМакета.Параметры.МассаБрутто = МассаБрутто;

        ТабДокумент.Вывести(ОбластьМакета);

        // увеличим итоги по странице
        ИтогоМассаБруттоНаСтранице = ИтогоМассаБруттоНаСтранице + МассаБрутто;
        ИтогоМестНаСтранице        = ИтогоМестНаСтранице        + Мест;
        ИтогоКоличествоНаСтранице  = ИтогоКоличествоНаСтранице  + Количество;
        ИтогоСуммаНаСтранице         = ИтогоСуммаНаСтранице        + ВыборкаСтрок.Сумма;

        // увеличим итоги по дукументу
        ИтогоМассаБрутто = ИтогоМассаБрутто + МассаБрутто;
        ИтогоМест        = ИтогоМест        + Мест;
        ИтогоКоличество  = ИтогоКоличество  + Количество;
        ИтогоСумма       = ИтогоСумма        + ВыборкаСтрок.Сумма;

    КонецЦикла;

    
1 Молодой и неопытный
 
17.06.19
13:43
Как я понял, я копаю не там... и надо смотреть шире.
2 hhhh
 
17.06.19
13:56
(1) ну делай всё в одном запросе, не нужно циклы лепить - это сложно, запутаешься.
3 Молодой и неопытный
 
17.06.19
14:29
(2) Вот это да... я попытался вначале цикл сделать дополнительный, и понял что шляпа.
щас начал в запросе копаться, поняв что тут не хватает некоторых условий.
Ладно буду постепенно пытаться копать дальше.
4 ColonelAp4u
 
17.06.19
15:19
(3)      |    И ЗаказПокупателяТовары.ХарактеристикаНоменклатуры = &КлючСтроки";
        |   И
        |    ЗаказПокупателяТовары.ТЧ_П_ДокументОснование= &КлючСтроки2";

убери "; после 1ого параметра КлючСтроки
5 Молодой и неопытный
 
18.06.19
16:24
(4) А это я убирал не обращайте на это внимание. Просто забыл видимо для вас убрать.  
Когда запускаю и жму на печать. выходит это:

{Документ.ОтчетПроизводстваЗаСмену.МодульОбъекта(176)}: Поле объекта не обнаружено (ТЧ_П_ДокументОснование)        ЗапросДокОснование.УстановитьПараметр("КлючСтроки2",ВыборкаСтрок.ТЧ_П_ДокументОснование);
6 hhhh
 
18.06.19
16:34
(5) ну смотри ВыборкаСтрок. Откуда она? с другого запроса? значит там нет такого поля ТЧ_П_ДокументОснование
7 Puzyrevskiy
 
19.06.19
07:57
(5) Я бы порекомендовал научиться пользоваться отладчиком, в данном случае я вижу, что у тебя
"Для Каждого ВыборкаСтрок Из СтрокаПродукция Цикл" значит в СтрокаПродукции, (возможно это Табличная Часть) такого объекта нет. Поставь, где Цикл "Точку останова" и посмотри название объекта, а потом уже его передавай в параметр КлючСтроки2.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан