Имя: Пароль:
1C
 
Продажи за несколько периодов
0 san4ez1008
 
20.12.16
03:03
И снова здравствуйте. Почти добил отчет по подсчету количества продаж за период. Вроде все сделал, но что-то не ладится.. В общем,ситуевина следующая. Запрос мне вытаскивает все продажи,которые были,кроме нулевых. При указывании группировки "Товар упорядочить по Товар.Наименование без групп все" начинается вывод нулевых продаж с каким-то задвоением, причем коды многих позиций начинают повторяться,да еще и код этой позиции не соответствует коду в справочнике. Не понимаю, что тут происходит, прошу помочь разобраться. Конфиг комплексная 4.5.

Перем ТекСтрокаВТаблице; // текущая строка в таблице значений  МФ
//*******************************************
Процедура Сформировать()
  
    ТЗПериод.ВыбратьСтроки();
    КолПериодов = ТЗПериод.КоличествоСтрок();

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    //Таб.ВывестиСекцию("Заголовок");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Таб.ВывестиСекцию("Заголовок1");
    Таб.ВывестиСекцию("Заголовок|Код");
    Таб.ПрисоединитьСекцию("Заголовок|Лев");  
  
    Для к=1 По КолПериодов Цикл
        НачДата = ТЗПериод.ПолучитьЗначение(к,"Период_С");
           КонДата  =  ТЗПериод.ПолучитьЗначение(к,"Период_По");
           Периодтек = "С "+НачДата+" по "+КонДата;
           Таб.ПрисоединитьСекцию("Заголовок|Мес");
    КонецЦикла;
      
    Таб.ПрисоединитьСекцию("Заголовок|Период");
  
    //ТЗВспом = СоздатьОбъект("ТаблицаЗначений");
    ТЗВспом.Очистить();
    ТЗВспом.НоваяКолонка("Код",,,,"Код",4);
    ТЗВспом.НоваяКолонка("Товар",,,,"Товар",10);
    ТЗВспом.НоваяКолонка("Количество",,,,"Количество",4);
    ТЗВспом.НоваяКолонка("Период",,,,"Период",2);
  
    Для й=1 По КолПериодов Цикл
           НачДата = ТЗПериод.ПолучитьЗначение(й,"Период_С");
           КонДата = ТЗПериод.ПолучитьЗначение(й,"Период_По");
        //Перем Запрос, ТекстЗапроса, Таб;
        //Создание объекта типа Запрос
        //ТабВыгр = СоздатьОбъект("ТаблицаЗначений");
        Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с НачДата по КонДата;
        |Обрабатывать НеПомеченныеНаУдаление;
        |Без итогов;
        |Товар = Документ.ОтчетККМ.Номенклатура.ТекущийЭлемент;
        |Код = Документ.ОтчетККМ.Номенклатура.Код;
        |Наименование = Документ.ОтчетККМ.Номенклатура.Наименование;
        |Количество = Документ.ОтчетККМ.Количество;
        |ТТ = Документ.ОтчетККМ.Склад;
        |Функция КоличествоСумма = Сумма(Количество);            
        |Группировка Товар упорядочить по Товар.Наименование без групп все;
        |Группировка Месяц все;
        |Группировка Код;  
        |Условие(Товар в СписокЭлементовМФ);
        |Условие(ТТ в ВыбТТ);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат;
        КонецЕсли;
      
        Запрос.Выгрузить(ТабВыгр);
        ТабВыгр.ВыбратьСтроки();
        Номен="" ;
        Итог=0;
        Прирост = 0;
      
        Пока ТабВыгр.ПолучитьСтроку()=1 Цикл                
                ТЗВспом.НоваяСтрока();
                ТЗВспом.Код           = ТабВыгр.Код;
                ТЗВспом.Товар        = ТабВыгр.Товар;
                Если ПустоеЗначение(ТабВыгр.КоличествоСумма)=1 тогда
                    ТЗВспом.Количество  = 0;
                иначе
                    ТЗВспом.Количество  = ТабВыгр.КоличествоСумма;
                конецесли;
                ТЗВспом.Период       = й;
        КонецЦикла;
    КонецЦикла;
//
    Итог=0;
    Прирост = 0;
    ТЗВспом.Сортировать("Товар,Период +");
    Номен="";
    Для N = 1 По ТЗВспом.КоличествоСтрок() Цикл
        Код             = "( "+ТЗВспом.ПолучитьЗначение(N,"Код")+" )";
        Номенклатура    = ТЗВспом.ПолучитьЗначение(N,"Товар");
        //Месяц            = ТЗВспом.ПолучитьЗначение(N,"Месяц");
        Количество         = ТЗВспом.ПолучитьЗначение(N,"Количество");
        Если Номен <> Номенклатура тогда              
            Если N =1
                тогда
                иначе
                    Таб.ПрисоединитьСекцию("Сформировать|Период");
                    Итог =0;
            конецесли;

            Таб.ВывестиСекцию("Сформировать|Код");
            Таб.ПрисоединитьСекцию("Сформировать|Лев");
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
            Итог = Итог+Количество;
            Номен = Номенклатура;
           иначе
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
            Итог = Итог+Количество;
        КонецЕсли;
    КонецЦикла;
         // Подготовка к заполнению выходных форм данными запроса
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
1 san4ez1008
 
20.12.16
03:05
Прошу прощения у модератора,забыл указать раздел
2 Злопчинский
 
20.12.16
04:05
3 Злопчинский
 
20.12.16
04:07
Листай, там для 777 есть хорошие, я даже вот сейчас себе выцепил...
4 Злопчинский
 
20.12.16
04:11
|Группировка Товар упорядочить по Товар.Наименование без групп все;
|Группировка Месяц все;
|Группировка Код;  

Код и товар - это одно и тоже - это товар. как ты себе навскидку представляешь группировку в виде Товар-Месяц-Товар? я вот сразу мозг сломал
5 san4ez1008
 
20.12.16
04:14
(2) (3) (4) объясни глупому,как иначе ручками сделать? я ж учусь)
6 san4ez1008
 
20.12.16
04:17
отчет то в принципе работает, мне только надо учитывать нулевые продажи и выводить их в табличку, так то все работает
7 Злопчинский
 
20.12.16
04:19
Что значит "нулевые продажи"?
8 Злопчинский
 
20.12.16
04:19
|Группировка Код;  
убери нафиг
9 san4ez1008
 
20.12.16
04:23
(7) значит,что продаж в месяце было 0. потому как запрос в периодах 1,2,3 не видит продаж в периоде 1,поэтому и данных нет по этому периоду. (8) а код мне как вытянуть тогда?
10 Злопчинский
 
20.12.16
04:35
там где нужен код попробуй просто написать Запрос.Код
11 Злопчинский
 
20.12.16
04:37
(9) тут я мутновато сам. попробуй группировка месяц все вошедшие в запрос - как-то так
12 Злопчинский
 
20.12.16
04:39
а вообще
сразу после запроса

ТЗ=""; Запрос.Выгрузить(ТЗ,1,0);
//непечатать ТЗ или ТЗ.ВыбратьСтроку(,) и втыкай все ли утебя в таблице есть
а еще лучше эту ТЗ подсунь в обработку универсального вывода ТЗ с группировками поищи у меня ан ИС по NotaBene - она тебе сама разложит все по нормально, по строкам товары, по столбцам периоды
13 Злопчинский
 
20.12.16
04:41
уй блин. как все запущено. стучись в скайп, ща забульбеним оперативно, удаленку только давай.
14 Злопчинский
 
20.12.16
04:42
скайп Zlopun
15 san4ez1008
 
20.12.16
04:51
|Группировка Товар упорядочить по Товар.Код без групп все;
|Группировка Месяц;

все норм,нули вышли как положено,только последнее значение итога не досчитывает..

Запрос.Код ничего не выводит
16 Злопчинский
 
20.12.16
05:08
какое на! последнее значение итога?
у тебя стоит "без ИТОГОВ"

сделай подсчет итога в цикле вывода

вообще мутно все.

все что надо - оставить твой запрос без циклов.
период указать с самого началла до самого конца.
запрос выгрузить в ТЗ
ТЗ подсунуть сюда: http://catalog.mista.ru/public/14794/
Черновик вывода получается за 20 минут.
с группировками/расшифровками/шахматками.
будешь сам изобретать - наизобретаешь свинтопрульный аппарат. в качестве хобби - ок.
но мы же стоим у станка...
17 san4ez1008
 
20.12.16
06:06
(16) итоги по каждой позиции, я из сам подсчитываю, только вот именно последнюю не считает.. =/ с кодом и со всем остальным разобрался,осталось только это
    Для N = 1 По ТЗВспом.КоличествоСтрок() Цикл
        Код             = "( "+ТЗВспом.ПолучитьЗначение(N,"Код")+" )";
        Номенклатура    = ТЗВспом.ПолучитьЗначение(N,"Товар");
        //Месяц            = ТЗВспом.ПолучитьЗначение(N,"Месяц");
        Количество         = ТЗВспом.ПолучитьЗначение(N,"Количество");
        Если Номен <> Номенклатура тогда                
            Если N =1
                тогда
                иначе
                    Таб.ПрисоединитьСекцию("Сформировать|Период");
                    Таб.ПрисоединитьСекцию("Сформировать|Прирост");
                    Таб.ПрисоединитьСекцию("Сформировать|Коэфф");
                    Итог =0;
                    Прирост = 0;
            конецесли;

            Таб.ВывестиСекцию("Сформировать|Код");
            Таб.ПрисоединитьСекцию("Сформировать|Лев");
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
//подсчет итогов
            Итог = Итог+Количество;
            Номен = Номенклатура;
            Если Итог<>0 тогда
                Прирост = Окр(Кол/Итог,4);
            Иначе
                Прирост = 0;
            КонецЕсли;
           иначе
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
            Итог = Итог+Количество;
            Если Итог<>0 тогда
                Прирост = Окр(Кол/Итог,4);
            Иначе
                Прирост = 0;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
18 san4ez1008
 
20.12.16
06:47
(16) опять же,я не смогу в том готовом отчете выбрать произвольный период,как я делаю.. если мне нужно проанализировать 3 месяца с 4 по 21 число,что тогда?
19 san4ez1008
 
20.12.16
09:10
чет недопонимаю...почему он последние значения недоприсоединяет?
20 san4ez1008
 
20.12.16
11:00
Для N = 1 По ТЗВспом.КоличествоСтрок() Цикл
        Код             = "( "+ТЗВспом.ПолучитьЗначение(N,"Код")+" )";
        Номенклатура    = ТЗВспом.ПолучитьЗначение(N,"Товар");
        //Месяц            = ТЗВспом.ПолучитьЗначение(N,"Месяц");
        Количество         = ТЗВспом.ПолучитьЗначение(N,"Количество");
        Если Номен <> Номенклатура тогда                
            Если N =1 тогда
            
                иначе
                    Таб.ПрисоединитьСекцию("Сформировать|Период");
                    Таб.ПрисоединитьСекцию("Сформировать|Прирост");
                    Таб.ПрисоединитьСекцию("Сформировать|Коэфф");
                    Итог =0;
                    Прирост = 0;
            
            конецесли;

            Таб.ВывестиСекцию("Сформировать|Код");
            Таб.ПрисоединитьСекцию("Сформировать|Лев");
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
            Итог = Итог+Количество;
            Номен = Номенклатура;
            Если Итог<>0 тогда
                Прирост = Окр(Кол/Итог,4);
            Иначе
                Прирост = 0;
            КонецЕсли;
            
        иначе
            Таб.ПрисоединитьСекцию("Сформировать|Мес");
            Кол = Количество;
            Итог = Итог+Количество;
            Если Итог<>0 тогда
                Прирост = Окр(Кол/Итог,4);
            Иначе
                Прирост = 0;
            КонецЕсли;
            
        КонецЕсли;
    КонецЦикла;
вот вроде все нормально,а последнюю строку недоприсоединяет..
21 san4ez1008
 
21.12.16
05:24
все,сделал наконец-то
22 san4ez1008
 
26.12.16
05:32
а как мне теперь убрать все строки, где продажи за все месяца нулевые?
23 san4ez1008
 
10.01.17
03:06
(16) может эту тему уже никто не просматривает, но все же,вопрос из (18) еще актуален...
24 peal
 
10.01.17
05:29
(18) ДобавитьМесяц(<Дата>,<ЧислоМесяцев>) попробуй использовать