При переходе с 1С:ЗУП 2.5 на версию 3.1 многие разработчики сталкиваются с серьезным барьером: механизмы, которые раньше реализовывались простым копированием документов, теперь требуют глубокого понимания внутреннего «движка» программы. Одной из типичных задач является создание инструмента для ввода основного начисления и нескольких зависимых от него доплат. Разберем, почему копирование типовых объектов — это тупиковый путь, и как правильно реализовать задачу с использованием расширений и механизмов расчетной базы.
Рассмотрим ситуацию: разработчик копирует документ ИзменениеОплатыТруда, надеясь сохранить его логику. Однако в ЗУП 3.1 расчеты в формах документов жестко завязаны на общие модули и менеджеры временных таблиц. Проанализируем основные причины, по которым копия документа часто оказывается неработоспособной:
РасчетЗарплатыРасширенный) ожидают на вход конкретные типы метаданных. Новый документ не входит в эти условия, и стандартные функции просто игнорируют его табличные части.ПлановыеНачисления и ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников. Копия документа не будет автоматически поддерживать «цепочку» состояний (например, прекращение действия старых начислений при назначении новых).Прежде чем приступать к кодингу, выясним, нельзя ли решить задачу настройками. В ЗУП 3.1 расчетная база — это динамический механизм. Если вам нужно добавить 3–4 зависимых вида расчета, оптимальнее использовать **Показатели расчета зарплаты**.
Рассмотрим алгоритм действий:
ДоплатаЗаСложность, ПедНагрузка).РасчетнаяБаза.ИзменениеОплатыТруда. Программа сама выведет колонки для ввода показателей в табличную часть Начисления.Этот способ гарантирует прозрачность для бухгалтера и корректное отражение в отчетах без вмешательства в код.
Если специфика учета (например, расчет педагогической нагрузки в образовании) требует особого интерфейса, разберем, как реализовать это через расширение. Вместо создания нового документа, мы заимствуем типовой и программно добавляем нужные поля.
Проанализируем шаги реализации в расширении:
ИзменениеОплатыТруда.&После для процедур ПриСозданииНаСервере и ПриИзменении данных в наших полях.Пример программного добавления строк в табличную часть начислений:
&НаСервере
Процедура ПослеДобавленияМоихНачислений(ДанныеФормы)
НоваяСтрока = Объект.Начисления.Добавить();
НоваяСтрока.Начисление = Справочники.Начисления.НайтиПоНаименованию("Доплата за стаж");
НоваяСтрока.Размер = ПолучитьРазмерДоплаты(Объект.Сотрудник);
// Вызов типового механизма пересчета
ОбновитьПоказателиНачисления(НоваяСтрока);
КонецПроцедуры
Один из самых сложных вопросов — как получить сумму базы (например, сумму оклада и других доплат) для расчета процента прямо в форме, до проведения документа. В ЗУП 3.1 для этого используется менеджер временных таблиц.
Выясним причину сложности: расчетная база не хранится в реквизитах формы, она вычисляется динамически на сервере. Чтобы ее получить, нужно имитировать процесс расчета. Рассмотрим фрагмент логики, которую необходимо реализовать:
Для получения актуальной базы в коде формы необходимо обращаться к функции РассчитатьЗарплату или специализированным API-методам модуля РасчетЗарплатыРасширенный. Программа анализирует настройки вида расчета (вкладка «Расчет базы»), собирает все начисления сотрудника, действующие в этом периоде, и суммирует их.
Важный нюанс: Если вы добавляете в ТЧ начисления, которые сами зависят друг от друга (каскадно), необходимо следить за приоритетами расчета. В ЗУП 3.1 это решается настройкой «Очередность расчета» в справочнике Начисления.
Чтобы ваше «дополнение» корректно заработало как плановое начисление (т.е. действовало из месяца в месяц), документ должен правильно заполнить регистр сведений ПлановыеНачисления. Проанализируем ситуацию: если просто записать данные в ТЧ документа, но не прописать логику в ОбработкаПроведения, начисления не попадут в документ Начисление зарплаты и взносов в конце месяца.
При использовании расширения к типовому документу эта проблема снимается автоматически, так как типовой код проведения сам «подхватит» ваши строки из таблицы Начисления. Если же вы все-таки создаете свой документ, вам придется вручную формировать движения по регистру:
Движение = Движения.ПлановыеНачисления.Добавить();
Движение.Сотрудник = СтрокаТЧ.Сотрудник;
Движение.Начисление = СтрокаТЧ.Начисление;
Движение.ДатаНачала = Объект.ДатаИзменения;
Движение.Используется = Истина;
// Важно: нужно также записать показатели в ЗначенияПериодическихПоказателей...
Подведем итог и выберем стратегию работы:
ИзменениеОплатыТруда или НазначениеПлановогоНачисления.Начисления. Это самый современный и технологичный подход в экосистеме 1С:Предприятие 8.3.Помните, что ЗУП 3.1 крайне регламентирована. Любое вмешательство в механизмы расчета плановых начислений должно быть тщательно протестировано на предмет влияния на средний заработок, расчет аванса и пересчеты за прошлые периоды. Использование расширений позволяет минимизировать риски и сохранить конфигурацию на поддержке.