Как программно изменить данные в позициях штатного расписания в 1С:ЗУП КОРП

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

В процессе сопровождения крупных корпоративных систем на базе 1С:Зарплата и управление персоналом КОРП часто возникает задача массового редактирования данных штатного расписания. Это может быть связано с изменением структуры подразделений, индексацией или, как в рассматриваемом случае, необходимостью массового заполнения трудовых функций для корректной отчетности (ЕФС-1). Ручное редактирование тысяч позиций нецелесообразно, поэтому разберем наиболее эффективные программные и полуавтоматические способы решения этой задачи.

Анализ настроек ведения штатного расписания

Прежде чем приступать к написанию кода, проанализируем настройки программы. В 1С:ЗУП работа со штатным расписанием может вестись в двух режимах:

  1. Без ведения истории изменений. В этом случае штатное расписание представляет собой простой иерархический справочник Справочник.ШтатноеРасписание. Данные можно менять напрямую в объекте справочника.
  2. С ведением истории изменений. Это стандартный режим для версии КОРП. Здесь прямое редактирование справочника заблокировано. Любые изменения должны фиксироваться документами Документ.УтверждениеШтатногоРасписания или Документ.ИзменениеШтатногоРасписания.

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

Программное создание документа Изменение штатного расписания

Для массового обновления данных, например, заполнения трудовых функций, нам необходимо создать документ ИзменениеШтатногоРасписания, заполнить его нужными позициями и внести изменения. Рассмотрим пошагово, как это реализовать в коде.

Рассмотрим пример кода, который создает документ, подтягивает в него текущие позиции и обновляет трудовую функцию по определенному условию:


НовыйДокумент = Документы.ИзменениеШтатногоРасписания.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Объект.Организация;
НовыйДокумент.ДатаВступленияВСилу = Объект.ДатаИзменений;

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

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

// Перед записью необходимо убедиться, что показатели ФОТ рассчитаны корректно
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Выясним причину, по которой простого заполнения табличной части недостаточно. В 1С:ЗУП КОРП штатное расписание тесно связано с регистрами расчета ФОТ. При программном изменении позиций крайне важно, чтобы в документе были заполнены не только основные реквизиты, но и табличные части с начислениями и надбавками, иначе после проведения документа сотрудники могут "потерять" свои плановые начисления. Использование метода ЗаполнитьПозиции() позволяет избежать этой проблемы, так как он копирует текущее состояние позиции со всеми показателями.

Использование встроенной обработки для заполнения трудовых функций

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

Доступ к ней можно получить через навигационную ссылку:

e1cib/app/Обработка.ЗаполнениеТрудовыхФункцийВПозицияхШтатногоРасписания

Разберем принцип её работы:

  1. Обработка анализирует справочник Должности.
  2. Если в справочнике должностей заполнена трудовая функция, программа предлагает перенести это значение в соответствующие позиции штатного расписания.
  3. При выполнении она автоматически формирует документы изменения штатного расписания, что гарантирует целостность данных и корректность истории.

Совет: Если вам нужно массово заполнить функции для 1000 позиций, иногда проще сначала программно обновить справочник Должности (где объектов значительно меньше), а затем запустить эту типовую обработку.

Специфика трудовых функций для разных должностей

Посмотрим на пример, когда одна и та же должность "Инженер" на разных участках требует разных трудовых функций. В этом случае программный алгоритм должен быть более сложным. Мы можем использовать дополнительные реквизиты позиций или анализировать подразделение.

Проанализируем пример логики сопоставления:


Функция ПолучитьНужнуюФункцию(Должность, Подразделение)
    // Если подразделение связано с производством
    Если Найти(Подразделение.Наименование, "Цех") > 0 Тогда
        Возврат Справочники.ТрудовыеФункции.НайтиПоНаименованию("Инженер-технолог");
    ИначеЕсли Найти(Подразделение.Наименование, "Склад") > 0 Тогда
        Возврат Справочники.ТрудовыеФункции.НайтиПоНаименованию("Инженер по учету");
    КонецЕсли;
    Возврат Должность.ТрудоваяФункция; // По умолчанию из должности
КонецФункции

Важные моменты при проведении изменений

При выполнении массовых изменений в 1С:ЗУП КОРП следует помнить о следующих нюансах:

Таким образом, для программного изменения данных в штатном расписании 1С:ЗУП КОРП наиболее корректным путем является автоматизация создания документов Изменение штатного расписания с предварительным заполнением данных через типовые методы объекта. Это обеспечит сохранность истории изменений и корректность последующих расчетов заработной платы.

← На главную