Как развернуть остатки регистра накопления по датам в отчете 1С?

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

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

Построение кросс-таблицы с помощью СКД

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

Шаг 1. Формирование запроса к виртуальной таблице

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

Критически важный момент — указание периодичности в параметрах виртуальной таблицы. Зададим периодичность Месяц. В результате в выборке появится предопределенное поле Период. Посмотрим на пример текста запроса для набора данных:


ВЫБРАТЬ
    Регистр.Подразделение КАК Подразделение,
    Регистр.Сотрудник КАК Сотрудник,
    Регистр.Период КАК Период,
    Регистр.ЧасыКонечныйОстаток КАК ЧасыКонечныйОстаток
ИЗ
    РегистрНакопления.УчетВремени.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК Регистр

Шаг 2. Настройка роли полей и ресурсов

Перейдем на вкладку Наборы данных. Для того чтобы СКД корректно вычисляла остатки на шкале времени, проанализируем параметры поля Период. В колонке Роль для поля Период обязательно укажем признак периода с порядковым номером (например, флаг Период и порядковый номер 1). Это позволит механизмам платформы корректно работать с временными срезами.

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

Шаг 3. Настройка структуры отчета (Таблица)

Перейдем на вкладку Настройки. Вместо стандартного списка добавим элемент Таблица:

  1. В Строки таблицы добавим группировки Подразделение и подчиненную ей группировку Сотрудник.
  2. В Колонки таблицы поместим группировку Период.
  3. В Выбранные поля для структуры таблицы добавим поле ЧасыКонечныйОстаток.

Шаг 4. Решение проблемы отсутствующих периодов

Если у конкретного сотрудника в каком-либо месяце не было движений, виртуальная таблица ОстаткиИОбороты не вернет запись по нему за этот период. В результате ячейка останется пустой либо колонка месяца исчезнет из отчета. Для непрерывного вывода временной шкалы используем механизм дополнения периодов в СКД:

  1. Откроем свойства группировки колонок Период.
  2. Установим флаг Дополнять.
  3. В поле Тип дополнения выберем Месяц.
  4. В качестве начальной и конечной даты укажем параметры &НачалоПериода и &КонецПериода.

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

Шаг 5. Оформление заголовков дат

По умолчанию поле Период возвращает дату с временем (начало месяца). Чтобы шапка таблицы выглядела компактно и профессионально, перейдем на вкладку Наборы данных и в строке поля Период в графе Оформление зададим форматную строку. Например: ДФ='ММММ гггг' для вывода названия месяца и года или ДФ='ММ.yyyy'.

Также на вкладке Другие настройки установим параметр Расположение общих итогов по горизонтали в значение Нет, чтобы исключить суммирование остатков за разные даты.

Альтернативный вариант: формирование кросс-таблицы в коде без СКД

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

  1. Формирование таблицы периодов: с помощью производственного календаря или запроса с декартовым произведением генерируем непрерывный список требуемых дат (концов месяцев).
  2. Создание пустой сетки: соединяем таблицу дат декартовым произведением со списком сотрудников. Таким образом, получаем полную матрицу координат «Сотрудник — Месяц».
  3. Получение данных: левым соединением подключаем к матрице данные регистра накопления.
  4. Вывод в макет: программно создаем вертикальные секции (колонки) для каждой даты и выводим строки по сотрудникам. При отсутствии движений в конкретном месяце переносим значение остатка из предыдущего периода.

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

← На главную