Где в 1С:ЗУП 3 хранятся данные о зарплате и окладах сотрудников и как их программно изменить?

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

При автоматизации кадрового учета и расчета заработной платы в программе «1С:Зарплата и управление персоналом 3» (ЗУП 3.1) разработчики часто сталкиваются с задачей массовой загрузки или изменения окладов сотрудников. На первый взгляд задача кажется простой: найти нужный регистр и записать туда данные. Однако внутренняя архитектура ЗУП 3 существенно сложнее, чем в старых версиях системы (например, ЗУП 2.5), и прямая запись в регистры здесь категорически противопоказана.

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

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

Архитектура хранения данных об окладах: базовые и интервальные регистры

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

Базовые периодические регистры сведений:

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

Системные интервальные и вспомогательные регистры:

Если ограничиться только базовыми регистрами, программа не сможет корректно рассчитать зарплату. Фирма «1С» внедрила в ЗУП 3 концепцию интервальных регистров, которые оптимизируют расчеты и исключают пересечение периодов действия начислений:

  1. ПлановыеНачисленияИнтервальный и ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный — это служебные регистры, данные в которых автоматически «разрезаются» по точным датам изменений. При расчете начислений и заполнении регламентированных отчетов система обращается именно к ним, а не к базовым регистрам напрямую.
  2. ПлановыйФОТ и ПлановыйФОТИтоги — регистры, в которых рассчитывается Фонд оплаты труда (ФОТ) сотрудника с учетом всех его плановых начислений. ФОТ критически важен, так как от него рассчитываются многие зависимые показатели и надбавки (например, районный коэффициент, северная надбавка, доплата за ночные часы).
  3. ТекущаяТарифнаяСтавкаСотрудников — вспомогательный регистр, хранящий актуальный размер тарифной ставки (оклада) для оперативного доступа системы при кадровых переводах и расчете среднего заработка.

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

Почему ручная запись в регистры — это «гиблое дело»?

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

Этот механизм выполняет фоновые процедуры:

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

Как правильно программно заносить оклады сотрудников

Единственный надежный и методологически верный способ программного занесения окладов — это создание и проведение специализированных документов через встроенный язык 1С. Система сама сформирует правильные движения по всем нужным регистрам.

В зависимости от бизнес-задачи рассмотрим три сценария реализации.

Сценарий 1. Ввод начальных данных при переносе из другой системы

Если мы запускаем базу с нуля и нам нужно загрузить список сотрудников с их текущими окладами на дату начала учета, идеальным решением будет программное создание документа НачальнаяШтатнаяРасстановка.

Рассмотрим пример кода, реализующий создание такого документа:


// Создаем новый документ начальной штатной расстановки
ДокРасстановка = Документы.НачальнаяШтатнаяРасстановка.СоздатьДокумент();
ДокРасстановка.Дата = ТекущаяДата();
ДокРасстановка.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701000000");
ДокРасстановка.Месяц = НачалоМесяца(ТекущаяДата());

// Заполняем табличную часть сотрудниками и окладами
НоваяСтрока = ДокРасстановка.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = Справочники.Сотрудники.НайтиПоКоду("000001");
НоваяСтрока.Подразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Администрация");
НоваяСтрока.Должность = Справочники.Должности.НайтиПоНаименованию("Директор");
НоваяСтрока.ДатаПриема = Дата(2023, 01, 01);
НоваяСтрока.ГрафикРаботы = Справочники.ГрафикиРаботыСотрудников.НайтиПоНаименованию("Пятидневка");

// Заполняем показатели (в данном случае — Оклад)
СтрокаПоказателя = ДокРасстановка.Показатели.Добавить();
СтрокаПоказателя.ИдентификаторСтрокиСотрудника = НоваяСтрока.ИдентификаторСтрокиСотрудника;
СтрокаПоказателя.Показатель = Справочники.ПоказателиРасчетаЗарплаты.Оклад;
СтрокаПоказателя.Значение = 120000; // Наш оклад

// Записываем и проводим документ
Попытка
    ДокРасстановка.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Документ успешно проведен!");
Исключение
    Сообщить("Ошибка проведения: " + ОписаниеОшибки());
КонецПопытки;

Сценарий 2. Массовое изменение окладов в работающей базе

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

Разберем пример кода для реализации этой задачи:


// Создаем документ изменения плановых начислений
ДокИзменение = Документы.ИзменениеПлановыхНачислений.СоздатьДокумент();
ДокИзменение.Дата = ТекущаяДата();
ДокИзменение.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Компания");
ДокИзменение.ДатаИзменения = Дата(2023, 10, 01); // Дата, с которой действуют новые оклады

// Добавляем сотрудника в документ
СтрокаСотрудник = ДокИзменение.Сотрудники.Добавить();
СтрокаСотрудник.Сотрудник = Справочники.Сотрудники.НайтиПоКоду("000052");
СтрокаСотрудник.ФизическоеЛицо = СтрокаСотрудник.Сотрудник.ФизическоеЛицо;

// Прописываем новое значение оклада
СтрокаПоказатель = ДокИзменение.Показатели.Добавить();
СтрокаПоказатель.Сотрудник = СтрокаСотрудник.Сотрудник;
СтрокаПоказатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.Оклад;
СтрокаПоказатель.Значение = 85000; // Новый оклад

// Автоматически пересчитываем ФОТ в документе штатными процедурами
// (ЗУП сама заполнит недостающие реквизиты при проведении)
Попытка
    ДокИзменение.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Оклады успешно обновлены документом!");
Исключение
    Сообщить("Ошибка при проведении изменений: " + ОписаниеОшибки());
КонецПопытки;

Как правильно читать оклады сотрудников программно

Аналогично записи, напрямую обращаться запросом к регистрам сведений для *получения* оклада на дату крайне не рекомендуется. Если в будущем фирма «1С» оптимизирует структуру хранения, ваш запрос перестанет работать.

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


// Подготовим параметры для запроса данных
СотрудникиСписок = Новый Массив;
СотрудникиСписок.Добавить(Справочники.Сотрудники.НайтиПоКоду("000001"));

// Указываем, какие именно данные нам нужны
ПоляДанных = Новый Массив;
ПоляДанных.Добавить("ТарифнаяСтавка"); // Это и есть оклад/тарифная ставка
ПоляДанных.Добавить("ФОТ");

ДатаСреза = ТекущаяДата();

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

// Считываем результат
Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    Сообщить("У сотрудника тарифная ставка: " + СтрокаДанных.ТарифнаяСтавка);
    Сообщить("Текущий плановый ФОТ: " + СтрокаДанных.ФОТ);
КонецЕсли;

Если же вам необходимо получить детальный список всех назначенных плановых начислений сотрудника на конкретную дату (например, оклад, премию и северную надбавку отдельными строками), используйте функцию КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(). Она вернет вам полную таблицу плановых начислений с детализацией показателей.

Резюме

Мы подробно проанализировали структуру хранения информации о заработной плате в 1С:ЗУП 3. Давайте закрепим основные правила работы с этими данными:

  1. Никогда не пишите данные напрямую в регистры сведений типа ПлановыеНачисления или ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
  2. Для ввода исторических данных используйте программное создание документа НачальнаяШтатнаяРасстановка.
  3. Для текущих изменений в работающей базе создавайте документы ИзменениеПлановыхНачислений или ИзменениеОплатыТруда.
  4. Для чтения актуальных окладов используйте проверенные временем функции общего модуля КадровыйУчет, которые гарантируют стабильную работу вашего кода после любых обновлений системы.
← На главную