Как лучше всего завести комментарий к начислению сотрудника и вывести его в расчетный листок

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

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

Анализ структуры данных и постановка задачи

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

Наша задача разделится на несколько этапов:

  1. Создание расширения для внесения изменений.
  2. Добавление реквизита в табличную часть документа начисления.
  3. Добавление реквизита в регистр накопления.
  4. Программирование передачи данных из документа в регистр при проведении.
  5. Модификация запроса СКД отчета.
  6. Правка общего модуля для вывода комментария в макет.

Шаг 1. Доработка документа и регистра через расширение

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

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

Шаг 2. Заполнение регистра при проведении документа

Теперь выясним, как передать текст комментария в движения документа. Для этого нам необходимо перехватить процедуру формирования движений. В ЗУП 3.1 за это обычно отвечает общий модуль или модуль менеджера документа. Нам нужно найти место, где формируется набор записей для регистра НачисленияУдержанияПоСотрудникам.

Проанализируем программный интерфейс ПроведениеРасчетов.СформироватьДвиженияНачисленияУдержания. В расширении мы можем использовать метод &После для процедуры, которая подготавливает таблицу движений. Пример логики кода будет выглядеть следующим образом:


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

Обратите внимание на использование ИдентификаторСтрокиВидаРасчета — это надежный способ связать строку табличной части с записью, предназначенной для регистра.

Шаг 3. Изменение схемы компоновки данных (СКД)

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

В запросе СКД найдем выборку из таблицы РегистрНакопления.НачисленияУдержанияПоСотрудникам. Добавим поле:

НачисленияУдержанияПоСотрудникам.КомментарийКНачислению КАК КомментарийКНачислению

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

ВидРасчета + " " + КомментарийКНачислению

Шаг 4. Решение проблемы с группировкой записей

Разберем типичную проблему: в расчетном листке комментарий берется только от первой записи, либо записи "схлопываются". Это происходит потому, что расчетный листок агрегирует данные по сотруднику и виду расчета за период. Если у сотрудника две строки с одним видом расчета, но разными комментариями, СКД применит функцию МАКСИМУМ или НАЧАЛО к текстовому полю.

Чтобы этого избежать, необходимо добавить КомментарийКНачислению в группировку отчета. Посмотрим на иерархию группировок: Группа -> Сотрудник -> Вид Расчета. Нам нужно добавить комментарий либо как подчиненную группировку, либо включить его в список полей, по которым осуществляется детальный вывод.

Шаг 5. Модификация печатной формы через общий модуль

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

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


// Пример модификации в общем модуле
Если ЗначениеЗаполнено(Выборка.КомментарийКНачислению) Тогда
    ОбластьМакета.Параметры.ВидРасчета = Строка(Выборка.ВидРасчета) + " (" + Выборка.КомментарийКНачислению + ")";
Иначе
    ОбластьМакета.Параметры.ВидРасчета = Строка(Выборка.ВидРасчета);
КонецЕсли;

Альтернативные методы решения

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

Рекомендации по отладке

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

Важное предостережение: Помните о статье 129 ТК РФ. Оклад — это фиксированный размер оплаты. Если вы используете "комментарии" для того, чтобы замаскировать изменение базовой ставки без кадрового перевода, это может вызвать вопросы у трудовой инспекции. С технической стороны система 1С позволит вам вывести любой текст, но юридическую чистоту начислений должен контролировать бухгалтер-расчетчик.

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

← На главную