При формировании кадровых приказов, таких как форма Т-1 (приказ о приеме на работу), разработчики часто сталкиваются с ситуацией, когда в печатной форме данные отображаются некорректно: например, у одного сотрудника часовая надбавка выводится, а у другого — нет, хотя в самом документе все заполнено верно. Рассмотрим детально, почему это происходит, как проанализировать код формирования ТЗ (таблицы значений) и каким образом устранить проблему через изменение логики получения данных.
Проанализируем типовую ситуацию. В коде формирования печатной формы используется вспомогательная функция ПолучитьТаблицуНадбавок(Док). Основная задача этой функции — собрать все доплаты и надбавки, положенные сотруднику, и вернуть их в виде таблицы для вывода в макет. Однако, как показывает практика, данные часто подтягиваются не из табличной части самого документа Док, а из регистра сведений штатного расписания.
Разберем фрагмент кода, который вызывает затруднения:
ДанныеПозиции = УправлениеШтатнымРасписанием.ДанныеПозицииШтатногоРасписания(ДолжностьПоШтатномуРасписанию, ДатаСобытия);
МассивНачислений = ДанныеПозиции.Начисления;
Выясним причину ошибки: функция ДанныеПозицииШтатногоРасписания обращается к справочнику "Штатное расписание". Если для конкретной позиции (должности) в штатном расписании надбавка не указана как обязательная или была добавлена в документ приема вручную (сверх того, что предусмотрено "штаткой"), переменная МассивНачислений не будет содержать нужную строку. В результате цикл обхода начислений просто пропускает заполнение соответствующих полей в итоговой таблице.
Для понимания того, на каком этапе теряются данные, пройдем по шагам процесса формирования таблицы начислений:
ИдентификаторСтрокиВидаРасчета, НадбавкаНаименование, ПроцентНадбавки и Сумма.МассивНачислений он не попадет.
Если СокрЛП(СтрокаМассива.Начисление.Код) = "ЧНТС" тогда
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.НадбавкаНаименование = СтрокаМассива.Начисление.Наименование;
СтрокаТЗ.Сумма = НайдСтрЧНТС; // Значение из функции, ищущей в документе
КонецЕсли;
Здесь кроется логическая ловушка: сумма может искаться в документе (через вызов НадбавкаЧасоваяТарифнаяСтавка(Док)), но сама итерация цикла зависит от наличия этого вида расчета в штатном расписании. Если штатное расписание "пустое" в части этой надбавки, программа даже не зайдет внутрь условия Если.
Проанализируем ситуацию, когда у части сотрудников данные есть, а у части — нет. Это связано с тем, как велось штатное расписание в информационной базе:
ДанныеПозицииШтатногоРасписания не видит эту надбавку, цикл по массиву проходит мимо.Чтобы печатная форма всегда соответствовала фактическим данным документа (ведь приказ Т-1 фиксирует условия трудового договора конкретного человека, а не общие правила штатной позиции), необходимо изменить подход. Вместо анализа штатного расписания следует анализировать табличную часть ОплатаТруда самого документа или использовать данные регистров плановых начислений сотрудника.
Рассмотрим вариант обхода проблемы, предложенный в ходе обсуждения. Мы можем дополнить таблицу ТЗ данными напрямую из документа, минуя проверку массива штатного расписания. Пример реализации логики:
// Сначала получаем данные из штатки (как в типовом коде)
// ... (код обхода МассивНачислений) ...
// Затем проверяем, не забыли ли мы часовую надбавку, которая есть в документе
НайдСтрЧНТС = НадбавкаЧасоваяТарифнаяСтавка(Док); // Функция получения значения из документа
Если НайдСтрЧНТС <> 0 Тогда
// Проверяем, нет ли уже такой надбавки в нашей ТЗ
ПараметрыОтбора = Новый Структура("НадбавкаНаименование", "Часовая надбавка к тарифной ставке");
НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
// Если в ТЗ (из штатки) ее нет, добавляем принудительно из данных документа
НоваяСтр = ТЗ.Добавить();
НоваяСтр.НадбавкаНаименование = "Часовая надбавка к тарифной ставке";
НоваяСтр.ПроцентНадбавки = "--";
НоваяСтр.Сумма = НайдСтрЧНТС;
НоваяСтр.Номер = 1;
КонецЕсли;
КонецЕсли;
Обратите внимание на использование конструкции СокрЛП(СтрокаМассива.Начисление.Код) = "ЧНТС". Это "жесткое кодирование" (hardcode), которое считается плохой практикой в разработке на платформе 1С. Рассмотрим, почему:
1. Изменение кода: Если пользователь изменит код начисления в справочнике (например, на "ЧНТС_01"), печатная форма перестанет работать.
2. Предопределенные элементы: Правильнее использовать поиск по ссылке или проверять принадлежность к определенной категории начислений.
3. Регистр букв: Функция СокрЛП не спасает от разного регистра или латинских символов, похожих на кириллицу.
Для повышения надежности рекомендуется использовать дополнительные реквизиты начислений или искать по ссылке, если начисление является предопределенным в системе.
Часто часовая надбавка должна входить в базу для расчета районного коэффициента (РК) и северной надбавки (СН) прямо в печатной форме. В представленном алгоритме мы видим ручной пересчет сумм:
СтрРк = ТЗ.Найти("Районный коэффициент");
Если СтрРк <> Неопределено Тогда
// База для РК включает тарифную ставку и нашу найденную надбавку
СтрРк.Сумма = (ТарСтавка + НайдСтрЧНТС) * 0.3;
КонецЕсли;
Важный нюанс: при исправлении основного алгоритма получения надбавки обязательно убедитесь, что переменная НайдСтрЧНТС корректно заполнена до начала блока расчета РК и СН. В противном случае суммы налоговых доплат в приказе Т-1 также будут занижены.
Мы проанализировали ситуацию и выяснили, что корень проблемы — в избыточном доверии данным штатного расписания при формировании индивидуального приказа. Для исправления ошибки необходимо:
ПолучитьТаблицуНадбавок, чтобы он отдавал приоритет табличной части Оплата труда самого документа приема на работу.Использование Объекта документа вместо обращения к методам УправлениеШтатнымРасписанием в данном контексте является более надежным решением, гарантирующим 100% совпадение экранной формы документа с его печатной версией.