Сравнительный WoW-анализ (Week-over-Week) входящего потока товарных позиций в заказах клиентов по сквозным неделям

02.11.26

Учетные задачи - Логистика, склад и ТМЦ

Внешний отчет реализует методику сопоставительного анализа временных рядов "Неделя к неделе" для оценки интенсивности спроса. Решение анализирует поток номенклатурных позиций в документах Заказ клиента, обеспечивая жесткое выравнивание сквозной нумерации недель текущего и предыдущих месяцев.На панель выводятся три компактные диаграммы со строгим вертикальным выравниванием внутренних осей. Отчет содержит алгоритм программной пост-обработки макета СКД: ручное сжатие и позиционирование графиков нарастающим итогом поверх ячеек табличного документа, динамический расчет глобального максимума шкал.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Сравнительный WoW-анализ (Week-over-Week) входящего потока товарных позиций в заказах клиентов по сквозным неделям
.erf 9,75Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Этот график — не просто очередная задача, а часть огромного, сложного отчета, который мне пришлось разрабатывать в условиях жесточайшего дедлайна и стресса. Время поджимало, требования бизнеса менялись на ходу. Мне требовался особый сдвиг дат в начале месяца, чтобы графики начинались не строго с 1-го числа, а захватывали «хвост» предыдущей недели для контекста.

В стрессовых условиях был написан календарь через временные таблицы с хитрым расчетом сдвига дней недели.

Вот этот ключевой кусок запроса для формирования сдвига дат:

ВЫБРАТЬ
    ВЫБОР
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 1
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -4)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 2
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -5)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 3
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -6)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 4
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, 0)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 5
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -1)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 6
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -2)
        КОГДА ДЕНЬНЕДЕЛИ(&НачалоПрМесяца) = 7
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПрМесяца, ДЕНЬ, -3)
    КОНЕЦ КАК ДН,
    НАЧАЛОПЕРИОДА(&НачалоПрМесяца, МЕСЯЦ) КАК МесяцЗД
ПОМЕСТИТЬ ДополнДаты

ОБЪЕДИНИТЬ ВСЕ

 

Этот код выполнил свою задачу,  отчет был сдан, но такое решение не давало мне покоя. Мне хотелось сделать алгоритм более изящным и быстродействующим. И алгоритм был переписан на новый, более красивый и стабильный вариант уже после того, как  я покинула компанию. Возвращаясь к своим старым наработкам свежим взглядом, всегда находишь, что улучшить.

Новый вариант написан уже под УТ 11, но главное тут — переписан алгоритм расчета сдвига даты, и его можно объединять с любой необходимой вам выборкой для вывода. Чтобы СКД не ругалась на разные типы данных ссылок и технологических строк в сериях, я привела их к единому строковому знаменателю в финальном пакете.

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

ВЫБРАТЬ
    ПредИтог.КоличествоЗаявок КАК КоличествоЗаявок,
    ВЫБОР
        КОГДА ПредИтог.ТипКонтрагента = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)
            ТОГДА "Юридическое лицо"
        КОГДА ПредИтог.ТипКонтрагента = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ФизЛицо)
            ТОГДА "Физическое лицо"
        ИНАЧЕ "Не указан"
    КОНЕЦ КАК ТипКонтрагента,
    ПредИтог.ДеньДиаграмма КАК ДеньДиаграмма,
    ПредИтог.МесяцДиаграмма КАК МесяцДиаграмма
ИЗ
    ПредИтог КАК ПредИтог

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЕСТЬNULL(ТаблицаСреднееПоМесяцам.Среднее, 0),
    "Среднее",
    ДополнДаты.ДН,
    ДополнДаты.МесяцЗД
ИЗ
    ДополнДаты КАК ДополнДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаСреднееПоМесяцам КАК ТаблицаСреднееПоМесяцам
        ПО ДополнДаты.МесяцЗД = ТаблицаСреднееПоМесяцам.МесяцДиаграмма

Программная пост-обработка макета

Стандартный вывод диаграмм в СКД имеет жесткие ограничения — графики расползаются на весь экран, а между ними остаются огромные пустые строки скрытой таблицы.

В финальном решении вывод сделан через пост-обработку готового документа. Мы позволяем СКД сформировать отчет одной командой, а затем одним циклом перебираем коллекцию Рисунки, жестко задавая координаты Верх и Лево. Графики ложатся впритык друг под друга с идеальным выравниванием осей Х.

Также решена проблема цифр над линией тренда «Среднее»: с помощью свойства Серия.ФорматЗначенийВПодписях = "ЧФ=' '" я подменила числовые подписи невидимыми пробелами, оставив график чистым.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартный вывод, чтобы управлять им вручную
    СтандартнаяОбработка = Ложь;
    
    // Стандартный сквозной вывод всего отчета в ДокументРезультат
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    // Сформируем отчет полностью штатными средствами
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);       
    
    ГлобальныйМаксимум = 0;
    
    Для Каждого ТекРисунок Из ДокументРезультат.Рисунки Цикл
        Если ТекРисунок.ТипРисунка = ТипРисункаТабличногоДокумента.Диаграмма Тогда
            // Перебираем все фактические значения на графике, чтобы найти самую высокую точку
            Для Каждого Серия Из ТекРисунок.Объект.Серии Цикл
                // Пропускаем техническую серию "Среднее", ищем только реальные продажи
                Если Серия.Текст = "Среднее" Или Найти(Серия.Текст, "Среднее:") > 0 Тогда 
                    Продолжить; 
                КонецЕсли;
                
                Для Каждого Точка Из ТекРисунок.Объект.Точки Цикл
                    ЗначениеД = ТекРисунок.Объект.ПолучитьЗначение(Точка, Серия);
                    Если ЗначениеД <> Неопределено И ЗначениеД.Значение<>Null  И ЗначениеД.Значение > ГлобальныйМаксимум Тогда
                        ГлобальныйМаксимум = ЗначениеД.Значение;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Если ГлобальныйМаксимум = 0 Тогда 
        ГлобальныйМаксимум = 10; 
    Иначе
        // Делаем округление вверх (запас 10%), чтобы столбцы не упирались в потолок
        ГлобальныйМаксимум = Цел(ГлобальныйМаксимум * 1.1); 
    КонецЕсли;
    
    НомерДиаграммы = 0;
    ТекущийВерх = 0;
    КоэффициентСжатия = 3; 
    
    // Перебираем готовые рисунки
    Для Каждого ТекРисунок Из ДокументРезультат.Рисунки Цикл
        
        Если ТекРисунок.ТипРисунка = ТипРисункаТабличногоДокумента.Диаграмма Тогда         
            Попытка
            ТекРисунок.Объект.ПоложениеПодписей=ПоложениеПодписейКДиаграмме.Край;                  
            Исключение КонецПопытки;       
            НомерДиаграммы = НомерДиаграммы + 1;
            
            Для каждого серия из  ТекРисунок.Объект.Серии Цикл              
                Если Серия.Текст = "Среднее" Тогда 
                    Серия.Индикатор = Истина;   
                    Серия.ФорматЗначенийВПодписях = "ЧФ=' '";     
                    
                    ЧислоЗначениеСр = 0;
                    Если ТекРисунок.Объект.Точки.Количество() > 0 Тогда
                        ТочкаНоль = ТекРисунок.Объект.Точки[0]; // Берем объект первой точки
                        ЗначениеСр = ТекРисунок.Объект.ПолучитьЗначение(ТочкаНоль, Серия);
                        Если ЗначениеСр <> Неопределено Тогда
                            ЧислоЗначениеСр = ЗначениеСр.Значение;
                        КонецЕсли;
                    КонецЕсли;                  
                    Для Каждого Точка Из ТекРисунок.Объект.Точки Цикл                    
                        ТекРисунок.Объект.УстановитьЗначение(Точка, Серия, ЧислоЗначениеСр);                                     
                    КонецЦикла;                     
                    Серия.Текст = "Среднее: " + Строка(ЧислоЗначениеСр);                         
                КонецЕсли;    
            КонецЦикла;            
            
            Попытка
                ТекРисунок.Объект.ОсьЗначений.СпособОпределенияМаксимальногоЗначения = СпособОпределенияОграничивающегоЗначенияДиаграммы.ИспользоватьЗначение;
                ТекРисунок.Объект.ОсьЗначений.МаксимальноеЗначение = ГлобальныйМаксимум;
            Исключение
            КонецПопытки;
            
            Если НомерДиаграммы = 1 Тогда
                ТекущийВерх = ТекРисунок.Верх;
            КонецЕсли;
            
            // Принудительно устанавливаем Верх для ВСЕХ диаграмм
            ТекРисунок.Верх  = ТекущийВерх;
            ТекРисунок.Ширина = 300; 
            ТекРисунок.Высота = ТекРисунок.Высота / КоэффициентСжатия;
                    
            ТекущийВерх = ТекРисунок.Верх + ТекРисунок.Высота + 3; 
            ТекРисунок.Лево = 2;
                        
            // Если вывели пачку из 3-х штук, сбрасываемся для следующей
            Если НомерДиаграммы % 3 = 0 Тогда
                ТекущийВерх = 0;
            КонецЕсли;
            
        КонецЕсли;     
    КонецЦикла;     

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


Полную структуру оптимизированного запроса со всеми промежуточными временными таблицами (ПредИтог, ЗапросыМесяцы и др.) вы можете изучить непосредственно в схеме СКД, скачав файл отчета ниже.

Заключение

Это моя самая первая публикация на Инфостарте, поэтому прошу строго не судить. Отчет прошел долгий путь оптимизации, и буду очень рада, если этот готовые куски кода помогут кому-нибудь в решении аналогичных задач на проектах.

Если будут предложения по его улучшению — обязательно пишите в комментарии, буду рада обратной связи!

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.12.232

Вступайте в нашу телеграмм-группу Инфостарт

СКД Диаграмма СКД Пост-обработка Динамика спроса

См. также

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.

50200 руб.

24.04.2015    211492    186    254    

303

Обмен с ГосИС Логистика, склад и ТМЦ Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Внешняя обработка для инвентаризации кодов маркировки в системе "Честный знак". Позволяет быстро определить и списать коды маркировки проданного, испорченного, утраченного (полный перечень причин списания указан ниже)  товара, которые всё ещё числятся за организацией. Привести в соответствие остатки маркированного товара программы 1С и системы "Честного знака".

6649 руб.

09.01.2024    22126    228    30    

204

Логистика, склад и ТМЦ Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Модуль ответственное хранения в 1С 8.3 для складов и фулфилмент-операторов: учет чужого товара, приемка на хранение, передача, возвраты, акты, адресный склад и работа с товарами поклажедателей.

89900 руб.

09.06.2020    58287    47    60    

80

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

12444 руб.

29.10.2014    237880    777    544    

509
Для отправки сообщения требуется регистрация/авторизация