Как в 1С:ЗУП 3.1 вывести вышестоящее подразделение в расчетном листке без доработки конфигурации?

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

При формировании расчетных листков в программе 1С:Зарплата и Управление Персоналом 3.1 часто возникает производственная необходимость отображать не конечное подразделение, в котором числится сотрудник, а более крупную структурную единицу (цех, департамент или управление). Это особенно актуально для организаций с разветвленной иерархией, где детальная структура подразделений избыточна для печатной формы. Рассмотрим, как решить эту задачу, не снимая конфигурацию с поддержки и не прибегая к сложному программированию. В качестве альтернативы штатной настройке можно использовать готовый вариант доработанного расчетного листка.

Механика решения задачи через систему компоновки данных (СКД)

Стандартный отчет "Расчетный листок" базируется на технологии СКД. Программа позволяет пользователю создавать собственные поля и изменять визуальное представление данных через макеты. Основная сложность заключается в том, что в макете печатной формы по умолчанию используется параметр ПодразделениеНаПечать, который жестко связан с текущим подразделением сотрудника. Наша задача — создать альтернативное поле, содержащее "родителя" этого подразделения, и внедрить его в форму.

Проанализируем последовательность действий для достижения результата:

  1. Создание специального пользовательского поля с логическим выражением.
  2. Включение этого поля в структуру группировок отчета для того, чтобы оно стало доступным в контексте формирования данных.
  3. Редактирование системного макета печатной формы для замены стандартного параметра на наше новое поле.

Шаг 1: Создание пользовательского поля

Для начала откроем настройки отчета "Расчетный листок". Перейдем в расширенный режим настройки и выберем вкладку Пользовательские поля. Нам необходимо создать поле типа "Выражение".

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


Выбор 
    Когда [Подразделение на конец периода.Вышестоящее подразделение] Есть NULL 
        Тогда [Подразделение на конец периода] 
    Иначе [Подразделение на конец периода.Вышестоящее подразделение] 
Конец

В данном случае мы используем объект Подразделение на конец периода, так как именно он чаще всего отвечает за актуальные данные в расчетном листке. Если в вашей структуре используется более двух уровней вложенности и вам всегда нужен "самый верхний" уровень (головное подразделение), выражение может быть сложнее, с использованием цепочки обращений Родитель.Родитель, однако для большинства задач достаточно одного уровня вверх.

Шаг 2: Настройка структуры отчета

Чтобы созданное поле "ожило" и данные по нему были подготовлены системой компоновки, его необходимо добавить в группировку. Перейдем на вкладку Структура. Найдем группировку, отвечающую за вывод данных сотрудника (обычно это группировка по организации и сотруднику). Добавим наше новое пользовательское поле в состав выбранных полей этой группировки.

Важный технический нюанс: системе требуется знать внутренний идентификатор этого поля для обращения к нему из макета. В 1С пользовательские поля именуются по шаблону ПользовательскиеПоляПолеN, где N — порядковый номер созданного поля. Если это ваше первое пользовательское поле, скорее всего, оно будет называться ПользовательскиеПоляПоле1.

Шаг 3: Изменение макета печатной формы

Теперь нам нужно изменить визуальную часть. Для этого не нужно заходить в конфигуратор. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм. Найдем в списке макет с именем "Расчетный листок" (или аналогичный, который вы используете).

Выполним следующие действия:

  1. Нажмем кнопку Изменить. Программа создаст копию макета, которую можно редактировать.
  2. В открывшемся табличном документе найдем область "Шапка" или ту ячейку, где выводится подразделение. Обычно там стоит параметр ПодразделениеНаПечать.
  3. Заменим текст параметра в этой ячейке на имя нашего пользовательского поля, например: ПользовательскиеПоляПоле1.
  4. Внимание: в свойствах ячейки убедитесь, что тип заполнения установлен как "Параметр".

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

Альтернативный метод: Использование расширений конфигурации

Рассмотрим ситуацию, когда метод с пользовательскими полями кажется слишком хрупким (например, из-за непредсказуемой нумерации полей Поле13, Поле14). Более надежным и "чистым" с точки зрения архитектуры решением является использование расширений. Это также не требует снятия основной конфигурации с поддержки.

Проанализируем, как это работает программно. В отчете "Расчетный листок" данные подготавливаются в модуле менеджера или в процедурах компоновки. Мы можем создать расширение и перехватить процедуру ПриКомпоновкеРезультата или подменить запрос в модуле менеджера через &Вместо или &После.

Пример кода, который можно внедрить через расширение для программной подмены подразделения:


&После("ПодготовитьДанныеДляРасчетныхЛистков")
Процедура Расш_ПодготовитьДанныеДляРасчетныхЛистков(ПараметрыОтчета, Данные)
    Для Каждого СтрокаДанных Из Данные.РезультатТаблица Цикл
        Если ЗначениеЗаполнено(СтрокаДанных.Подразделение.Родитель) Тогда
            СтрокаДанных.ПодразделениеНаПечать = СтрокаДанных.Подразделение.Родитель;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод хорош тем, что он не зависит от настроек макета пользователем и будет работать автоматически для всех расчетных листков в базе. Кроме того, в коде расширения можно прописать гораздо более сложную логику: например, искать родителя до тех пор, пока не встретится подразделение определенного типа или уровня.

Анализ возможных проблем и рекомендации

При использовании любого из описанных выше методов стоит учитывать несколько факторов:

1. История перемещений: Расчетный листок формируется за период (месяц). Если сотрудник в середине месяца перевелся из одного отдела в другой, и оба отдела имеют разных "родителей", стандартный отчет может сгруппировать данные некорректно. Обязательно проверяйте поле Подразделение на конец периода — оно гарантирует, что будет выведен актуальный руководитель подразделения на дату формирования документа.

2. Обновление программы: При обновлении 1С:ЗУП разработчики могут изменить структуру макета. Если вы редактировали макет вручную через "Печатные формы и макеты", ваши изменения сохранятся, но новые поля, добавленные фирмой "1С", в вашем макете не появятся. Периодически проверяйте актуальность вашего кастомного макета после крупных релизов.

3. Проблема пустых значений: Как мы выяснили ранее, всегда используйте функцию ЕСТЬNULL или конструкцию ВЫБОР. В иерархических справочниках 1С отсутствие родителя возвращает не пустую ссылку, а значение NULL в контексте запросов СКД. Игнорирование этого факта приведет к тому, что у сотрудников головных офисов поле "Подразделение" в листке окажется пустым.

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

← На главную