Переход со старых версий программных продуктов (например, с легендарной «1С:Зарплата и Кадры 7.7» или «1С:ЗУП 2.5») на современную платформу 1С:Зарплата и управление персоналом 3.1 (ЗУП 3.1) часто сопровождается трудностями перестройки привычных бизнес-процессов. Бухгалтеры привыкают к определенной схеме работы с авансами, когда суммы могут рассчитываться по сложным внутренним формулам организации, зависеть от стажа, должности или совмещения должностей.
В этой статье мы подробно разберем, как решить задачу программного изменения планового аванса в 1С:ЗУП 3.1, рассмотрим внутреннюю архитектуру хранения данных в программе и приведем примеры кода для создания и проведения необходимых документов.
Прежде чем приступать к написанию кода, давайте проанализируем, где и как программа хранит сведения о плановых авансах сотрудников. В отличие от старых версий систем, в ЗУП 3.1 используется более сложная, но производительная структура регистров:
Важное предупреждение для разработчиков: Настоятельно не рекомендуется записывать данные напрямую в эти регистры сведений с помощью метода СоздатьНаборЗаписей(). Прямая запись в обход проведения документов нарушит синхронизацию между основным и интервальным регистрами. Это приведет к критическим ошибкам при автоматическом заполнении ведомостей на выплату зарплаты. Все изменения должны регистрироваться исключительно через проведение соответствующих документов-регистраторов.
Оптимальным и методически верным способом программной корректировки планового аванса является автоматическое создание и проведение документа Документ.ИзменениеАванса. Этот подход решает сразу две важные задачи: сохраняется прозрачная история изменений для бухгалтерии и гарантируется корректное заполнение всех интервальных регистров системы.
Рассмотрим пример кода, который создает документ «Изменение аванса» и заполняет его необходимыми данными:
// Создаем новый документ "Изменение аванса"
НовыйДокумент = Документы.ИзменениеАванса.СоздатьДокумент();
// Заполняем основные реквизиты шапки
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаНаОрганизацию; // Ссылка на СправочникСсылка.Организации
НовыйДокумент.ИзменитьАвансС = НачалоМесяца(ТекущаяДата()); // Дата, с которой действуют новые условия
// Указываем способ расчета аванса. Используем системное перечисление:
// - Перечисления.СпособыРасчетаАванса.ФиксированнойСуммой
// - Перечисления.СпособыРасчетаАванса.ПроцентомОтТарифа
// - Перечисления.СпособыРасчетаАванса.РасчетомЗаПервуюПоловинуМесяца
НовыйДокумент.СпособРасчетаАванса = Перечисления.СпособыРасчетаАванса.РасчетомЗаПервуюПоловинуМесяца;
// Заполняем табличную часть "Сотрудники"
НоваяСтрока = НовыйДокумент.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = СсылкаНаСотрудника; // Ссылка на СправочникСсылка.Сотрудники
// Если выбран способ "Фиксированной суммой" или "Процентом от тарифа", заполняем размер аванса
// НоваяСтрока.Аванс = 15000;
// Записываем и проводим документ
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно сформирован и проведен: " + НовыйДокумент.Ссылка);
Исключение
ВызватьИсключение "Не удалось провести документ изменения аванса: " + ОписаниеОшибки();
КонецПопытки;
Зачастую бухгалтерия требует автоматизировать процесс: например, при оформлении совмещения должностей или при уходе сотрудницы в декретный отпуск аванс должен меняться автоматически без ручного вмешательства кадровиков.
Для реализации такой логики отлично подходят Подписки на события. Мы можем перехватывать событие проведения целевого документа (например, Совмещение или БольничныйЛист) и в этот момент программно генерировать документ Изменение аванса.
Проанализируем пример функции-обработчика для подписки на событие проведения документа:
Процедура ПриПроведенииДокументаСовмещения(Источник, Отказ, РежимПроведения) Экспорт
// Если документ проведен с ошибками, прерываем выполнение
Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем, нужно ли корректировать аванс на основе логики компании.
// Например, если при совмещении должностей положена доплата, которая должна учитываться в авансе.
ТаблицаАвансов = ПолучитьРасчетныеДанныеАванса(Источник.Сотрудник, Источник.Организация);
Если ТаблицаАвансов.Количество() > 0 Тогда
ДокументАванса = Документы.ИзменениеАванса.СоздатьДокумент();
ДокументАванса.Дата = ТекущаяДата();
ДокументАванса.Организация = Источник.Организация;
ДокументАванса.ИзменитьАвансС = НачалоМесяца(Источник.ДатаНачала);
ДокументАванса.СпособРасчетаАванса = Перечисления.СпособыРасчетаАванса.РасчетомЗаПервуюПоловинуМесяца;
Для Каждого СтрокаДанных Из ТаблицаАвансов Цикл
НоваяСтрока = ДокументАванса.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = СтрокаДанных.Сотрудник;
КонецЦикла;
// Устанавливаем признак заполнения на основании родительского документа
ДокументАванса.ДокументОснование = Источник.Ссылка;
Попытка
ДокументАванса.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ПрограммноеИзменениеАванса",
УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка проведения аванса для: " + Источник.Сотрудник + ". Текст ошибки: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Помимо специализированного документа ИзменениеАванса, в конфигурации 1С:ЗУП 3.1 изменить параметры планового аванса можно с помощью других стандартных кадровых документов. Их также можно создавать программно в зависимости от решаемой бизнес-задачи:
КадровыйПеревод (или КадровыйПереводСписком) — на вкладке «Оплата труда» необходимо установить булевый флаг ИзменитьАванс и заполнить новые параметры выплаты.ИзменениеОплатыТруда — документ позволяет комплексно изменить плановые начисления и параметры аванса сотрудника без изменения его кадровой позиции.ВозвратИзОтпускаПоУходу — используется для возвращения сотрудника к активной трудовой деятельности с восстановлением планового аванса после декрета.Переходя с прошлых версий программ, бухгалтеры часто просят настроить аванс фиксированной суммой или процентом от тарифа, аргументируя это тем, что «так привычнее и проще». Однако разработчику крайне важно донести до финансовой службы изменения в налоговом законодательстве.
С 2023 года НДФЛ необходимо исчислять и удерживать при каждой выплате дохода, включая аванс (первую половину месяца). В 1С:ЗУП 3.1 только способ расчета «Расчетом за первую половину месяца» позволяет автоматически и корректно рассчитывать налог на дату выплаты аванса на основании фактически отработанных сотрудником дней.
Если организация продолжает использовать способы «Фиксированной суммой» или «Процентом от тарифа», программа физически не может рассчитать НДФЛ в момент выплаты без создания промежуточного документа начисления. Это приводит к возникновению ручных корректировок при заполнении регламентированной отчетности 6-НДФЛ. Объясните это бухгалтерам: переход на расчетный аванс избавит их от трудоемкой ручной работы и возможных штрафов со стороны налоговых органов.