Как в 1С распределить месячный бюджет по неделям пропорционально рабочим дням

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Постановка задачи и выбор стратегии

Рассмотрим ситуацию: в системе есть документ планирования, где бюджет зафиксирован одной суммой на месяц (или по колонкам «Месяц 1», «Месяц 2», «Месяц 3» внутри квартала). Нам необходимо вывести отчет, в котором этот бюджет будет «размазан» по неделям месяца. Главное условие — сумма недели должна зависеть от количества рабочих дней производственного календаря, попавших в эту неделю.

Для решения нам потребуется выполнить следующие шаги:

  1. Подготовить данные о рабочих днях в разрезе месяца и недель.
  2. Рассчитать коэффициент распределения для каждой недели.
  3. Соединить плановые данные с фактическими движениями денежных средств.
  4. Настроить структуру СКД для корректного отображения кросс-таблицы.

Шаг 1: Получение данных из производственного календаря

Чтобы распределение было точным, проанализируем данные регистра сведений ДанныеПроизводственногоКалендаря. Нам нужно получить общее количество рабочих дней в выбранном месяце и количество рабочих дней для каждой недели, входящей в этот период.

Разберем логику запроса. Сначала мы определим рабочие дни в периоде отчета. Если в типовой конфигурации (например, УТ 11 или ERP) используется производственный календарь, запрос будет выглядеть следующим образом:


ВЫБРАТЬ
    Календарь.Дата КАК Дата,
    НАЧАЛОПЕРИОДА(Календарь.Дата, НЕДЕЛЯ) КАК ПериодНеделя,
    1 КАК РабочийДень
ПОМЕСТИТЬ ВТ_РабочиеДни
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК Календарь
ГДЕ
    Календарь.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), 
                      ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
    И Календарь.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

Этот временный набор данных позволит нам в дальнейшем точно определить «вес» каждой недели в общем месячном бюджете.

Шаг 2: Расчет коэффициентов распределения в запросе

Проанализируем ситуацию, когда план хранится в регистре в разрезе месяцев. Нам нужно сопоставить таблицу рабочих дней с таблицей плановых показателей. Выясним причину, по которой обычное соединение может не сработать: неделя может начинаться в одном месяце, а заканчиваться в другом. Поэтому при расчете мы должны жестко ограничивать даты рамками планируемого месяца.

Рассмотрим пример формирования таблицы распределения:


ВЫБРАТЬ
    Дни.ПериодНеделя КАК Период,
    СУММА(Дни.РабочийДень) КАК РабочихДнейВНеделе,
    ОбщиеДни.ВсегоРабочихДнейВМесяце КАК ВсегоДней
ПОМЕСТИТЬ ВТ_Коэффициенты
ИЗ
    ВТ_РабочиеДни КАК Дни
    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ СУММА(РабочийДень) КАК ВсегоРабочихДнейВМесяце 
        ИЗ ВТ_РабочиеДни
    ) КАК ОбщиеДни ПО ИСТИНА
СГРУППИРОВАТЬ ПО
    Дни.ПериодНеделя, ОбщиеДни.ВсегоРабочихДнейВМесяце
;

Шаг 3: Объединение Плана и Факта

Теперь перейдем к подготовке данных для СКД. Важно помнить, что план и факт лучше собирать через ОБЪЕДИНИТЬ ВСЕ, чтобы избежать потери данных при отсутствии фактических движений. Посмотрим на структуру запроса, предложенную в обсуждении на форуме, и оптимизируем ее.

Для выбора нужного месяца из квартального планирования мы используем конструкцию ВЫБОР КОГДА. Это позволяет динамически определять, какую колонку ресурса (Месяц1, Месяц2 или Месяц3) брать в расчет в зависимости от параметра &Месяц.


ВЫБРАТЬ
    План.СтатьяДДС КАК СтатьяДДС,
    План.Подразделение КАК Подразделение,
    ВТ_Коэффициенты.Период КАК Период,
    (ВЫБОР 
        КОГДА МЕСЯЦ(&Месяц) В (1, 4, 7, 10) ТОГДА План.Месяц1 
        КОГДА МЕСЯЦ(&Месяц) В (2, 5, 8, 11) ТОГДА План.Месяц2 
        ИНАЧЕ План.Месяц3 
    КОНЕЦ) * (ВТ_Коэффициенты.РабочихДнейВНеделе / ВТ_Коэффициенты.ВсегоДней) КАК СуммаПлан,
    0 КАК СуммаФакт
ИЗ
    РегистрНакопления.ГАФ_ПланированиеБюджета КАК План
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Коэффициенты ПО ИСТИНА

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

ВЫБРАТЬ
    Факт.СтатьяДвиженияДенежныхСредств,
    Факт.Подразделение,
    НАЧАЛОПЕРИОДА(Факт.Период, НЕДЕЛЯ),
    0,
    Факт.СуммаОборот
ИЗ
    РегистрНакопления.ДвиженияДенежныхСредств.Обороты(&НачалоПериода, &КонецПериода, Неделя, ) КАК Факт

Шаг 4: Настройка СКД и вывод недель

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

  1. Группировки: В строках отчета укажите Подразделение и СтатьяДДС. В колонках добавьте группировку по полю Период.
  2. Дополнение периодов: Чтобы отчет показывал все недели месяца (даже если по ним нет ни плана, ни факта), в настройках группировки «Период» установите Тип дополнения — «Неделя». Укажите границы дополнения: &НачалоПериода и &КонецПериода.
  3. Вычисляемые поля: Если пользователю нужно видеть заголовки вида «Неделя 1», «Неделя 2», создадим вычисляемое поле ИмяНедели с выражением:

    "Неделя " + Строка(Целое((День(Период) + ДеньНедели(НачалоПериода(Период, "МЕСЯЦ")) - 2) / 7) + 1)

    Именно это поле следует использовать в качестве заголовка колонки.

Шаг 5: Работа с ресурсами

Для корректного план-фактного анализа в ресурсах СКД необходимо определить три поля:

Важный нюанс: при расчете ресурсов убедитесь, что поле Период входит в список рассчитываемых измерений, иначе агрегатные функции могут выдать неверный результат при иерархических группировках.

Резюме

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

← На главную