При формировании расчетных листков в программе 1С:Зарплата и Управление Персоналом 3.1 часто возникает производственная необходимость отображать не конечное подразделение, в котором числится сотрудник, а более крупную структурную единицу (цех, департамент или управление). Это особенно актуально для организаций с разветвленной иерархией, где детальная структура подразделений избыточна для печатной формы. Рассмотрим, как решить эту задачу, не снимая конфигурацию с поддержки и не прибегая к сложному программированию. В качестве альтернативы штатной настройке можно использовать готовый вариант доработанного расчетного листка.
Стандартный отчет "Расчетный листок" базируется на технологии СКД. Программа позволяет пользователю создавать собственные поля и изменять визуальное представление данных через макеты. Основная сложность заключается в том, что в макете печатной формы по умолчанию используется параметр ПодразделениеНаПечать, который жестко связан с текущим подразделением сотрудника. Наша задача — создать альтернативное поле, содержащее "родителя" этого подразделения, и внедрить его в форму.
Проанализируем последовательность действий для достижения результата:
Для начала откроем настройки отчета "Расчетный листок". Перейдем в расширенный режим настройки и выберем вкладку Пользовательские поля. Нам необходимо создать поле типа "Выражение".
Выясним причину, по которой простого обращения к родителю может быть недостаточно. Если у подразделения нет вышестоящего элемента (оно само является верхним уровнем), обращение к родителю вернет пустое значение. Поэтому нам потребуется использовать логическую конструкцию. Разберем пример выражения:
Выбор
Когда [Подразделение на конец периода.Вышестоящее подразделение] Есть NULL
Тогда [Подразделение на конец периода]
Иначе [Подразделение на конец периода.Вышестоящее подразделение]
Конец
В данном случае мы используем объект Подразделение на конец периода, так как именно он чаще всего отвечает за актуальные данные в расчетном листке. Если в вашей структуре используется более двух уровней вложенности и вам всегда нужен "самый верхний" уровень (головное подразделение), выражение может быть сложнее, с использованием цепочки обращений Родитель.Родитель, однако для большинства задач достаточно одного уровня вверх.
Чтобы созданное поле "ожило" и данные по нему были подготовлены системой компоновки, его необходимо добавить в группировку. Перейдем на вкладку Структура. Найдем группировку, отвечающую за вывод данных сотрудника (обычно это группировка по организации и сотруднику). Добавим наше новое пользовательское поле в состав выбранных полей этой группировки.
Важный технический нюанс: системе требуется знать внутренний идентификатор этого поля для обращения к нему из макета. В 1С пользовательские поля именуются по шаблону ПользовательскиеПоляПолеN, где N — порядковый номер созданного поля. Если это ваше первое пользовательское поле, скорее всего, оно будет называться ПользовательскиеПоляПоле1.
Теперь нам нужно изменить визуальную часть. Для этого не нужно заходить в конфигуратор. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм. Найдем в списке макет с именем "Расчетный листок" (или аналогичный, который вы используете).
Выполним следующие действия:
ПодразделениеНаПечать.ПользовательскиеПоляПоле1.После сохранения изменений программа при формировании расчетного листка будет брать данные не из стандартного алгоритма формирования подразделения, а из вашего выражения СКД.
Рассмотрим ситуацию, когда метод с пользовательскими полями кажется слишком хрупким (например, из-за непредсказуемой нумерации полей Поле13, Поле14). Более надежным и "чистым" с точки зрения архитектуры решением является использование расширений. Это также не требует снятия основной конфигурации с поддержки.
Проанализируем, как это работает программно. В отчете "Расчетный листок" данные подготавливаются в модуле менеджера или в процедурах компоновки. Мы можем создать расширение и перехватить процедуру ПриКомпоновкеРезультата или подменить запрос в модуле менеджера через &Вместо или &После.
Пример кода, который можно внедрить через расширение для программной подмены подразделения:
&После("ПодготовитьДанныеДляРасчетныхЛистков")
Процедура Расш_ПодготовитьДанныеДляРасчетныхЛистков(ПараметрыОтчета, Данные)
Для Каждого СтрокаДанных Из Данные.РезультатТаблица Цикл
Если ЗначениеЗаполнено(СтрокаДанных.Подразделение.Родитель) Тогда
СтрокаДанных.ПодразделениеНаПечать = СтрокаДанных.Подразделение.Родитель;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод хорош тем, что он не зависит от настроек макета пользователем и будет работать автоматически для всех расчетных листков в базе. Кроме того, в коде расширения можно прописать гораздо более сложную логику: например, искать родителя до тех пор, пока не встретится подразделение определенного типа или уровня.
При использовании любого из описанных выше методов стоит учитывать несколько факторов:
1. История перемещений: Расчетный листок формируется за период (месяц). Если сотрудник в середине месяца перевелся из одного отдела в другой, и оба отдела имеют разных "родителей", стандартный отчет может сгруппировать данные некорректно. Обязательно проверяйте поле Подразделение на конец периода — оно гарантирует, что будет выведен актуальный руководитель подразделения на дату формирования документа.
2. Обновление программы: При обновлении 1С:ЗУП разработчики могут изменить структуру макета. Если вы редактировали макет вручную через "Печатные формы и макеты", ваши изменения сохранятся, но новые поля, добавленные фирмой "1С", в вашем макете не появятся. Периодически проверяйте актуальность вашего кастомного макета после крупных релизов.
3. Проблема пустых значений: Как мы выяснили ранее, всегда используйте функцию ЕСТЬNULL или конструкцию ВЫБОР. В иерархических справочниках 1С отсутствие родителя возвращает не пустую ссылку, а значение NULL в контексте запросов СКД. Игнорирование этого факта приведет к тому, что у сотрудников головных офисов поле "Подразделение" в листке окажется пустым.
Таким образом, мы выяснили, что наиболее оперативным способом настройки является работа с пользовательскими полями и макетами, а наиболее стабильным — использование расширений конфигурации. Выбор метода зависит от ваших навыков владения инструментами 1С и требований к долгосрочной поддержке системы.