При разработке печатных форм трудовых договоров или дополнительных соглашений в 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) мы часто сталкиваемся с задачей вывода плановых начислений сотрудника. Система хранит данные в регистре ЗначенияПериодическихПоказателейРасчетаЗарплаты. Однако, получив значение показателя (например, число "10" или "25000"), мы не всегда можем очевидным образом понять, что это: фиксированная сумма (25 000 руб.) или процент (10%).
В этой статье мы подробно разберем, почему возникает такая неопределенность, и рассмотрим несколько надежных способов решения этой задачи: от анализа формул до использования дополнительных реквизитов.
Справочник ПоказателиРасчетаЗарплаты в ЗУП 3.1 спроектирован максимально гибко. Один и тот же числовой показатель может использоваться в формулах совершенно по-разному. В системе нет жесткого переключателя "Тип показателя: Сумма/Процент", потому что смысл числу придает именно формула расчета конкретного начисления.
Рассмотрим ситуацию, когда у сотрудника введен показатель РазмерНадбавки со значением 20. В зависимости от формулы вида расчета это может означать:
Результат = РазмерНадбавки * ОтработаноДней / НормаДней.Результат = РасчетнаяБаза * РазмерНадбавки / 100.Наша задача — научить программу понимать этот контекст при формировании печатной формы.
Самый надежный и архитектурно верный способ — явно указать системе, чем является показатель. Поскольку типовой справочник не содержит нужного реквизита, мы можем использовать механизм Дополнительных реквизитов и сведений (БСП), не снимая конфигурацию с поддержки.
Разберем алгоритм действий:
Показатели расчета зарплаты.ТипПоказателяДляПечати.Теперь в коде печатной формы мы будем обращаться не к формулам, а к этому свойству:
// Пример получения значения доп. реквизита (псевдокод)
ТипПоказателя = ПоказательСсылка.ТипПоказателяДляПечати; // Если добавлено через расширение
// Или через чтение свойств БСП
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(ПоказательСсылка, СвойствоТипПоказателя);
Если ЗначениеСвойства = Перечисления.ТипыПоказателей.Процент Тогда
// Выводим как процент
Иначе
// Выводим как сумму
КонецЕсли;
Преимущества: Полная однозначность. Вы сами управляете логикой вывода.
Недостатки: Требуется ручная настройка для каждого нового показателя.
Если мы не хотим или не можем добавлять дополнительные реквизиты, нам придется анализировать, как показатель используется в начислениях. Этот метод сложнее, так как один показатель теоретически может использоваться в разных начислениях по-разному, но на практике он обычно привязан к конкретной логике.
Логика анализа следующая:
Показатели справочника Начисления.ФормулаРасчета.Рассмотрим признаки, указывающие на то, что показатель является процентом:
/ 100).РасчетнаяБаза, и наш показатель умножается на неё.Пример программного подхода к анализу:
Функция ЭтоПроцентныйПоказатель(ПоказательСсылка, НачислениеСсылка)
Формула = НачислениеСсылка.ФормулаРасчета;
// Простейшая проверка: наличие "РасчетнаяБаза" и деления на 100
// В реальной задаче лучше использовать механизмы разбора формул ЗУП
Если СтрНайти(Формула, "РасчетнаяБаза") > 0
И (СтрНайти(Формула, "/ 100") > 0 ИЛИ СтрНайти(Формула, "/100") > 0) Тогда
// Дополнительно можно проверить, входит ли имя показателя в формулу
ИдентификаторПоказателя = ПоказательСсылка.Идентификатор;
Если СтрНайти(Формула, ИдентификаторПоказателя) > 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Стоит отметить, что в ЗУП существуют общие модули для работы с формулами (например, связанные с подсистемой расчета зарплаты), которые позволяют разобрать формулу на операнды, но их использование требует глубокого знания API конфигурации.
Это интересный и неочевидный метод, который часто дает точный результат без парсинга строк. Идея заключается в использовании механизма расчета ФОТ.
В настройках начисления обычно стоит галочка "Включать в ФОТ". При назначении планового начисления программа рассчитывает его вклад в ФОТ.
Процент * База / 100. То есть значение показателя (например, 10) будет кардинально отличаться от суммы вклада в ФОТ (например, 5000 руб.).Рассмотрим алгоритм проверки:
// Получаем вклад в ФОТ по конкретному начислению сотрудника
СуммаФОТ = ПолучитьВкладВФОТПоНачислению(Сотрудник, Начисление);
ЗначениеПоказателя = ПолучитьЗначениеПоказателя(Сотрудник, Показатель);
// Если значение показателя совпадает с суммой ФОТ (с учетом округления)
Если Окр(СуммаФОТ, 2) = Окр(ЗначениеПоказателя, 2) Тогда
// С высокой вероятностью это Сумма
Иначе
// Скорее всего, это Процент или Коэффициент,
// либо показатель зависит от отработанного времени (часовая ставка)
КонецЕсли;
Этот метод хорош тем, что он опирается на математику расчета, а не на текст формулы. Однако он требует, чтобы по сотруднику были корректно рассчитаны данные в регистре сведений ПлановыйФОТ. Для контроля и сверки действующих значений можно использовать отчет по показателям плановых начислений сотрудников на дату.
Самый простой организационный метод, который не требует программирования сложной логики, но требует дисциплины от пользователей.
Договоритесь или установите правило: если показатель является процентом, в его Кратком наименовании обязательно должен присутствовать символ %.
Например:
Тогда код проверки становится тривиальным:
Если СтрНайти(ПоказательСсылка.КраткоеНаименование, "%") > 0 Тогда
// Считаем процентом
КонецЕсли;
Мы проанализировали несколько подходов к определению типа показателя. Давайте подытожим:
Для реализации печати трудовых договоров мы рекомендуем комбинированный подход: в первую очередь проверять наличие специального маркера (доп. реквизита или символа в названии), а при его отсутствии пытаться анализировать структуру формулы. При необходимости можно воспользоваться готовым комплектом печатных форм трудовых договоров для ЗУП 3.1.