Как программно определить тип показателя расчета зарплаты в ЗУП 3.1: сумма или процент?

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

При разработке печатных форм трудовых договоров или дополнительных соглашений в 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) мы часто сталкиваемся с задачей вывода плановых начислений сотрудника. Система хранит данные в регистре ЗначенияПериодическихПоказателейРасчетаЗарплаты. Однако, получив значение показателя (например, число "10" или "25000"), мы не всегда можем очевидным образом понять, что это: фиксированная сумма (25 000 руб.) или процент (10%).

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

Суть проблемы: архитектура показателей в ЗУП 3.1

Справочник ПоказателиРасчетаЗарплаты в ЗУП 3.1 спроектирован максимально гибко. Один и тот же числовой показатель может использоваться в формулах совершенно по-разному. В системе нет жесткого переключателя "Тип показателя: Сумма/Процент", потому что смысл числу придает именно формула расчета конкретного начисления.

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

  1. Фиксированную сумму: Результат = РазмерНадбавки * ОтработаноДней / НормаДней.
  2. Процент от оклада: Результат = РасчетнаяБаза * РазмерНадбавки / 100.

Наша задача — научить программу понимать этот контекст при формировании печатной формы.

Способ 1. Использование дополнительных реквизитов (Рекомендуемый)

Самый надежный и архитектурно верный способ — явно указать системе, чем является показатель. Поскольку типовой справочник не содержит нужного реквизита, мы можем использовать механизм Дополнительных реквизитов и сведений (БСП), не снимая конфигурацию с поддержки.

Разберем алгоритм действий:

  1. В режиме "1С:Предприятие" перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Найдем набор для справочника Показатели расчета зарплаты.
  3. Добавим новый дополнительный реквизит, например, ТипПоказателяДляПечати.
  4. Установим тип значения: Булево (где Истина = Процент, Ложь = Сумма) или Значения свойств объектов (создадим два значения: "Сумма" и "Процент").
  5. Для всех используемых показателей вручную проставим этот признак.

Теперь в коде печатной формы мы будем обращаться не к формулам, а к этому свойству:


// Пример получения значения доп. реквизита (псевдокод)
ТипПоказателя = ПоказательСсылка.ТипПоказателяДляПечати; // Если добавлено через расширение
// Или через чтение свойств БСП
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(ПоказательСсылка, СвойствоТипПоказателя);

Если ЗначениеСвойства = Перечисления.ТипыПоказателей.Процент Тогда
    // Выводим как процент
Иначе
    // Выводим как сумму
КонецЕсли;

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

Способ 2. Анализ формулы расчета (Парсинг)

Если мы не хотим или не можем добавлять дополнительные реквизиты, нам придется анализировать, как показатель используется в начислениях. Этот метод сложнее, так как один показатель теоретически может использоваться в разных начислениях по-разному, но на практике он обычно привязан к конкретной логике.

Логика анализа следующая:

  1. Находим вид расчета (Начисление), в котором используется данный показатель. Это можно сделать запросом к табличной части Показатели справочника Начисления.
  2. Получаем текст формулы из реквизита ФормулаРасчета.
  3. Анализируем текст формулы.

Рассмотрим признаки, указывающие на то, что показатель является процентом:

Пример программного подхода к анализу:


Функция ЭтоПроцентныйПоказатель(ПоказательСсылка, НачислениеСсылка)
    
    Формула = НачислениеСсылка.ФормулаРасчета;
    
    // Простейшая проверка: наличие "РасчетнаяБаза" и деления на 100
    // В реальной задаче лучше использовать механизмы разбора формул ЗУП
    Если СтрНайти(Формула, "РасчетнаяБаза") > 0 
       И (СтрНайти(Формула, "/ 100") > 0 ИЛИ СтрНайти(Формула, "/100") > 0) Тогда
        
        // Дополнительно можно проверить, входит ли имя показателя в формулу
        ИдентификаторПоказателя = ПоказательСсылка.Идентификатор;
        Если СтрНайти(Формула, ИдентификаторПоказателя) > 0 Тогда
            Возврат Истина;
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Ложь;

КонецФункции

Стоит отметить, что в ЗУП существуют общие модули для работы с формулами (например, связанные с подсистемой расчета зарплаты), которые позволяют разобрать формулу на операнды, но их использование требует глубокого знания API конфигурации.

Способ 3. Сравнение с ФОТ (Фондом Оплаты Труда)

Это интересный и неочевидный метод, который часто дает точный результат без парсинга строк. Идея заключается в использовании механизма расчета ФОТ.

В настройках начисления обычно стоит галочка "Включать в ФОТ". При назначении планового начисления программа рассчитывает его вклад в ФОТ.

Рассмотрим алгоритм проверки:


// Получаем вклад в ФОТ по конкретному начислению сотрудника
СуммаФОТ = ПолучитьВкладВФОТПоНачислению(Сотрудник, Начисление);
ЗначениеПоказателя = ПолучитьЗначениеПоказателя(Сотрудник, Показатель);

// Если значение показателя совпадает с суммой ФОТ (с учетом округления)
Если Окр(СуммаФОТ, 2) = Окр(ЗначениеПоказателя, 2) Тогда
    // С высокой вероятностью это Сумма
Иначе
    // Скорее всего, это Процент или Коэффициент, 
    // либо показатель зависит от отработанного времени (часовая ставка)
КонецЕсли;

Этот метод хорош тем, что он опирается на математику расчета, а не на текст формулы. Однако он требует, чтобы по сотруднику были корректно рассчитаны данные в регистре сведений ПлановыйФОТ. Для контроля и сверки действующих значений можно использовать отчет по показателям плановых начислений сотрудников на дату.

Способ 4. Визуальная маркировка (Наименование)

Самый простой организационный метод, который не требует программирования сложной логики, но требует дисциплины от пользователей.

Договоритесь или установите правило: если показатель является процентом, в его Кратком наименовании обязательно должен присутствовать символ %.

Например:

Тогда код проверки становится тривиальным:


Если СтрНайти(ПоказательСсылка.КраткоеНаименование, "%") > 0 Тогда
    // Считаем процентом
КонецЕсли;

Выводы и рекомендации

Мы проанализировали несколько подходов к определению типа показателя. Давайте подытожим:

  1. Дополнительный реквизит — лучшее решение для стабильной работы и долгосрочной поддержки. Оно не зависит от изменений формул и особенностей расчета ФОТ.
  2. Парсинг формул — возможен, но ненадежен из-за разнообразия вариантов написания формул пользователями.
  3. Анализ ФОТ — мощный инструмент для программных проверок, но может давать сбои в специфических случаях (например, при неполной ставке или сложных формулах зависимости от времени).

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

← На главную