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

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

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

Анализ классической ошибки в запросе к срезу последних

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


Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПлановыеНачисленияСрезПоследних.Размер КАК Размер,
    |    ПлановыеНачисленияСрезПоследних.Начисление КАК Начисление
    |ИЗ
    |    РегистрСведений.ПлановыеНачисления.СрезПоследних КАК ПлановыеНачисленияСрезПоследних
    |ГДЕ
    |    ПлановыеНачисленияСрезПоследних.Сотрудник = &Сотрудник";

Почему такой подход может не работать или работать крайне медленно? Основная причина кроется в механизме работы виртуальных таблиц 1С. Когда мы используем секцию ГДЕ, система сначала выбирает весь срез последних по всем сотрудникам организации в памяти, и только потом накладывает фильтр. Если в базе десятки тысяч записей, запрос может «отвалиться» по таймауту или вернуть пустой результат, если дата среза (по умолчанию — текущий момент) не совпадает с периодом действия начислений.

Правильный подход заключается в передаче условий непосредственно в параметры виртуальной таблицы. Это позволяет платформе оптимизировать запрос на уровне СУБД. Перепишем запрос правильно:


Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПлановыеНачисленияСрезПоследних.Размер,
    |    ПлановыеНачисленияСрезПоследних.Начисление
    |ИЗ
    |    РегистрСведений.ПлановыеНачисления.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК ПлановыеНачисленияСрезПоследних";

Здесь параметр &Период крайне важен. Если вы делаете печатную форму документа, дата среза должна соответствовать дате документа. Однако помните о «секундной» проблеме: если запись в регистр делается тем же документом, для включения этой записи в срез иногда требуется использовать объект Граница.

Использование типовых функций ЗУП 3.1

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

Разберем использование функций модуля КадровыйУчетРасширенный. Для получения данных по одному сотруднику используем следующий код:


// Получаем актуальные начисления на дату документа
ТекущиеДанныеОплаты = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, ДатаДокумента);

// Перебираем результат
Для Каждого СтрокаНачисления Из ТекущиеДанныеОплаты Цикл
    Сообщить("Начисление: " + СтрокаНачисления.Начисление + " Размер: " + СтрокаНачисления.Размер);
КонецЦикла;

Если же мы работаем с документом «Кадровый перевод списком», эффективнее получить данные сразу по всему массиву сотрудников. Это значительно снизит количество обращений к базе данных:


// Подготовим массив ссылок на сотрудников
МассивСотрудников = СписокСотрудниковДокумента.ВыгрузитьКолонку("Сотрудник");

// Получаем таблицу всех начислений для списка
ТаблицаНачислений = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудников(МассивСотрудников, ДатаДокумента);

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

Особенности получения данных именно из документа

Важно понимать разницу: нужны ли вам действующие начисления сотрудника вообще или те начисления, которые установил именно этот документ (например, конкретный «Кадровый перевод»).

Если вы используете СрезПоследних или типовую функцию ТекущиеНачисленияСотрудника, вы получите итоговую картину. Например, если у сотрудника был «Оклад», а кадровым переводом ему добавили «Надбавку», функция вернет обе строки. Но если в печатной форме нужно отразить только изменения, внесенные данным документом, стратегия должна быть иной.

В этом случае проанализируем запрос к физической таблице регистра сведений по регистратору:


Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПлановыеНачисления.Начисление,
    |    ПлановыеНачисления.Размер,
    |    ПлановыеНачисления.Действие
    |ИЗ
    |    РегистрСведений.ПлановыеНачисления КАК ПлановыеНачисления
    |ГДЕ
    |    ПлановыеНачисления.Регистратор = &Ссылка";

Этот способ незаменим, когда в печатной форме нужно вывести колонки «Было» и «Стало» или выделить только новые измененные показатели.

Работа с показателями и ФОТ

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

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

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

Рекомендации по интеграции в менеджер печати

При создании печатной формы для документа «Кадровый перевод списком», наиболее грамотным решением будет изучение процедуры Печать в менеджере самого документа. Проанализируем, как это реализовано в типовом коде:

Обычно там уже формируются временные таблицы ВТКадровыеДанныеСотрудников и ВТНачисленияСотрудников. Чтобы не изобретать велосипед, попробуйте внедрить свой код в процедуру подготовки данных. Это позволит использовать уже отобранные системой данные и избежать дублирующих запросов к регистру ПлановыеНачисления. В качестве готового примера реализации печатной формы подойдёт внешняя печатная форма дополнительного соглашения для документа «Кадровый перевод списком».

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

← На главную