Создание обработки для корректировки начислений зарплаты с удалением отрицательных начислений
Заявка
Пермь(Россия )
oldans.ru
21.05.1989(36 лет)
63 |
0
сегодня в 16:11:07
(4 часа назад)
52200
Закрытый тендер (Бюджеты предложений видит только заказчик)
Сегодня 10:27:58
Текст задания
Конфигурация: 1С:ERP Управление предприятием 2 (2.5.25.56)
Платформа: 8.3.27.1719
1. Цель задачи
Разработать внешнюю обработку, которая:
Удаляет документы, содержащие отрицательные начисления по видам:
СУДЕР (Корректировка по результатам KPI (СУ))
СУТОП (Перерасход топлива)
(коды видов начисления: СУДЕР, СУТОП)
Компенсирует влияние этих сторно, уменьшая суммы других начислений (премий) по приоритетам (от 1 до 5), не трогая начисления с приоритетом 0.
При корректировке окладных (ОКЛ, ОКЛЧС) и тарифных (ТРФЧС, ЧСКТУ, ЧОКТУ, УБКТУ и др.) начислений, пересчитывает и корректирует значения реквизитов Оклад или Тарифная ставка (часовая), чтобы сохранялась логика расчёта (Сумма = Оклад / НормаДней * ОтработаноДней или Сумма = Тариф * ОтработаноЧасов).
Автоматически открывает и закрывает закрытые месяцы в расчёте зарплаты при необходимости обработки.
Обеспечивает сохранение итоговой суммы начисления по сотруднику за месяц (чтобы не изменилась налогооблагаемая база).
Обеспечивает безопасность при обновлении конфигурации (рекомендуется создание через расширение, но допускается и создание как внешней обработки в основной конфигурации).
2. Функциональные требования
2.1. Интерфейс обработки
Форма с двумя полями ввода:
ПериодНачала (тип: Дата, отображение: Месяц, заголовок: "С какого месяца")
ПериодОкончания (тип: Дата, отображение: Месяц, заголовок: "По какой месяц")
Кнопка с заголовком "Выполнить" и командой, вызывающей основную процедуру обработки.
2.2. Основная логика обработки
Проверка периода: Убедиться, что ПериодНачала <= ПериодОкончания. Если нет — выдать сообщение и завершить.
Определение закрытых периодов:
Собрать все месяцы в диапазоне от НачалоМесяца(ПериодНачала) до КонецМесяца(ПериодОкончания).
Проверить статус каждого месяца через РегистрыСведений.СтатусыПериодовРасчетаЗарплаты.ПолучитьСтатусМесяца(Месяц).
Если статус Закрыт:
Запомнить месяц в список ЗакрытыеМесяцы.
Вызвать Обработки.УправлениеЗарплатойИКадрами.ОткрытьПериодРасчетаЗарплаты(Месяц).
Вывести сообщение: "Месяц [Месяц] — закрытие отменено."
Поиск и обработка отрицательных начислений:
Выполнить запрос к базе данных:
Источники: Документ.ПеречисленияОплат.Начисления, Документ.РазовыеНачисления.Начисления.
Условия:
Сумма < 0
ВидНачисления.Код в списке ["СУДЕР", "СУТОП"]
ПериодРасчета в диапазоне от НачалоМесяца(ПериодНачала) до КонецМесяца(ПериодОкончания).
Для каждой найденной строки:
Запомнить Сумма (с положительным знаком), Сотрудник, ПериодРасчета, Документ.
Компенсация:
Для каждого найденного сотрудника и периода:
Найти все положительные начисления (Сумма > 0) за этот период по этому сотруднику из:
Документ.НачислениеЗарплатыВзносов.Начисления
Документ.РазовыеНачисления.Начисления
Фильтровать по видам начислений, которые имеют приоритет (не входят в список с приоритетом 0).
Добавить поле Приоритет к каждой строке начисления на основе справочника приоритетов (см. п. 3).
Отсортировать положительные начисления по возрастанию Приоритет.
Цикл по отсортированным начислениям:
Пока остаток отрицательной суммы (СуммаСторно) > 0 и есть начисления для корректировки:
Выбрать текущее начисление ТекСумма.
Рассчитать НоваяСумма = Макс(0, ТекСумма - ОстатокСторно).
Рассчитать Разница = ТекСумма - НоваяСумма.
Обновить тариф/оклад (если вид начисления из списка ОКЛ, ОКЛЧС, ТРФЧС, ТРЧСП, УБКТУ, ЧСКТУ, ЧОКТУ и др., см. список в п. 3):
Если НоваяСумма = 0: установить Оклад = 0 или ТарифнаяСтавка_Часовая = 0.
Иначе:
Для ОКЛ: Оклад = НоваяСумма / ОтработаноДней * НормаДней (при ОтработаноДней > 0).
Для ОКЛЧС: Оклад = НоваяСумма / ОтработаноЧасов (при ОтработаноЧасов > 0).
Для остальных тарифных: ТарифнаяСтавка_Часовая = НоваяСумма / ОтработаноЧасов (при ОтработаноЧасов > 0).
Установить Сумма = НоваяСумма в строке документа.
Вызвать Документ.Записать() (без указания РежимПроведения, так как это внешняя обработка).
Уменьшить ОстатокСторно на Разница.
Если после цикла ОстатокСторно > 0:
Вывести предупреждение: "Не удалось полностью компенсировать [ВидНачисления] по [Сотрудник] за [Период]. Остаток: [ОстатокСторно]".
Удаление документов сторно:
Для каждого документа СУДЕР/СУТОП, найденного в п. 2.2.3:
Установить ПометкаУдаления = Истина.
Вызвать Документ.Записать().
Восстановление закрытия периодов:
Для каждого месяца из списка ЗакрытыеМесяцы:
Вызвать Обработки.УправлениеЗарплатойИКадрами.ЗакрытьПериодРасчетаЗарплаты(Месяц).
Вывести сообщение: "Месяц [Месяц] — закрытие восстановлено."
Финальное сообщение: Вывести "✅ Обработка завершена."
2.3. Обработка ошибок
Использовать Попытка...Исключение при выполнении основной логики (п. 2.3).
В блоке Исключение выполнить восстановление закрытия месяцев (п. 2.6), даже если произошла ошибка.
В конце Исключение пробросить ошибку дальше (ВызватьИсключение).
3. Справочник приоритетов видов начислений (отправлю по запросу полную версию)
0
НЕВЫХ
Отсутствие по невыясненной причине
0
ЧСНВХ
Отсутствие по невыясненной причине (внутрисменное)
0
СКЛ
Отпуск на период санаторно-курортного лечения (за счет ФСС)
1
ОБУЧ
Удержание за обучение
1
ПРЕМИ
Премия
1
ПРЕМС
Премия ежемесячная (СУММОЙ)
1
ПРГС
Премия за год (суммой)
4. Рекомендации по реализации
Местоположение: Обработку рекомендуется создать внутри расширения, чтобы не мешать обновлениям типовой конфигурации. Если создание расширения невозможно, допускается создание внешней обработки на верхнем уровне (Внешние отчеты и обработки).
Тестирование: Обязательно протестировать на копии рабочей базы перед запуском на проде.
Логирование: Выводить сообщения о ходе выполнения и о найденных/обработанных/необработанных документах в окно сообщений (Сообщить(...)).
Совместимость: Убедиться, что код работает в 1С:Предприятие 8.3.27.1719 (например, не использовать методы, появившиеся в более поздних версиях, как СведенияОВнешнейОбработке).
5. Дополнительная информация
Примеры данных из НачислениеЗарплатыВзносов и РазовыеНачисления предоставлены в файле Начисления АПМИ за октябрь.xlsx.
Пример расчётного листа, где видно Корректировка по результатам KPI (СУ) со знаком минус, предоставлен в Гусев АН_Расчетный лист.pdf.
Добрый день! Могу вам помочь, обладаю нужными знаниями и компетенциями для решения вашей задачи. А также могу поделиться кейсами по похожим сферам деятельности. Напишите ваш номер, обсудим детали, буду рад быть полезным!