helpf.pro
Регистрация

v8: Нужна помощь! УТ 10.3 отчет динамика продаж с учетом прошлых периодов.

SlavaVNL
22.10.2015 10:02Прочитано: 4494

ХЕЛП!!! Подскажите как завязать в один узел данные. Конфигурация УТ 10.3. Идея такая: Есть продажи текущего периода. Аналитика период, подразделения и номенклатура - это фактические продажи. Есть месячные планы продаж, аналитика та же.

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

период1 | период2 | период3

подразделения

номенклатура план,факт по сумме и количеству,

отклонение факта от плана.

например есть месячный план продаж на 60 рублей, в анализируемом периоде продали на 30 рублей, причем полмесяца продаж не было, а потом по 2 штуки в день. значит в текущем плане должно быть полмесяца о руб, а затем 4 штуки в день.

я сделал отчет но он медленно формируется и выдает нехватку памяти.

Делал на СКД двумя внешними наборами данных. один набор фактические продажи текущие, другой - плановые по дням.

отчет есть по ссылке https://cloud.mail.ru/public/54tS/GbsE81FC2 

Yandex
Возможно, вас также заинтересует
Реклама на портале
all4cf
22.10.2015 12:28Ответ № 1

Запрос отчета в студию

SlavaVNL
23.10.2015 01:47Ответ № 2
Код 1C v 8.х
 

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

Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Функция ПостроитьТаблицуПланов()

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

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

Для каждого ППП из ППП_Результат Цикл
нов=ТаблицаДляРезультатов.Добавить();
нов.ПериодПлана=РаспределяемыйПериодПлана;
нов.Период=ППП.Период;
нов.Подразделение=РаспределяемоеПодразделение;
нов.Номенклатура=РаспределяемаяНоменклатура;
нов.РаспределяемаяСумма=РаспределяемаяСумма;   //текущий план сумма
нов.РаспределяемоеКоличество=РаспределяемоеКоличество;     //текущий план кол-во
нов.ППП_Количество=ППП.ППП_Количество;    //факт кол-во ППП
нов.ППП_Сумма=ППП.ППП_Сумма;              //факт сумма ППП

ВесПроцентСумма=?(ППП_РаспределяемаяСумма=0,0,ППП.ППП_Сумма*100/ППП_РаспределяемаяСумма);
ВесПроцентКоличество=?(ППП_РаспределяемоеКоличество=0,0,ППП.ППП_Количество*100/ППП_РаспределяемоеКоличество);

нов.СуммаПлан=Окр(РаспределяемаяСумма*ВесПроцентСумма/100,0);
нов.КоличествоПлан=Окр(РаспределяемоеКоличество*ВесПроцентКоличество/100,0);
КонецЦикла;
КонецЦикла;
   ТаблицаДляРезультатов.Свернуть("Период,Подразделение,Номенклатура","ППП_Количество,ППП_Сумма,СуммаПлан,КоличествоПлан");
  Возврат ТаблицаДляРезультатов;
КонецФункции

SlavaVNL
23.10.2015 01:53Ответ № 3
Код 1C v 8.х
 Функция СвестиВОдну(ТабПродажи,ТабПланы)
Запрос=новый запрос("ВЫБРАТЬ
            | Планы.Период, Планы.Подразделение, Планы.Номенклатура,
            | Планы.ППП_Количество, Планы.ППП_Сумма, Планы.СуммаПлан, Планы.КоличествоПлан
            |ПОМЕСТИТЬ Планы
            |ИЗПланы КАК Планы;
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            | Продажи.период, Продажи.подразделение, Продажи.Номенклатура
    | Продажи.КоличествоФакт, Продажи.СуммаФакт,
            |ПОМЕСТИТЬ Продажи
            |ИЗПродажи КАК Продажи;
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            | Продажи.период КАК Период,
            | Продажи.подразделение КАК Подразделение,
            | Продажи.Номенклатура,
            | Продажи.КоличествоФакт,
            | 0 КАК КоличествоПлан,
            | Продажи.СуммаФакт КАК СуммаФакт,
            | 0 КАК СуммаПлан,
            | 0 КАК ППП_Количество,
            | 0 КАК ППП_Сумма
            |ПОМЕСТИТЬ Почти
            |ИЗ Продажи КАК Продажи
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |
            |ВЫБРАТЬ
            | Планы.Период,
            | Планы.Подразделение,
            | Планы.Номенклатура,
            | 0,
            | Планы.КоличествоПлан,
            | 0,
            | Планы.СуммаПлан,
            | Планы.ППП_Количество,
            | Планы.ППП_Сумма
            |ИЗ Планы КАК Планы;
            |////////////////////////////////////////////////////////////////////////////////
            |УНИЧТОЖИТЬ Планы; УНИЧТОЖИТЬ Продажи;
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            | Почти.Период,
            | Почти.Подразделение,
            | Почти.Номенклатура,
            | СУММА(Почти.КоличествоФакт) КАК КоличествоФакт,
            | СУММА(Почти.КоличествоПлан) КАК КоличествоПлан,
            | СУММА(Почти.СуммаФакт) КАК СуммаФакт,
            | СУММА(Почти.СуммаПлан) КАК СуммаПлан,
            | СУММА(Почти.ППП_Количество) КАК ППП_Количество,
            | СУММА(Почти.ППП_Сумма) КАК ППП_Сумма
            |ИЗ Почти КАК Почти
            |
            |СГРУППИРОВАТЬ ПО
            | Почти.Подразделение,
            | Почти.Период,
            | Почти.Номенклатура");
запрос.УстановитьПараметр("Продажи",ТабПродажи);
запрос.УстановитьПараметр("Планы",ТабПланы);
возврат запрос.Выполнить().Выгрузить();
КонецФункции


SlavaVNL
23.10.2015 01:57Ответ № 4

дальше подсовываю итог в СКД: только тут тоже проблемка: на отбор, установленный в форме компоновщик внимания не обращает.  

почему-то СхемаКомпоновкиДанных.НастройкиПоУмолчанию.отбор.Элементы не учитывает отбор, установленный в форме

Код 1C v 8.х
 
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка=ложь;

ТабПродажи=ПостроитьТаблицуПродаж();
ТабПланы=ПостроитьТаблицуПланов();
табличка=СвестиВОдну(ТабПродажи,ТабПланы);

СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ВнешнийНаборДанных = Новый Структура("ТабПродажи",Табличка);

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);

ДокументРезультат.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры

SlavaVNL
23.10.2015 02:43Ответ № 5

с (4) разобрался: нужно вместо Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; 

написать:

Код 1C v 8.х
 Настройки=КомпоновщикНастроек.Настройки;     
SlavaVNL
23.10.2015 05:53Ответ № 6

Мне не нравится идея внешнего набора данных, но другого способа рассчитать веса - месячный план разбить по дням с учетом продаж прошлого периода, я не знаю. Может подскажет кто как это силами запроса СКД реализовать?

SlavaVNL
27.10.2015 01:39Ответ № 7
SlavaVNL
27.10.2015 01:40Ответ № 8

Извиняюсь за пустое сообщение - не ту кнопку нажал...

Появилась идея сделать всё без внешних таблиц. Суть такова: берем месячный план текущего периода, делим его на месячный факт прошлого периода - получаем общий коэффициент. Теперь берем продажи прошлого периода по дням и умножаем их на этот коэффициент. Получаем план текущего месяца по дням с учетом продаж прошлого периода. Только два вопроса: 1. будет ли это правильной формулой и как это запросом вытащить...Есть идеи?

Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.