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