При настройке и доработке типового отчета Расчетная ведомость в 1С:ЗУП разработчики и пользователи часто сталкиваются со специфическим поведением кросс-таблицы системы компоновки данных (СКД). Поле ОтработаноДней выводится в виде отдельной самостоятельной колонки, в то время как добавленное поле НормаДней начинает дублироваться внутри каждого вида начисления или удержания. Кроме того, по полям учета времени нередко автоматически рассчитываются и выводятся ненужные вертикальные итоги.
Разберем по шагам, почему возникает такое поведение компоновки данных и как правильно настроить отчет как в режиме конфигуратора, так и программно.
Проанализируем структуру типового отчета Расчетная ведомость. Отчет строится на основе кросс-таблицы, где:
Если новое поле (например, НормаДней) добавлено в общую ветку выбранных полей всей таблицы или в группировку колонок, СКД считает его ресурсом динамической части и рассчитывает отдельно для каждого значения группировки ВидРасчета. Поле ОтработаноДней выводится корректно только потому, что в типовой схеме оно вынесено в структуру строк сотрудника либо расположено в фиксированной параллельной ветке колонок.
Появление лишней колонки Итого для показателей времени связано с тем, что для них на вкладке Ресурсы задан общий расчет суммы по всей таблице без ограничения уровней группировок.
Рассмотрим правильную настройку схемы компоновки данных без необходимости вмешательства в программный код модуля отчета:
Откроем схему компоновки отчета в конфигураторе и перейдем на вкладку Настройки. В структуре отчета найдем группировку строк уровня Сотрудник. Перейдем на вкладку Выбранные поля именно этой группировки, снимем флаг Авто и добавим поля ОтработаноДней и НормаДней. В таком случае показатели времени будут выводиться в фиксированной левой части таблицы вместе с данными сотрудника, не попадая в колонки видов начислений.
Если показатели времени должны располагаться между данными сотрудника и начислениями, в структуре таблицы создадим отдельную группировку колонок без указания поля группировки (пустая группировка). В выбранные поля этой группировки поместим показатели времени, а динамическую группировку по видам расчетов разместим на том же уровне рядом.
Перейдем на вкладку Ресурсы схемы компоновки. Для полей НормаДней и ОтработаноДней в колонке Рассчитывать по... снимем признак расчета для общих итогов отчета, оставив суммирование только по группировкам Сотрудник и Подразделение.
Если отчет дорабатывается программно в модуле объекта (например, в процедуре ДоработатьКомпоновщикПередВыводом()), важно контролировать, в какую именно коллекцию выбранных полей добавляется новый элемент.
Посмотрим на пример добавления поля в конкретную группировку строк компоновщика:
// Получаем структуру настроек отчета
Таблица = КомпоновщикНастроек.Настройки.Структура[0];
// Обращаемся к группировке строк нужного уровня (например, уровень сотрудника)
ГруппировкаСотрудник = Таблица.Строки[0].Строки[0];
// Добавляем поле НормаДней в выбранные поля конкретной строки
ВыбранноеПоле = ГруппировкаСотрудник.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле = ГруппировкаСотрудник.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("НормаДней");
ВыбранноеПоле.Использование = Истина;
Если необходимо полностью отключить горизонтальные итоги по всей таблице отчета программным способом, используем параметры вывода компоновщика:
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(
"HorizontalOverallPlacement",
ИспользованиеРасположенияЭлементовКомпоновкиДанных.Нет
);
Если в расчетной ведомости необходимо сохранить горизонтальные итоги по суммам начислений и удержаний, но при этом убрать итоговые значения по дням и часам, воспользуемся условным оформлением:
Ложь).НормаДней и ОтработаноДней.Такой подход позволяет сохранить общие суммы по начислениям в колонке Итого, исключив при этом бессмысленное суммирование календарных норм и отработанного времени.