Почему в печатной форме приказа Т-1 не отображается часовая надбавка и как это исправить?

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

При формировании кадровых приказов, таких как форма Т-1 (приказ о приеме на работу), разработчики часто сталкиваются с ситуацией, когда в печатной форме данные отображаются некорректно: например, у одного сотрудника часовая надбавка выводится, а у другого — нет, хотя в самом документе все заполнено верно. Рассмотрим детально, почему это происходит, как проанализировать код формирования ТЗ (таблицы значений) и каким образом устранить проблему через изменение логики получения данных.

Анализ исходной ситуации и диагностика проблемы

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

Разберем фрагмент кода, который вызывает затруднения:


ДанныеПозиции = УправлениеШтатнымРасписанием.ДанныеПозицииШтатногоРасписания(ДолжностьПоШтатномуРасписанию, ДатаСобытия);
МассивНачислений = ДанныеПозиции.Начисления;

Выясним причину ошибки: функция ДанныеПозицииШтатногоРасписания обращается к справочнику "Штатное расписание". Если для конкретной позиции (должности) в штатном расписании надбавка не указана как обязательная или была добавлена в документ приема вручную (сверх того, что предусмотрено "штаткой"), переменная МассивНачислений не будет содержать нужную строку. В результате цикл обхода начислений просто пропускает заполнение соответствующих полей в итоговой таблице.

Пошаговая отладка алгоритма

Для понимания того, на каком этапе теряются данные, пройдем по шагам процесса формирования таблицы начислений:

  1. Инициализация таблицы значений (ТЗ): Создается структура колонок, таких как ИдентификаторСтрокиВидаРасчета, НадбавкаНаименование, ПроцентНадбавки и Сумма.
  2. Получение данных позиции: Программа запрашивает данные из штатного расписания на дату события. Это критический момент. Если в позиции штатного расписания на этот день нет кода начисления "ЧНТС", то в массив МассивНачислений он не попадет.
  3. Цикл по начислениям: Программа перебирает строки массива. Рассмотрим типичную проверку по коду начисления:
    
    Если СокрЛП(СтрокаМассива.Начисление.Код) = "ЧНТС" тогда
        СтрокаТЗ = ТЗ.Добавить();
        СтрокаТЗ.НадбавкаНаименование = СтрокаМассива.Начисление.Наименование;
        СтрокаТЗ.Сумма = НайдСтрЧНТС; // Значение из функции, ищущей в документе
    КонецЕсли;
    

Здесь кроется логическая ловушка: сумма может искаться в документе (через вызов НадбавкаЧасоваяТарифнаяСтавка(Док)), но сама итерация цикла зависит от наличия этого вида расчета в штатном расписании. Если штатное расписание "пустое" в части этой надбавки, программа даже не зайдет внутрь условия Если.

Почему данные отображаются выборочно?

Проанализируем ситуацию, когда у части сотрудников данные есть, а у части — нет. Это связано с тем, как велось штатное расписание в информационной базе:

Решение проблемы: изменение источника данных

Чтобы печатная форма всегда соответствовала фактическим данным документа (ведь приказ Т-1 фиксирует условия трудового договора конкретного человека, а не общие правила штатной позиции), необходимо изменить подход. Вместо анализа штатного расписания следует анализировать табличную часть ОплатаТруда самого документа или использовать данные регистров плановых начислений сотрудника.

Рассмотрим вариант обхода проблемы, предложенный в ходе обсуждения. Мы можем дополнить таблицу ТЗ данными напрямую из документа, минуя проверку массива штатного расписания. Пример реализации логики:


// Сначала получаем данные из штатки (как в типовом коде)
// ... (код обхода МассивНачислений) ...

// Затем проверяем, не забыли ли мы часовую надбавку, которая есть в документе
НайдСтрЧНТС = НадбавкаЧасоваяТарифнаяСтавка(Док); // Функция получения значения из документа

Если НайдСтрЧНТС <> 0 Тогда
    // Проверяем, нет ли уже такой надбавки в нашей ТЗ
    ПараметрыОтбора = Новый Структура("НадбавкаНаименование", "Часовая надбавка к тарифной ставке");
    НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСтроки.Количество() = 0 Тогда
        // Если в ТЗ (из штатки) ее нет, добавляем принудительно из данных документа
        НоваяСтр = ТЗ.Добавить();
        НоваяСтр.НадбавкаНаименование = "Часовая надбавка к тарифной ставке";
        НоваяСтр.ПроцентНадбавки = "--";
        НоваяСтр.Сумма = НайдСтрЧНТС;
        НоваяСтр.Номер = 1;
    КонецЕсли;
КонецЕсли;

Важные рекомендации по работе с кодами начислений

Обратите внимание на использование конструкции СокрЛП(СтрокаМассива.Начисление.Код) = "ЧНТС". Это "жесткое кодирование" (hardcode), которое считается плохой практикой в разработке на платформе 1С. Рассмотрим, почему:

1. Изменение кода: Если пользователь изменит код начисления в справочнике (например, на "ЧНТС_01"), печатная форма перестанет работать.
2. Предопределенные элементы: Правильнее использовать поиск по ссылке или проверять принадлежность к определенной категории начислений.
3. Регистр букв: Функция СокрЛП не спасает от разного регистра или латинских символов, похожих на кириллицу.

Для повышения надежности рекомендуется использовать дополнительные реквизиты начислений или искать по ссылке, если начисление является предопределенным в системе.

Расчет зависимых надбавок (РК и СН)

Часто часовая надбавка должна входить в базу для расчета районного коэффициента (РК) и северной надбавки (СН) прямо в печатной форме. В представленном алгоритме мы видим ручной пересчет сумм:


СтрРк = ТЗ.Найти("Районный коэффициент");
Если СтрРк <> Неопределено Тогда
    // База для РК включает тарифную ставку и нашу найденную надбавку
    СтрРк.Сумма = (ТарСтавка + НайдСтрЧНТС) * 0.3;    
КонецЕсли;

Важный нюанс: при исправлении основного алгоритма получения надбавки обязательно убедитесь, что переменная НайдСтрЧНТС корректно заполнена до начала блока расчета РК и СН. В противном случае суммы налоговых доплат в приказе Т-1 также будут занижены.

Итоги

Мы проанализировали ситуацию и выяснили, что корень проблемы — в избыточном доверии данным штатного расписания при формировании индивидуального приказа. Для исправления ошибки необходимо:

  1. Убедиться, что в штатном расписании для всех позиций корректно указаны виды начислений (если используется типовой механизм).
  2. Если штатное расписание ведется нестрого, модифицировать код ПолучитьТаблицуНадбавок, чтобы он отдавал приоритет табличной части Оплата труда самого документа приема на работу.
  3. Проверить корректность расчета производных показателей (Районный коэффициент, Северная надбавка) с учетом добавленной часовой надбавки.

Использование Объекта документа вместо обращения к методам УправлениеШтатнымРасписанием в данном контексте является более надежным решением, гарантирующим 100% совпадение экранной формы документа с его печатной версией.

← На главную