7.7 Подсчет продаж за период

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем aleksandrvolkov, 23 ноя 2016.

  1. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте,форумчане! Так как в 1С еще не полностью разобрался,прошу помощи. Конфигурация комплексная, 4.5. Необходимо во множественном фильтре выбрать некие позиции,выбрать склад, вытащить код, наименование, количество проданных единиц товара за каждый месяц (это может быть как 2, так и 5 месяцев, а может и вообще год), вывести в колонках продажи помесячно в таблицу и просуммировать продажи по каждому товару в еще одну колонку. Со множественным фильтром разобрался, не знаю, каким образом сделать вывод колонок на каждый месяц. Делал подобное с группировкой "День" следующим образом:
    Код:
        Таб.ВывестиСекцию("Шапка|Лев");
        С=ВыбКонПериода-ВыбНачПериода;
        День = ВыбНачПериода;
        Для е=1 по С+1 Цикл
            Таб.ПрисоединитьСекцию("Шапка|День");
            День=День+1;
        КонецЦикла;
    
    а затем методом "Присоединить секцию" добавлял колонки. Как подобное провернуть с группировкой "Месяц"? И откуда достать код номенклатуры, если сам товар дергаю из отчета ккм?
    P.S. И еще вопрос,если нужно брать не последовательный период нескольких месяцев, а, допустим, три (март,июнь,сентябрь), как тогда нужно переделать запрос?
    Последнее редактирование: 25 ноя 2016
  2. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    никто не подскажет?
  3. Бухгалтерский угодник
    Online

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.754
    Симпатии:
    435
    Баллы:
    104
    1) Аналогично как и день
    2) СсылкаНаНоменклатуру.Код
  4. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    да с днем то было все просто,ВыбКонПериода-ВыбНачПериода = количество дней, а вот с месяцами как? В каждом месяце ведь то 30,то 31 день...
  5. Бухгалтерский угодник
    Online

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.754
    Симпатии:
    435
    Баллы:
    104
    в запросе есть понятие группировок.. Месяц
  6. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Код:
    Процедура Сформировать()
        Перем Запрос, ТекстЗапроса, Таб;
        //Создание объекта типа Запрос
        Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с ВыбНачПериода по ВыбКонПериода;
        |Обрабатывать НеПомеченныеНаУдаление;
        |Без итогов;
        |Товар = Документ.ОтчетККМ.Номенклатура.ТекущийЭлемент;
        |Код = Документ.ОтчетККМ.Номенклатура.Код;
        |Наименование = Документ.ОтчетККМ.Номенклатура.Наименование;
        |Количество = Документ.ОтчетККМ.Количество;
        |ТТ = Документ.ОтчетККМ.Склад;
        |Функция КоличествоСумма = Сумма(Количество);
        |Группировка Товар упорядочить по Товар.Наименование;
        |Группировка Месяц;
        |Условие(Товар в СписокЭлементовМФ);
        |Условие(ТТ в ВыбТТ);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат;
        КонецЕсли;
        Запрос.Выгрузить(ТабВыгр);
          
        Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("Сформировать");
        Таб.ВывестиСекцию("Заголовок");
        Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
        Ном="";
       
        Таб.ВывестиСекцию("Заголовок|Лев");
        С=(ВыбКонПериода-ВыбНачПериода)/30;
        Месяц = ВыбНачПериода;
        Для е=1 по С Цикл
            Таб.ПрисоединитьСекцию("Заголовок|Мес");
            Месяц=Месяц+1;
        КонецЦикла;
    чет не очень хорошо получается...
  7. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Вроде получилось, но на выходе таблицы получилось так, что он выводит не названия месяцев, а какую-то фигню...хотя в ТЗ выводится первыми числами месяцев
    Код:
        Таб.ВывестиСекцию("Заголовок|Лев");
        С=ДатаМесяц(ВыбКонПериода)-ДатаМесяц(ВыбНачПериода);
        Месяц = ВыбНачПериода;
        Для е=1 по С+1 Цикл
            Таб.ПрисоединитьСекцию("Заголовок|Мес");
            Месяц=Месяц+ДобавитьМесяц(ВыбНачПериода,1);
        КонецЦикла;
    
        Для N = 1 По ТабВыгр.КоличествоСтрок() Цикл
        //Ном = ТЗ.ПолучитьСтрокуПоНомеру(N);
            //Код             = ТабВыгр.ПолучитьЗначение(N,"Код");
            Номенклатура    = ТабВыгр.ПолучитьЗначение(N,"Товар");
            Месяц            = ТабВыгр.ПолучитьЗначение(N,"Месяц");
            Количество         = ТабВыгр.ПолучитьЗначение(N,"КоличествоСумма");
    
            Если ПустоеЗначение(Месяц)=1 тогда
                продолжить
                иначе
                Если Ном <> Номенклатура тогда
                    Таб.ВывестиСекцию("Сформировать|Лев");
                    Таб.ПрисоединитьСекцию("Сформировать|Мес");
                    Ном = Номенклатура;
                   иначе
                    Таб.ПрисоединитьСекцию("Сформировать|Мес");
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
         // Подготовка к заполнению выходных форм данными запроса
        Таб.ТолькоПросмотр(1);
        Таб.Показать("Сформировать", "");

    Вложения:

    • 1.jpg
      Размер файла:
      432,5 КБ
      Просмотров:
      7
  8. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    И почему-то запрос у меня в ТЗ не выгружает код товара,хотя в запросе я его указываю
  9. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    Здравствуйте.
    У Вас нет группировки по коду, поэтому и не попадает в таблицу. Только код всегда можно получить по номенклатуре, это не критично.
    Чтобы таблица получилась красивой, задайте названия колонок по числу месяцев в периоде. Также нужно в каждой строке присоединять постоянное полное число колонок, а потом заполнять их по дате.
    ТабВыгр.ПолучитьЗначение(N,"Месяц") что у Вас возвращает? Дату или номер месяца? Я не слишком разбираюсь в запросах.
  10. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте,Екатерина. С кодом разобрался,выводится. Да,мне бы желательно выводить названия месяцев хотя бы, но в таблице значений они появляются как первые дни месяца, а затем при выводе в таблицу что-то неведомое происходит...
    Последнее редактирование: 7 дек 2016
  11. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    Это же просто. Преобразуйте дату в месяц методом Формат()
    А даты чуднЫе получаются из-за неправильного использования ДобавитьМесяц. Не нужно плюсовать их к первоначальной дате. Должно получиться что-то вроде (проверьте):
    Код:
    Таб.ВывестиСекцию("Заголовок|Лев");
        С=ДатаМесяц(ВыбКонПериода)-ДатаМесяц(ВыбНачПериода);
        Месяц = ВыбНачПериода;
        Для е=1 по С+1 Цикл
            Месяц=ДобавитьМесяц(Месяц,1);
            МесяцСтрокой = Формат(Месяц,"Д ММММ");
            Таб.ПрисоединитьСекцию("Заголовок|Мес");
        КонецЦикла;
    aleksandrvolkov нравится это.
  12. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Да,все получилось,спасибо большое!) Только надо сначала преобразовать месяц,а потом добавлять,а то он неправильный начальный месяц пишет... И еще вопрос, хочу теперь просуммировать столбцы чтобы вывести общее количество продаж за весь период..как мне это релизовать? И еще продажи,которых не было,он не пропускает... Обработка блин вроде простая,а я зависаю на элементарных вещах...
  13. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    Если данные в таблице значений, то общее количество можно через Итог() вывести. В запросе тоже можно, но это уже не ко мне - не люблю запросы, люблю таблицы. )
    Последнее редактирование: 7 дек 2016
  14. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Так мне надо не общее количество,а по каждой позиции количество продаж за весь период..
  15. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    Самое простое - в начале каждого цикла по строке обнулять переменную СуммаПоСтроке, а потом в цикле по столбцам добвалять к ней количество.
  16. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    Покажите на примере,пожалуйста
  17. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    У Вас в каком виде получается результирующая таблица после запроса?
  18. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    1 - таблица, 2 - ТЗ
    это после всех преобразований в результирующую таблицу

    Вложения:

    • 1.PNG
      1.PNG
      Размер файла:
      18 КБ
      Просмотров:
      8
    • 2.PNG
      2.PNG
      Размер файла:
      15,7 КБ
      Просмотров:
      6
  19. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    466
    Симпатии:
    80
    Баллы:
    54
    Вот пример. Адаптируйте для себя
    Код:
      
    //Создание и заполнение таблицы  
        Таб.СоздатьОбъект("ТаблицаЗначений");
        Таб.НоваяКолонка("Наименование","Текст");
        Таб.НоваяКолонка("Дата1","Число");
        Таб.НоваяКолонка("Дата2","Число");
        Таб.НоваяКолонка("Дата3","Число");
        Таб.НоваяКолонка("ИтогСумма","Число");
        Для сч = 1 По 5 Цикл  
            Таб.НоваяСтрока();
            Таб.Наименование = Строка(сч);
            Таб.Дата1 = сч;
            Таб.Дата2 = сч;
            Таб.Дата3 = сч;
        КонецЦикла;
    //Расчет суммы по колонкам
        Для счСтрок = 1 По Таб.КоличествоСтрок() Цикл
            ИтогСумма = 0;
            Для счКолонок = 2 По Таб.КоличествоКолонок() - 1 Цикл
                ИтогСумма = ИтогСумма + Таб.ПолучитьЗначение(СчСтрок,счКолонок);
            КонецЦикла;
            Таб.УстановитьЗначение(счСтрок,Таб.КоличествоКолонок(),ИтогСумма);
         КонецЦикла;
    
  20. TopicStarter Overlay
    aleksandrvolkov
    Offline

    aleksandrvolkov

    Регистрация:
    23 ноя 2016
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    1
    спасибо Вам большое,Екатерина,я посчитал немного по другому..) У меня сейчас такая проблема, не могу разобраться никак... запрос мне вытаскивает все продажи,которые были,нулевые продажи он не захватывает,хотя они мне нужны,ибо табличка вырисовывается лесенкой.. группировка Месяц все не помогает,группировка Товар ... все тоже,начинает какую-то ересь выводить...
    Код:
    Перем ТекСтрокаВТаблице; // текущая строка в таблице значений  МФ
    //*******************************************
    Процедура Сформировать()
       
        ТЗПериод.ВыбратьСтроки();
        КолПериодов = ТЗПериод.КоличествоСтрок();
    
        Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("Сформировать");
        //Таб.ВывестиСекцию("Заголовок");
        Таб.Опции(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);
        Таб.Показать("Сформировать", "");
    КонецПроцедуры
    
    коды вдруг начинают повторяться, таблица вообще непонять как выводится... посмотрите,пожалуйста,уже головой бьюсь,понять ничего не могу((

Поделиться этой страницей