Как в СКД вывести остатки за период по месяцам с включением первого дня следующего месяца?

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

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

Разберем по шагам, почему возникает эта задача, с какими ограничениями виртуальных таблиц и механизмов группировки 1С приходится сталкиваться и как правильно настроить такой отчет.

Причины особенности платформы и выбор таблицы данных

При реализации подобного отчета разработчики часто совершают типичные ошибки:

  1. Использование таблицы Остатки: Виртуальная таблица Остатки предназначена для получения данных строго на одну конкретную дату (передаваемую в параметре). Выбрать динамику остатков за период одним запросом к ней невозможно.
  2. Пропуск дней без движений в ОстаткиИОбороты: Таблица ОстаткиИОбороты рассчитывает остатки на каждый день, но по умолчанию возвращает строки только за те дни, в которых были финансовые или количественные движения.
  3. Ограничения группировки по периодам: Первое число следующего месяца (например, 01.11) логически относится к ноябрьскому интервалу. Стандартная группировка по месяцам не может перенести эту строку в октябрьский блок без явного переопределения группировочного поля.

Проанализируем основные способы решения этой задачи.

Способ 1. Использование таблицы ОстаткиИОбороты и метода дополнения периодов

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

Для этого в запросе используется таблица ОстаткиИОбороты с периодичностью День и методом дополнения ДвиженияИГраницыПериода.

Рассмотрим пример запроса к регистру бухгалтерии:


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

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

Способ 2. Формирование запроса с двойной записью граничных дней

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

Разберем структуру этого запроса по шагам:

  1. Основная выборка: Выбирает ежедневные остатки из таблицы ОстаткиИОбороты за текущий месяц. Поле ГруппаМесяц рассчитывается как НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), а служебный флаг ПризнакГраничногоДня устанавливается в значение 0.
  2. Дополнительная выборка: Выбирает остатки строго на первое число каждого месяца. Поле ГруппаМесяц рассчитывается со сдвигом на месяц назад с помощью функции ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), МЕСЯЦ, -1). Флаг ПризнакГраничногоДня устанавливается в значение 1.

Рассмотрим текст такого запроса:


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

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

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

Настройка группировок и произвольного расчета итогов в СКД

После подготовки запроса перейдем к настройке схемы компоновки данных:

  1. В структуре отчета создадим верхнеуровневую группировку по полю ГруппаМесяц. Для формата даты зададим шаблон оформления, например ДФ='ММММ гггг'.
  2. Вложенную группировку настроим по полю Период.
  3. Для правильного расчета итогов по месяцу с учетом специальной формулы (например, суммирование всех дней плюс половина значения первого дня следующего месяца) перейдем на вкладку Ресурсы.
  4. Зададим выражение для поля СуммаОстаток с ограничением по уровню группировки ГруппаМесяц:

Сумма(ВЫБОР КОГДА ПризнакГраничногоДня = 1 ТОГДА СуммаОстаток / 2 ИНАЧЕ СуммаОстаток КОНЕЦ)

Такой подход позволяет корректно вывести детальные данные по дням, отобразить 1-е число следующего месяца в текущей группировке и пересчитать итоги уровня месяца по требуемой формуле.

← На главную