При расчете аванса (начисления за первую половину месяца) в программе 1С:Зарплата и управление персоналом 3.1 многие пользователи сталкиваются со следующей проблемой: если сотрудник в первой половине месяца находился в командировке, эти дни полностью исключаются из расчета аванса. В результате сумма аванса сотрудника значительно уменьшается, а в некоторых случаях (при длительной командировке) и вовсе может стать равной нулю.
С точки зрения трудового законодательства и современных требований контролирующих органов, непредоставление сотруднику выплат за фактически отработанное время или время нахождения в командировке в установленные сроки выплаты аванса является нарушением ТК РФ. В этой статье мы подробно разберем, как решить эту проблему с помощью организационных методов, стандартных настроек современных релизов, а также через доработку кода в более ранних версиях программы.
---
Выясним причину такого поведения программы. По умолчанию в системе 1С:ЗУП 3.1 время командировки оплачивается по среднему заработку. Документ Командировка регистрирует отсутствие сотрудника на рабочем месте и вытесняет его плановые начисления (например, оплату по окладу). Поскольку аванс рассчитывается на основании фактически отработанного времени (явки), дни командировки программа не считает рабочими днями и не начисляет за них оклад. А сама оплата командировки по среднему заработку по умолчанию назначается к выплате вместе с окончательным расчетом зарплаты в конце месяца.
В результате образуется «кассовый разрыв» для сотрудника: он работал (находился в командировке), но к моменту выплаты аванса за этот период ничего не получает.
---
Если вы работаете на актуальных версиях программы (начиная с релиза 3.1.25.36), разработчики 1С добавили штатный механизм для решения этой задачи. Нам больше не нужно прибегать к программированию.
Рассмотрим, как настроить этот функционал по шагам:
Командировка (или его аналог, используемый в вашей базе).Начисляется при расчете первой половины месяца. Сохраним изменения.Командировка обратим внимание на вкладку Главное. В поле Выплата выберем вариант С авансом и зарплатой (или настроим аналогичный переключатель переходящего периода).В этом случае программа рассчитает сумму среднего заработка за дни командировки, приходящиеся на первую половину месяца, прямо в документе Начисление за первую половину месяца. Сотрудник своевременно получит свои деньги в составе аванса.
---
Проанализируем ситуацию, когда у нас нет возможности обновить конфигурацию или использовать новый функционал. В этом случае бухгалтеры часто используют простой лайфхак с разделением прав доступа кадровика и расчетчика:
Командировка, чтобы зафиксировать отсутствие сотрудника, распечатать приказ и заполнить табель.Командировка до тех пор, пока не будет рассчитан и выплачен аванс.Начисление за первую половину месяца рассчитывает сотруднику оклад в полном объеме (так как вытеснение командировкой еще не сработало). Сотрудник получает стандартный аванс.Командировка. При итоговом расчете зарплаты за месяц программа автоматически сторнирует излишне начисленный оклад за дни командировки и начислит оплату по среднему заработку.Важно: этот способ имеет очевидный минус. Если средний заработок сотрудника существенно отличается от оклада, при итоговом расчете может возникнуть переплата или недоплата.
---
Если ваши бизнес-процессы требуют автоматического и точного расчета, а версия программы не поддерживает новый функционал, проблему можно решить внесением изменений в код конфигурации (рекомендуется делать это через расширение конфигурации).
Разберем детально техническое решение, предложенное разработчиками на форуме.
Нам необходимо передать признак того, что производится расчет первой половины месяца, в переопределяемый модуль. Для этого внесем изменения в модуль объекта обработки МенеджерРасчетаЗарплаты, а именно в процедуру ЗаполнитьВыявленнымиНачислениями.
Добавим код, который помещает настройки расчета во временную таблицу:
// Передача параметров расчета в РасчетЗарплатыРасширенныйПереопределяемый через менеджер временных таблиц
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ""ПерваяПоловинаМесяца"" КАК Параметр,
| &ЗначениеПерваяПоловинаМесяца КАК Значение
|ПОМЕСТИТЬ ВТНастройкиРасчета";
Запрос.УстановитьПараметр("ЗначениеПерваяПоловинаМесяца", НастройкиРасчета.ПерваяПоловинаМесяца);
Запрос.Выполнить();
Теперь перейдем в общий модуль РасчетЗарплатыРасширенныйПереопределяемый и найдем процедуру ЗаполнитьДополнительныеНачисленияЗарплаты. По умолчанию она пуста и предназначена как раз для реализации локальных алгоритмов расчета.
Напишем алгоритм, который выбирает проведенные командировки сотрудников, попадающие в период расчета аванса, и принудительно включает их в таблицу дополнительных начислений:
Процедура ЗаполнитьДополнительныеНачисленияЗарплаты(МенеджерВременныхТаблиц, ДополнительныеНачисления) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВТНастройкиРасчета");
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.НайтиСледующий("ПерваяПоловинаМесяца", "Параметр") И Выборка.Значение Тогда
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| НачисленияУдержанияПоСотрудникам.Сотрудник КАК Сотрудник,
| НачисленияУдержанияПоСотрудникам.Организация КАК Организация,
| НачисленияУдержанияПоСотрудникам.НачислениеУдержание КАК Начисление,
| ВЫБОР
| КОГДА НачисленияУдержанияПоСотрудникам.ДатаНачала >= ВТСотрудникиПериоды.ДатаНачала
| ТОГДА НачисленияУдержанияПоСотрудникам.ДатаНачала
| ИНАЧЕ ВТСотрудникиПериоды.ДатаНачала
| КОНЕЦ КАК ДатаНачала,
| ВЫБОР
| КОГДА НачисленияУдержанияПоСотрудникам.ДатаОкончания <= ВТСотрудникиПериоды.ДатаОкончания
| ТОГДА НачисленияУдержанияПоСотрудникам.ДатаОкончания
| ИНАЧЕ ВТСотрудникиПериоды.ДатаОкончания
| КОНЕЦ КАК ДатаОкончания,
| НачисленияУдержанияПоСотрудникам.ДокументОснование КАК ДокументОснование
|ИЗ
| РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК НачисленияУдержанияПоСотрудникам
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСотрудникиПериоды КАК ВТСотрудникиПериоды
| ПО НачисленияУдержанияПоСотрудникам.Организация = ВТСотрудникиПериоды.Организация
| И НачисленияУдержанияПоСотрудникам.Сотрудник = ВТСотрудникиПериоды.Сотрудник
| И НачисленияУдержанияПоСотрудникам.ДатаОкончания >= ВТСотрудникиПериоды.ДатаНачала
| И НачисленияУдержанияПоСотрудникам.ДатаНачала <= ВТСотрудникиПериоды.ДатаОкончания
|ГДЕ
| (НачисленияУдержанияПоСотрудникам.НачислениеУдержание.КатегорияНачисленияИлиНеоплаченногоВремени = ЗНАЧЕНИЕ(Перечисление.КатегорииНачисленийИНеоплаченногоВремени.ОплатаКомандировки)
| ИЛИ НачисленияУдержанияПоСотрудникам.НачислениеУдержание.КатегорияНачисленияИлиНеоплаченногоВремени = ЗНАЧЕНИЕ(Перечисление.КатегорииНачисленийИНеоплаченногоВремени.ОплатаПоСреднемуЗаработку))
| И (НачисленияУдержанияПоСотрудникам.НачислениеУдержание.ВидДокументаНачисления = ЗНАЧЕНИЕ(Перечисление.ВидыДокументовНачисления.Командировка)
| ИЛИ НачисленияУдержанияПоСотрудникам.НачислениеУдержание.ВидДокументаНачисления = ЗНАЧЕНИЕ(Перечисление.ВидыДокументовНачисления.ОплатаПоСреднемуЗаработку))
| И НачисленияУдержанияПоСотрудникам.Сторно = ЛОЖЬ
| И НЕ НачисленияУдержанияПоСотрудникам.ДокументОснование ЕСТЬ NULL
| И НачисленияУдержанияПоСотрудникам.НачислениеУдержание.НачисляетсяПриРасчетеПервойПоловиныМесяца
|
|УПОРЯДОЧИТЬ ПО
| Сотрудник,
| Начисление";
ТзНУ = Запрос.Выполнить().Выгрузить();
Для Каждого СтрНУ Из ТзНУ Цикл
СтрДН = Неопределено;
СтрукОтбор = Новый Структура("Сотрудник, Организация, Начисление", СтрНУ.Сотрудник, СтрНУ.Организация, СтрНУ.Начисление);
МасСтрДН = ДополнительныеНачисления.НайтиСтроки(СтрукОтбор);
НачислениеПересекаетсяСИмеющимся = Ложь;
Для Каждого СтрДН Из МасСтрДН Цикл
Если СтрНУ.ДатаНачала <= СтрДН.ДатаОкончания И СтрНУ.ДатаОкончания >= СтрДН.ДатаНачала Тогда
НачислениеПересекаетсяСИмеющимся = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ НачислениеПересекаетсяСИмеющимся Тогда
СтрДН = ДополнительныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(СтрДН, СтрНУ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
После внесения изменений в код обязательно откройте программу в режиме «1С:Предприятие» и проверьте настройки начисления Командировка. У него должен быть установлен флаг Начисляется при расчете первой половины месяца.
Если этот флаг недоступен для редактирования из-за заполненного реквизита Вид документа, его можно установить программно с помощью простой внешней обработки или группового изменения реквизитов, выполнив следующий код:
ОбъектНачисления = СсылкаНаКомандировку.ПолучитьОбъект();
ОбъектНачисления.НачисляетсяПриРасчетеПервойПоловиныМесяца = Истина;
ОбъектНачисления.Записать();
Без этой настройки программа при попытке расчета аванса вернет ошибку Поле объекта не обнаружено (СреднийЗаработокОбщий), так как механизмы расчета не подготовят необходимые данные по среднему заработку для этого вида расчета.
---
Мы рассмотрели несколько путей решения проблемы исключения командировок из аванса. Наиболее предпочтительным и безопасным является переход на современный релиз 1С:ЗУП 3.1 и использование штатного флажка Начисляется при расчете первой половины месяца в сочетании с переключателем выплаты в самом документе. Если же обновление невозможно, применение предложенной программной доработки позволит полностью автоматизировать процесс без риска возникновения ошибок и сторнирования в последующих периодах.