Как учесть командировку при расчете аванса в 1С:ЗУП 3.1?

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

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

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

---

Почему возникает эта проблема?

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

В результате образуется «кассовый разрыв» для сотрудника: он работал (находился в командировке), но к моменту выплаты аванса за этот период ничего не получает.

---

Вариант 1. Современное типовое решение (для новых релизов 1С:ЗУП)

Если вы работаете на актуальных версиях программы (начиная с релиза 3.1.25.36), разработчики 1С добавили штатный механизм для решения этой задачи. Нам больше не нужно прибегать к программированию.

Рассмотрим, как настроить этот функционал по шагам:

  1. Перейдем в меню Настройка — Начисления и откроем вид расчета Командировка (или его аналог, используемый в вашей базе).
  2. На вкладке Основное найдем и установим флажок Начисляется при расчете первой половины месяца. Сохраним изменения.
  3. При заполнении документа Командировка обратим внимание на вкладку Главное. В поле Выплата выберем вариант С авансом и зарплатой (или настроим аналогичный переключатель переходящего периода).

В этом случае программа рассчитает сумму среднего заработка за дни командировки, приходящиеся на первую половину месяца, прямо в документе Начисление за первую половину месяца. Сотрудник своевременно получит свои деньги в составе аванса.

---

Вариант 2. Организационный обход (без изменения кода и настроек)

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

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

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

---

Вариант 3. Программная доработка (для релизов линейки 3.1.5 — 3.1.19)

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

Разберем детально техническое решение, предложенное разработчиками на форуме.

Шаг 1. Передача параметров расчета

Нам необходимо передать признак того, что производится расчет первой половины месяца, в переопределяемый модуль. Для этого внесем изменения в модуль объекта обработки МенеджерРасчетаЗарплаты, а именно в процедуру ЗаполнитьВыявленнымиНачислениями.

Добавим код, который помещает настройки расчета во временную таблицу:


// Передача параметров расчета в РасчетЗарплатыРасширенныйПереопределяемый через менеджер временных таблиц
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ""ПерваяПоловинаМесяца"" КАК Параметр,
               |    &ЗначениеПерваяПоловинаМесяца КАК Значение
               |ПОМЕСТИТЬ ВТНастройкиРасчета";
Запрос.УстановитьПараметр("ЗначениеПерваяПоловинаМесяца", НастройкиРасчета.ПерваяПоловинаМесяца);
Запрос.Выполнить();

Шаг 2. Добавление командировок в дополнительные начисления

Теперь перейдем в общий модуль РасчетЗарплатыРасширенныйПереопределяемый и найдем процедуру ЗаполнитьДополнительныеНачисленияЗарплаты. По умолчанию она пуста и предназначена как раз для реализации локальных алгоритмов расчета.

Напишем алгоритм, который выбирает проведенные командировки сотрудников, попадающие в период расчета аванса, и принудительно включает их в таблицу дополнительных начислений:


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

Шаг 3. Настройка вида расчета в пользовательском режиме

После внесения изменений в код обязательно откройте программу в режиме «1С:Предприятие» и проверьте настройки начисления Командировка. У него должен быть установлен флаг Начисляется при расчете первой половины месяца.

Если этот флаг недоступен для редактирования из-за заполненного реквизита Вид документа, его можно установить программно с помощью простой внешней обработки или группового изменения реквизитов, выполнив следующий код:


ОбъектНачисления = СсылкаНаКомандировку.ПолучитьОбъект();
ОбъектНачисления.НачисляетсяПриРасчетеПервойПоловиныМесяца = Истина;
ОбъектНачисления.Записать();

Без этой настройки программа при попытке расчета аванса вернет ошибку Поле объекта не обнаружено (СреднийЗаработокОбщий), так как механизмы расчета не подготовят необходимые данные по среднему заработку для этого вида расчета.

---

Резюме

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

← На главную