Имя: Пароль:
1C
1С v8
Как посчитать итог и вывести в табличный документ
0 Neznaika9
 
26.11.22
18:01
Здравствуйте. Подскажите пожалуйста, ломаю голову не могу сообразить. Как правильно посчитать Итог за неделю. https://transfiles.ru/o5xh3 если за период не было отгрузки и все по нулям то сумма за неделю тоже должна быть ноль(у меня выдает число), если были отгрузки то итог за неделю должен быть подсчитан. Если выводишь за период месяц то должен быть подсчитан итог по каждой неделе месяца.
Вот код. Очень прошу подскажите что делаю не так. Конфигурация Упп    
ТекДата =НачалоДня(НачалоПериода);
Пока ТекДата <= НачалоДня(КонецПериода) Цикл
Если ТекДата = СтрНоменклатура.ДатаОтгрузки  Тогда
СтрокаПериода.Параметры.Количество = СтрНоменклатура.Количество;
Иначе
СтрокаПериода.Параметры.Количество =0;
КонецЕсли;
ТабДок.Присоединить(СтрокаПериода);
СуммаНедели = 0;
СуммаНедели = СуммаНедели + СтрНоменклатура.Количество;
Если ДеньНедели(ТекДата) = 7 И СтрНоменклатура.Количество <> 0  Тогда
ОбластьИтог.Параметры.ИтогЗаНеделю = СуммаНедели;    
ТабДок.Присоединить(ОбластьИтог);
СуммаНедели = 0;
КонецЕсли;
ТекДата = ТекДата + 60*60*24;

                            
КонецЦикла;
1 RomanYS
 
26.11.22
18:48
условие "И СтрНоменклатура.Количество <> 0" явно лишнее
2 Neznaika9
 
26.11.22
18:53
(1) без этого тоже так же, ничего не меняется
3 RomanYS
 
26.11.22
19:16
(2) тогда отладчик. Это явно не весь код, не видно ни одного "Вывести"
4 Neznaika9
 
26.11.22
21:12
(3) Для  Каждого СтрГрузополучатель Из ТабГрузополучатель Цикл
        ОбластьСтрокаКонтрагент.Параметры.Грузополучатель = СтрГрузополучатель.Грузополучатель;
        ТабДок.Вывести(ОбластьСтрокаКонтрагент);
        Для каждого СтрЗаказ Из ТабЗаказы Цикл  
            Если СтрГрузополучатель.Грузополучатель = СтрЗаказ.Грузополучатель Тогда
                ОбластьСтрокаЗаказ.Параметры.Заказ = Лев(СтрЗаказ.Заказ,42);
                 ТабДок.Вывести(ОбластьСтрокаЗаказ);
                Для Каждого СтрНоменклатура Из ТабНоменклатура Цикл
                    Если СтрГрузополучатель.Грузополучатель = СтрНоменклатура.Грузополучатель И СтрЗаказ.Заказ = СтрНоменклатура.Заказ  Тогда
                        ОбластьСтрокаТовар.Параметры.Номенклатура = СтрНоменклатура.Номенклатура;
                        ТабДок.Вывести(ОбластьСтрокаТовар);
                        ЯчейкаПримечание = Макет.Область("Примечание");
                        ТекДата =НачалоДня(НачалоПериода);
                        
                        Пока ТекДата <= НачалоДня(КонецПериода) Цикл
                            Если ТекДата = СтрНоменклатура.ДатаОтгрузки  Тогда
                                СтрокаПериода.Параметры.Количество = СтрНоменклатура.Количество;
                            Иначе
                                СтрокаПериода.Параметры.Количество =0;
                            КонецЕсли;
                            ЯчейкаПримечание.Примечание.Текст = Формат(СтрНоменклатура.ДатаОтгрузки,"ДФ=ЧЧ:мм:сс");
                            ТабДок.Присоединить(СтрокаПериода);
                            СуммаНедели = 0;
                            СуммаНедели = СуммаНедели + СтрНоменклатура.Количество;
                            Если ДеньНедели(ТекДата) = 7 И СтрНоменклатура.Количество <> 0  Тогда
                            ОбластьИтог.Параметры.ИтогЗаНеделю = СуммаНедели;    
                            ТабДок.Присоединить(ОбластьИтог);
                            СуммаНедели = 0;
                            КонецЕсли;
                            ТекДата = ТекДата + 60*60*24;

                            
                        КонецЦикла;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
         КонецЦикла;  
    КонецЦикла;            

Вот код, как что вывожу.
5 Guk
 
26.11.22
21:26
хороший код. забористый...
6 Neznaika9
 
26.11.22
21:29
(5) очень смешно. я спросила совета, может делаю что то не то, есть что сказать по делу так скажите
7 RomanYS
 
26.11.22
21:39
(5) код ужасный как минимум с точки зрения производительности, но понятный. И (0) этот ужас не объяснеет.

(6) исправь (1) и включи уже отладку
8 Neznaika9
 
26.11.22
21:54
(7) Исправила, отладку включила. Что смотреть именно? я посмотрела отладчиком, в упор не вижу проблемы(((
9 RomanYS
 
26.11.22
21:57
(8) так дошагай до того момента, где сумма по дням 0, а итог всё равно выводится
10 Neznaika9
 
26.11.22
22:00
(9)в конце где суммаНедели = о, в отладчике эта сумма совсем не 0
11 RomanYS
 
26.11.22
22:23
Теперь попробуй понять в какой момент она стала отличной от 0
12 Neznaika9
 
26.11.22
22:39
(11) Есть ТабНоменклатура -ТаблицаЗначений https://transfiles.ru/6zcla , каждый раз берется строка с количеством, и понятно что СуммаНедели = СуммаНедели+СтрНоменклатура.Количество становится отличной от нуля. В конце она должна обнуляться но этого не происходит. Проблема связана с тем что у меня в таблице значений?
13 RomanYS
 
26.11.22
23:01
(12) вряд ли проблема в этом. Любую тз можно вывести правильно
14 RomanYS
 
26.11.22
23:03
(4) расчет итога недели нужно засунуть под условие  
  Если ТекДата = СтрНоменклатура.ДатаОтгрузки  Тогда
15 Neznaika9
 
26.11.22
23:12
(14) Теперь итог вообще перестал выводиться
16 RomanYS
 
26.11.22
23:30
(15) потому что не надо итог на каждом шаге обнулять. Ваш код не сумму а последнее значение выводил, и работал он только там где значение было единственное
17 Neznaika9
 
26.11.22
23:35
(16) Тыкнете носом как правильно, очень прошу. Может пример какой.
18 RomanYS
 
27.11.22
00:07
(17) так ткнул уже. Зачем тебе это, если при включённом отладчике ты бежишь на форум спросить где сумма обнуляется? У тебя три строки таких с обнулением, одна явно лишняя.

Правильно всë переписать, но это другая история
19 Said_We
 
27.11.22
19:55
(0) Что такое "ТабГрузополучатель", "ТабЗаказы", "ТабНоменклатура"?

Подозреваю, что данные какого-то регистра или регистров. Может сразу в запросе все данные в правильном виде подготовить и просто по группировкам вывести. Хоть в СКД, хоть ручками. Хоть в консоли запросов - на посмотреть.

Код в (4) очень напоминает код в 7.7. В 8.х так писать не имеет смысла - это на много сложнее чем сделать запросом.
20 Said_We
 
27.11.22
20:27
(0) Судя по картинке, то в итоговом результата всего 4-ре итоговых группировки: Грузополучатель, Заказ, Номенклатура и Неделя (можно начало недели использовать).
Ресурс всего один, это количество.

При выводе три группировки вертикальные и одна горизонтальная (Неделя). Но это не принципиально, СКД сама их разместит как захочет разработчик или пользователь. В 8.х за вывод результата в СКД не нужно думать - это готовый механизм.
21 Neznaika9
 
27.11.22
20:41
(19) Процедура КнопкаСформироватьНажатие(Элемент)
ТабДок = Новый ТабличныйДокумент;

Макет = ПолучитьМакет("Макет");
ШапкаОтчета = Макет.ПолучитьОбласть("ШапкаОтчета");
ШапкаОтчета.Параметры.ЗаголовокОтчета = "Плат отгрузки за период:"+ " " + ПредставлениеПериода(НачалоПериода,КонецПериода, "ФП = Истина");
ТабДок.Вывести(ШапкаОтчета);


ШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы|ОбластьГрузЗаказНомен");
ТабДок.Присоединить(ШапкаТаблицы);

ДатаКолонки = НачалоПериода;
ДатыПериода = Макет.ПолучитьОбласть("ШапкаТаблицы|ДатыПериода");

    Пока ДатаКолонки <= КонецПериода  цикл
        ДатыПериода.Параметры.ДатаДня = Формат(ДатаКолонки , "ДФ=dd.MM.yy");
        ТабДок.Присоединить(ДатыПериода);
        
        Если ДеньНедели(ДатаКолонки) = 7 Тогда
            ОбластьИтогШапка = Макет.ПолучитьОбласть("ШапкаТаблицы|ОбластьИтогЗаНеделю");
            ТабДок.Присоединить(ОбластьИтогШапка);
        КонецЕсли;
        ДатаКолонки = ДатаКолонки + 60*60*24;
    КонецЦикла;
ОбластьСтрокаКонтрагент = Макет.ПолучитьОбласть("СтрокаКонтрагент|ОбластьГрузЗаказНомен");
ТабДок.Область(,3,,4).ШиринаКолонки=35;
ОбластьСтрокаЗаказ = Макет.ПолучитьОбласть("СтрокаЗаказ|ОбластьГрузЗаказНомен");
ОбластьСтрокаТовар = Макет.ПолучитьОбласть("СтрокаТовар|ОбластьГрузЗаказНомен");
СтрокаПериода =Макет.ПолучитьОбласть("СтрокаТовар|ДатыПериода");
ОсбластьСтрокиВывода =Макет.ПолучитьОбласть ("ОбластьВывода");
ОбластьИтог = Макет.ПолучитьОбласть ("СтрокаТовар|ОбластьИтогЗаНеделю");
  

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


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

                            СуммаНедели = 0;
                            СуммаНедели = СуммаНедели + СтрНоменклатура.Количество;
                            Если ДеньНедели(ТекДата) = 7  Тогда
                            ОбластьИтог.Параметры.ИтогЗаНеделю = СуммаНедели;
                            ТабДок.Присоединить(ОбластьИтог);
                               КонецЕсли;
                            ТекДата = ТекДата + 60*60*24;
                        КонецЦикла;
                        
                    КонецЕсли;
                            
                КонецЦикла;
            КонецЕсли;
         КонецЦикла;  
    КонецЦикла;            
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОтображатьСетку = Истина;
    
    ТабДок.ФиксацияСлева = 3;
    ТабДок.Показать();
          
            
КонецПроцедуры
22 Neznaika9
 
27.11.22
20:43
(19) Простите за огромный кусок кода, это полностью вся процедура. С скд еще ни работала ни разу к сожалению. Если не получится сделать так буду разбираться с скд.
23 Said_We
 
27.11.22
20:51
(22) Сразу разбирайся.
Запрос в источник данных засунуть и в настройках добавить итоговых группировок.
Данный отчет пишется без единой строчки кода.
24 Neznaika9
 
27.11.22
20:53
(23) ок, поняла, попробую. Спасибо
25 Said_We
 
27.11.22
21:03
(24) В запросе необходимо будет добавить ещё одно поле:
НАЧАЛОПЕРИОДА(ЗаказПокупателяГрафикОтгрузки.ДатаОтгрузки, Неделя) КАК НеделяОтгрузки

По нему будет одна из итоговых группировок.
26 kittystark
 
27.11.22
21:12
(0) есть такой мультик "Крылья, ноги и хвосты" - в нем вся квинтэссенция сути программирования "лучше день потерять..."
в общем учите запросы и СКД - это надолго в обоих смыслах

через месяц, когда навыки будут прокачаны, данный вопрос будет вызывать умиление :)
Закон Брукера: Даже маленькая практика стоит большой теории.