Как исключить лишние начисления при расчете зарплаты за первую половину месяца в ЗУП 2.5

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

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

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

Способ 1. Реализация внешней обработки заполнения табличной части

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

Посмотрим на пример процедурного кода обработки заполнения:


Процедура Инициализировать(Объект, ТЧЗарплата, ТабличноеПолеОбъекта) Экспорт

    Если Объект.ЭтоНовый() Тогда
        Объект.Записать();
    КонецЕсли;

    Если Объект.Модифицированность() Тогда
        Объект.Записать();
    КонецЕсли;

    Если Объект.Проведен Тогда
        Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    КонецЕсли;
    
    // Формируем массив разрешенных основных начислений
    МассивНач = Новый Массив;
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоЧасам);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ТарифДневной);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ТарифЧасовой);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаСверхурочных);
    МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднему);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Начисления.Ссылка,
    |    Начисления.НомерСтроки,
    |    Начисления.Сотрудник,
    |    Начисления.Физлицо,
    |    Начисления.ВидРасчета,
    |    Начисления.ДатаНачала,
    |    Начисления.ДатаОкончания,
    |    Начисления.Показатель1,
    |    Начисления.Показатель2,
    |    Начисления.Показатель3,
    |    Начисления.Показатель4,
    |    Начисления.Показатель5,
    |    Начисления.Показатель6,
    |    Начисления.Результат,
    |    Начисления.ДополнительныйРезультат,
    |    Начисления.ПодразделениеОрганизации,
    |    Начисления.ОтработаноДней,
    |    Начисления.ОтработаноЧасов,
    |    Начисления.ОтработаноДнейПоПятидневке,
    |    Начисления.НормаДней,
    |    Начисления.НормаЧасов,
    |    Начисления.НормаДнейПоПятидневке,
    |    Начисления.ПериодРасчетаСреднегоЗаработкаНачало,
    |    Начисления.ПериодРасчетаСреднегоЗаработкаОкончание,
    |    Начисления.ДатаНачалаСобытия,
    |    Начисления.Сторно,
    |    Начисления.Авторасчет,
    |    Начисления.ОплачиватьЧасов,
    |    Начисления.ОплаченоДнейЧасов,
    |    Начисления.ОтработаноЧасовПоПятидневке,
    |    Начисления.НормаЧасовПоПятидневке,
    |    Начисления.СторнируемыйДокумент,
    |    Начисления.РасчетнаяБазаЗаЕдиницуНормыВремени
    |ИЗ
    |    Документ.НачислениеЗарплатыРаботникамОрганизаций.Начисления КАК Начисления
    |ГДЕ
    |    Начисления.Ссылка = &Ссылка
    |    И Начисления.ВидРасчета В(&ВидРасчета)";

    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    Запрос.УстановитьПараметр("ВидРасчета", МассивНач);

    Рез = Запрос.Выполнить().Выгрузить();
    
    // Перезаполняем и очищаем лишние ТЧ
    Объект.Начисления.Загрузить(Рез);
    Объект.Удержания.Очистить();
    Объект.ДоговорыНаВыполнениеРабот.Очистить();
    Объект.ПогашениеЗаймов.Очистить();
    Объект.НДФЛ.Очистить();

    Объект.Записать(РежимЗаписиДокумента.Запись);
    Объект.РассчитатьВсе();
    Объект.Записать();
    
КонецПроцедуры

Особенности расчета зависимых начислений (Районный коэффициент)

Проанализируем частую проблему: почему при простой подстановке вида расчета РайонныйКоэффициент в массив отбора расчет суммы не происходит.

Вид расчета «Районный коэффициент» является зависимым начислением вторичного расчета. Метод объекта РассчитатьВсе() работает только по тем строкам, которые уже присутствуют в табличной части Начисления, опираясь на расчетную базу (базовые виды расчета, такие как оклад или тарифная ставка).

Выясним причину проблемы и варианты ее устранения:

  1. Отсутствие строки в табличной части: Если строки с видом расчета «Районный коэффициент» изначально нет в документе после отбора, алгоритм расчета не создаст её автоматически.
  2. Зависимость от базы: Для того чтобы районный коэффициент рассчитался корректно, в настройках самого вида расчета в состав базовых начислений должны входить те виды оплаты, которые оставлены в документе.

Чтобы корректно рассчитать Районный коэффициент вместе с окладом, рекомендуется использовать двухэтапную схему обработки:

  1. Выполнить стандартное заполнение и полный расчет документа штатным методом (чтобы платформа сама сформировала строки для базовых видов расчета и зависимой строки с РК).
  2. Вызвать метод РассчитатьВсе() для формирования результатов.
  3. Программно обойти табличную часть Начисления и удалить только те строки, виды расчета которых НЕ входят в список разрешенных для первой половины месяца.
  4. Очистить лишние табличные части (Удержания, НДФЛ) и выполнить повторную запись документа.
← На главную