Нередко при разработке аналитических отчетов в 1С возникает задача представить динамику остатков в виде кросс-таблицы (шахматки). Классический пример: необходимо вывести список сотрудников в строках, а в колонках отобразить контрольные даты (например, конец каждого месяца) и остаток ресурса (например, отработанные часы или дни отпуска). Рассмотрим подробно, как решить эту задачу средствами Системы компоновки данных (СКД), а также проанализируем альтернативный программный подход.
Разберем по шагам наиболее быстрый и стандартный способ решения задачи с использованием виртуальных таблиц и механизмов компоновки данных.
Шаг 1. Формирование запроса к виртуальной таблице
Для получения картины изменения остатков по шкале времени нельзя обращаться к таблице Остатки, так как она возвращает срез данных только на одну конкретную точку времени. Не подходит и таблица Обороты, поскольку нам нужны именно накопленные остатки. Выберем виртуальную таблицу ОстаткиИОбороты соответствующего регистра накопления.
Критически важный момент — указание периодичности в параметрах виртуальной таблицы. Зададим периодичность Месяц. В результате в выборке появится предопределенное поле Период. Посмотрим на пример текста запроса для набора данных:
ВЫБРАТЬ
Регистр.Подразделение КАК Подразделение,
Регистр.Сотрудник КАК Сотрудник,
Регистр.Период КАК Период,
Регистр.ЧасыКонечныйОстаток КАК ЧасыКонечныйОстаток
ИЗ
РегистрНакопления.УчетВремени.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК Регистр
Шаг 2. Настройка роли полей и ресурсов
Перейдем на вкладку Наборы данных. Для того чтобы СКД корректно вычисляла остатки на шкале времени, проанализируем параметры поля Период. В колонке Роль для поля Период обязательно укажем признак периода с порядковым номером (например, флаг Период и порядковый номер 1). Это позволит механизмам платформы корректно работать с временными срезами.
На вкладке Ресурсы добавим наш ресурс ЧасыКонечныйОстаток. Выясним причину частой ошибки начинающих разработчиков: при стандартном выражении Сумма(ЧасыКонечныйОстаток) СКД сложит остатки не только по сотрудникам внутри подразделения, но и по горизонтали — вдоль оси времени. Сложение остатков разных месяцев между собой приводит к бессмысленным значениям. Чтобы исключить некорректный расчет, на вкладке Ресурсы ограничим расчет поля только строковыми группировками (сотрудник, подразделение) либо в настройках отчета отключим горизонтальные итоги.
Шаг 3. Настройка структуры отчета (Таблица)
Перейдем на вкладку Настройки. Вместо стандартного списка добавим элемент Таблица:
Подразделение и подчиненную ей группировку Сотрудник.Период.ЧасыКонечныйОстаток.Шаг 4. Решение проблемы отсутствующих периодов
Если у конкретного сотрудника в каком-либо месяце не было движений, виртуальная таблица ОстаткиИОбороты не вернет запись по нему за этот период. В результате ячейка останется пустой либо колонка месяца исчезнет из отчета. Для непрерывного вывода временной шкалы используем механизм дополнения периодов в СКД:
Период.Месяц.&НачалоПериода и &КонецПериода.Теперь СКД принудительно развернет сетку колонок по всем месяцам выбранного диапазона, а благодаря роли периода автоматически рассчитает переходящий конечный остаток.
Шаг 5. Оформление заголовков дат
По умолчанию поле Период возвращает дату с временем (начало месяца). Чтобы шапка таблицы выглядела компактно и профессионально, перейдем на вкладку Наборы данных и в строке поля Период в графе Оформление зададим форматную строку. Например: ДФ='ММММ гггг' для вывода названия месяца и года или ДФ='ММ.yyyy'.
Также на вкладке Другие настройки установим параметр Расположение общих итогов по горизонтали в значение Нет, чтобы исключить суммирование остатков за разные даты.
Рассмотрим ситуацию, когда отчет необходимо построить программно в макет табличного документа через обход выборки запроса. В этом случае задача решается следующим алгоритмом:
Использование СКД с виртуальной таблицей ОстаткиИОбороты и механизмом дополнения периодов является предпочтительным, так как исключает необходимость ручного написания сложных запросов и полностью управляется штатными механизмами платформы 1С.