При разработке и кастомизации отчетов в программе «1С:Зарплата и управление персоналом 3.1» на базе Системы компоновки данных (СКД) программисты часто сталкиваются с нетипичным поведением системы. Две классические проблемы, возникающие при создании кадровых и зарплатных отчетов — это некорректный расчет итогов по количеству сотрудников в группировках (например, по подразделениям) и сложности с динамическим изменением заголовков колонок. Дополнительно процесс разработки усложняется поведением платформы, когда внесенные в схему изменения упорно не отображаются при тестировании отчета через стандартное меню «Файл — Открыть».
В этой статье мы подробно разберем, как решить эти проблемы, проанализируем методологические особенности подсчета сотрудников, рассмотрим различные способы кастомизации заголовков колонок и выясним, как правильно бороться с кэшированием внешних отчетов в среде Библиотеки Стандартных Подсистем (БСП).
Начинающие разработчики часто пытаются решить задачу подсчета сотрудников «в лоб»: создают вычисляемое поле со значением 1, выводят его в отчет и надеются, что СКД автоматически просуммирует эти единицы в группировках. Однако при таком подходе в строках группировок по подразделениям или в общих итогах вместо суммы может выводиться пустое значение или некорректная цифра. Чтобы это исправить, поле обязательно нужно перенести на вкладку «Ресурсы» схемы компоновки данных и задать правильное выражение расчета.
Рассмотрим, как правильно настроить ресурс для подсчета сотрудников. Перейдем на вкладку «Ресурсы» в СКД. Вместо простого суммирования единиц наиболее надежным решением является агрегирование по уникальным идентификаторам сотрудников. Пропишем в колонке «Выражение» следующую формулу:
Количество(Различные Сотрудник)
В этом случае СКД проанализирует все детальные записи, выберет уникальные элементы справочника Сотрудники для каждой конкретной группировки (например, для подразделения или должности) и выведет в итогах их точное количество. Однако при использовании этой формулы в реальном учете 1С:ЗУП 3.1 необходимо учитывать важные методологические нюансы:
Сотрудники (по основному месту работы и по совместительству). Если вы примените формулу Количество(Различные Сотрудник), этот человек будет посчитан дважды, так как он занимает две разные ставки. Если вашей целью является получение реального количества работающих «физических лиц» (так называемый подсчет «по головам»), то выражение ресурса должно быть другим: Количество(Различные ФизическоеЛицо).КадроваяИсторияСотрудниковИнтервальный.Иногда требуется дополнить стандартное наименование колонки отчета (например, представление вида расчета или начисления) произвольным текстом. Допустим, мы хотим, чтобы к названию начисления автоматически прибавлялась строка « В/К». Попытка написать выражение вида ПРЕДСТАВЛЕНИЕ(ВидРасчета) + " В/К" напрямую в поле СКД не принесет результата, так как функции представления возвращают системный тип, не предназначенный для прямого сложения со строками. Рассмотрим четыре работающих способа решения этой задачи.
Это один из самых изящных и гибких способов, не требующий написания программного кода или жесткой верстки макетов. Перейдем на вкладку «Наборы данных» схемы компоновки данных, найдем наше поле (например, ВидРасчета) и обратим внимание на колонку «Выражение представления». Напишем в ней формулу преобразования значения в строку с добавлением суффикса:
Строка(ВидРасчета) + " В/К"
При использовании этого механизма СКД на лету преобразует элемент к строковому виду, добавит к нему указанный текст и будет использовать полученное значение в качестве заголовка колонки везде, где данное поле выводится в отчет.
Если заголовок нужно изменить только при определенных условиях или для конкретного варианта отчета, можно прибегнуть к условному оформлению. Посмотрим, как это сделать:
Вид расчета В/К.ВидРасчета.Также в параметре «Текст» условного оформления можно использовать шаблоны с квадратными скобками для динамической подстановки данных: [ВидРасчета] В/К. В этом случае система автоматически подставит значение поля внутрь текстового шаблона.
Если текст заголовка должен зависеть от внешних факторов (например, от значений выбранных пользователем параметров или настроек на форме), оптимальным решением будет программная модификация схемы компоновки непосредственно перед выводом отчета. Для этого откроем модуль объекта внешнего отчета и переопределим стандартное событие ПриКомпоновкеРезультата.
Рассмотрим пример кода, реализующий эту логику:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем текущие настройки компоновщика
ТекущиеНастройки = КомпоновщикНастроек.Настройки;
// Ищем поле "ВидРасчета" в выбранных полях компоновщика
НайденноеПоле = ТекущиеНастройки.ВыбранныеПоля.Элементы.Найти("ВидРасчета");
Если НайденноеПоле <> Неопределено Тогда
// Устанавливаем пользовательский заголовок для колонки
НайденноеПоле.Заголовок = "Вид расчета (В/К)";
НайденноеПоле.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Этот способ гарантирует, что заголовок изменится динамически в момент формирования отчета пользователем, независимо от того, какие интерактивные настройки структуры были сделаны ранее.
Для жестко структурированных отчетов, где внешний вид шапки не должен меняться, можно использовать вкладку «Макеты» в конструкторе СКД. Разработчик может вручную нарисовать область заголовка, объединить ячейки, задать им произвольный текст и связать созданную область с конкретным полем или группировкой схемы. Данный метод эффективен для сложных печатных форм, однако он снижает гибкость отчета: при добавлении пользователем новых группировок макет может «поехать» или отобразиться некорректно.
Очень частая и раздражающая ситуация при разработке отчетов для конфигураций на платформе 1С:Предприятие 8.3 (включая ЗУП 3.1) заключается в следующем: программист вносит изменения в схему компоновки (например, добавляет вычисляемое поле или настраивает ресурсы), сохраняет файл .erf на диск, открывает его в режиме Предприятия через «Файл — Открыть», но отчет упорно выводится в старом виде.
Выясним причину этого явления. Дело в том, что современные конфигурации используют механизмы Библиотеки Стандартных Подсистем (БСП). При первом открытии внешнего отчета система регистрирует его структуру во внутренних справочниках базы данных (в частности, в справочнике вариантов отчетов) и сохраняет настройки в кэше пользователя. При последующих открытиях файла с диска платформа сверяет внутренний идентификатор объекта метаданных и, обнаружив совпадение, подтягивает старые настройки из кэша базы данных, полностью игнорируя новые изменения в самом файле на диске.
Проанализируем основные способы борьбы с кэшированием внешних отчетов при отладке:
Дополнительные отчеты и обработки, то простое открытие файла через «Файл — Открыть» работать не будет. Вам необходимо зайти в карточку этого дополнительного отчета, нажать кнопку «Загрузить из файла», выбрать вашу обновленную версию и нажать «Записать и закрыть». Только после этого изменения вступят в силу для всех пользователей.АнализЗарплаты в АнализЗарплаты_Отладка1). Для БСП это будет абсолютно новый уникальный отчет, и его схема загрузится с нуля.Применение этих простых правил убережет вас от ложных выводов в процессе отладки, когда верное с технической точки зрения решение кажется неработающим из-за банального кэширования платформы.