Как запросом получить текущие показатели расчета зарплаты по сотруднику в 1С ЗУП 3.1?

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

При работе с системой 1С ЗУП 3.1 часто возникает задача получения текущих, то есть актуальных на определенную дату, показателей расчета зарплаты по сотруднику с помощью запроса. Стандартные регистры сведений, такие как «ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный», хранят полную историю изменений, что может приводить к выдаче устаревших данных наряду с действующими. Например, если сотрудник перешел с тарифной ставки на оклад, запрос может вернуть оба показателя, хотя актуальным является только оклад.

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

Понимание работы интервальных регистров

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

Рассмотрим пример: если сотруднику сначала была установлена тарифная ставка, а затем оклад, но при установке оклада старая тарифная ставка не была “закрыта” (то есть, ее период действия не был корректно ограничен), то она останется “действующей” до “бесконечности” (например, до 31.12.3999). В результате, запрос, который просто выбирает записи по сотруднику, вернет оба показателя.

Для корректного решения данной проблемы необходимо учитывать следующие аспекты:

  1. Ручная корректировка: В некоторых случаях, если проблема единичная, можно вручную скорректировать дату окончания в интервальном регистре для устаревшей записи, указав дату, предшествующую началу действия нового показателя. Однако для большого количества сотрудников это непрактично.
  2. Настройки начисления: В настройках начисления (ПланВидовРасчета.Начисления) можно указать поведение показателя при отмене начисления. Если установлено «Очищать», то значение показателя обнулится при изменении или отмене начисления, что поможет избежать накопления неактуальных данных.
  3. Правильное формирование запроса: Самый надежный способ – это корректно сформировать запрос, который будет выбирать только те записи, интервалы действия которых актуальны на заданную дату.

Получение текущих показателей: комплексный запрос

Для получения актуальных показателей на определенную дату мы можем использовать сложный запрос, который имитирует получение «среза последних» для интервальных регистров и объединяет данные из нескольких источников. Этот подход позволяет точно определить действующие начисления и показатели.

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

  1. Определение целевого периода и сотрудника: Сначала мы создаем временную таблицу, в которой будут указаны интересующий нас период и сотрудник.
  2. 
    ВЫБРАТЬ
        &период КАК период,
        Сотрудники.Ссылка КАК Сотрудник
    ПОМЕСТИТЬ ВТПериодыПлановыхНачислений
    ИЗ
        Справочник.Сотрудники КАК Сотрудники
    ГДЕ
        Сотрудники.Ссылка = &Сотрудник
    
  3. Получение «среза последних» плановых начислений: Далее, мы формируем временную таблицу ВТПлановыеНачисленияСотрудниковСрезПоследних, используя регистр РегистрСведений.ПлановыеНачисленияИнтервальный. Ключевым моментом здесь является условие соединения, которое позволяет получить записи, действующие на конец заданного периода.
  4. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ВЫБОР
            КОГДА РегистрСведений.ПериодЗаписи = РегистрСведений.ДатаНачала
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ КАК ЭтоВозвратноеСобытие,
        РегистрСведений.ДатаОкончания КАК ДатаОкончания,
        РегистрСведений.ДатаНачала КАК ДатаНачала,
        РегистрСведений.Год КАК Год,
        РегистрСведений.ПериодПредыдущейЗаписи КАК ПериодПредыдущейЗаписи,
        РегистрСведений.Сотрудник КАК Сотрудник,
        РегистрСведений.Начисление КАК Начисление,
        РегистрСведений.ФизическоеЛицо КАК ФизическоеЛицо,
        РегистрСведений.ДокументОснование КАК ДокументОснование,
        РегистрСведений.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
        ИзмеренияДаты.период КАК Период,
        РегистрСведений.ДействуетДо КАК ПериодВозвратногоСобытия,
        РегистрСведений.РегистраторСобытия КАК Регистратор,
        РегистрСведений.РегистраторСобытия КАК РегистраторСобытия,
        РегистрСведений.РегистраторЗаписи КАК РегистраторЗаписи,
        РегистрСведений.ПериодЗаписи КАК ПериодЗаписи,
        РегистрСведений.ПустойИнтервал КАК ПустойИнтервал,
        РегистрСведений.Используется КАК Используется,
        РегистрСведений.Размер КАК Размер,
        РегистрСведений.ПересчетНеТребуется КАК ПересчетНеТребуется,
        РегистрСведений.ВторичнаяЗапись КАК ВторичнаяЗапись
    ПОМЕСТИТЬ ВТПлановыеНачисленияСотрудниковСрезПоследних
    ИЗ
        ВТПериодыПлановыхНачислений КАК ИзмеренияДаты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисленияИнтервальный КАК РегистрСведений
            ПО (РегистрСведений.ДатаНачала = ВЫБОР
                        КОГДА ИзмеренияДаты.период = ДАТАВРЕМЯ(1, 1, 1)
                            ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
                        ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.период, ДЕНЬ)
                    КОНЕЦ)
                И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)
    ИНДЕКСИРОВАТЬ ПО
        Сотрудник
    

    Обратите внимание на условие (РегистрСведений.ДатаНачала = ВЫБОР КОГДА ИзмеренияДаты.период = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59) ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.период, ДЕНЬ) КОНЕЦ). Это условие позволяет выбирать записи, период действия которых начинается ровно в конце дня заданного периода, что эффективно работает как фильтр для получения актуальных данных.

  5. Получение «среза последних» значений показателей: Аналогично, создаем временную таблицу ВТЗначенияПоказателейСотрудниковСрезПоследних для регистра РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный.
  6. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ВЫБОР
            КОГДА РегистрСведений.ПериодЗаписи = РегистрСведений.ДатаНачала
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ КАК ЭтоВозвратноеСобытие,
        РегистрСведений.ДатаОкончания КАК ДатаОкончания,
        РегистрСведений.ДатаНачала КАК ДатаНачала,
        РегистрСведений.Год КАК Год,
        РегистрСведений.ПериодПредыдущейЗаписи КАК ПериодПредыдущейЗаписи,
        РегистрСведений.Сотрудник КАК Сотрудник,
        РегистрСведений.Организация КАК Организация,
        РегистрСведений.ФизическоеЛицо КАК ФизическоеЛицо,
        РегистрСведений.Показатель КАК Показатель,
        РегистрСведений.ДокументОснование КАК ДокументОснование,
        ИзмеренияДаты.период КАК Период,
        РегистрСведений.ДействуетДо КАК ПериодВозвратногоСобытия,
        РегистрСведений.РегистраторСобытия КАК Регистратор,
        РегистрСведений.РегистраторСобытия КАК РегистраторСобытия,
        РегистрСведений.РегистраторЗаписи КАК РегистраторЗаписи,
        РегистрСведений.ПериодЗаписи КАК ПериодЗаписи,
        РегистрСведений.ПустойИнтервал КАК ПустойИнтервал,
        РегистрСведений.Значение КАК Значение
    ПОМЕСТИТЬ ВТЗначенияПоказателейСотрудниковСрезПоследних
    ИЗ
        ВТПериодыПлановыхНачислений КАК ИзмеренияДаты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный КАК РегистрСведений
            ПО (РегистрСведений.ДатаНачала = ВЫБОР
                        КОГДА ИзмеренияДаты.период = ДАТАВРЕМЯ(1, 1, 1)
                            ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
                        ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.период, ДЕНЬ)
                    КОНЕЦ)
                И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)
    ИНДЕКСИРОВАТЬ ПО
        Сотрудник
    
  7. Получение «среза последних» планового ФОТ: Для полноты картины, если необходимо, можно получить данные из регистра РегистрСведений.ПлановыйФОТ.
  8. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        РегистрСведений.Сотрудник КАК Сотрудник,
        РегистрСведений.Начисление КАК Начисление,
        РегистрСведений.ДокументОснование КАК ДокументОснование,
        РегистрСведений.ФизическоеЛицо КАК ФизическоеЛицо,
        РегистрСведений.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
        ИзмеренияДаты.период КАК Период,
        РегистрСведений.РегистраторСобытия КАК Регистратор,
        РегистрСведений.Период КАК ПериодЗаписи,
        РегистрСведений.ВкладВФОТ КАК ВкладВФОТ,
        РегистрСведений.Используется КАК Используется,
        РегистрСведений.ПересчетНеТребуется КАК ПересчетНеТребуется,
        РегистрСведений.ВторичнаяЗапись КАК ВторичнаяЗапись,
        РегистрСведений.РегистраторСобытия КАК РегистраторСобытия,
        РегистрСведений.ПериодПредыдущейЗаписи КАК ПериодПредыдущейЗаписи
    ПОМЕСТИТЬ ВТПлановыйФОТСотрудниковСрезПоследних
    ИЗ
        ВТПериодыПлановыхНачислений КАК ИзмеренияДаты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыйФОТ КАК РегистрСведений
            ПО (РегистрСведений.Период = ВЫБОР
                        КОГДА ИзмеренияДаты.период = ДАТАВРЕМЯ(1, 1, 1)
                            ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
                        ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.период, ДЕНЬ)
                    КОНЕЦ)
                И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)
    ИНДЕКСИРОВАТЬ ПО
        Сотрудник
    
  9. Выбор последних периодов для значений показателей: Поскольку регистр ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный может содержать несколько записей для одного показателя за один и тот же "срез", нам нужно выбрать самую последнюю запись, используя МАКСИМУМ(ПериодЗаписи).
  10. 
    ВЫБРАТЬ
        ЗначенияПоказателейСотрудниковСрезПоследних.Период КАК Период,
        МАКСИМУМ(ЗначенияПоказателейСотрудниковСрезПоследних.ПериодЗаписи) КАК ПериодЗаписи,
        ЗначенияПоказателейСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,
        ЗначенияПоказателейСотрудниковСрезПоследних.Показатель КАК Показатель,
        ЗначенияПоказателейСотрудниковСрезПоследних.ДокументОснование КАК ДокументОснование
    ПОМЕСТИТЬ ВТЗначенияПоказателейСотрудниковСрезПоследнихПоследниеПериоды
    ИЗ
        ВТЗначенияПоказателейСотрудниковСрезПоследних КАК ЗначенияПоказателейСотрудниковСрезПоследних
    СГРУППИРОВАТЬ ПО
        ЗначенияПоказателейСотрудниковСрезПоследних.Период,
        ЗначенияПоказателейСотрудниковСрезПоследних.Сотрудник,
        ЗначенияПоказателейСотрудниковСрезПоследних.ФизическоеЛицо,
        ЗначенияПоказателейСотрудниковСрезПоследних.Показатель,
        ЗначенияПоказателейСотрудниковСрезПоследних.ДокументОснование
    
  11. Предварительная выборка плановых начислений: Объединяем полученные данные о плановых начислениях и плановом ФОТ, а также информацию из ПланВидовРасчета.Начисления для определения основного показателя и вида времени.
  12. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ПлановыеНачисленияСрезПоследних.Период КАК Период,
        ПлановыеНачисленияСрезПоследних.ПериодЗаписи КАК ПериодЗаписи,
        ПлановыеНачисленияСрезПоследних.Регистратор КАК Регистратор,
        ПлановыеНачисленияСрезПоследних.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
        ПлановыеНачисленияСрезПоследних.Сотрудник КАК Сотрудник,
        ПлановыеНачисленияСрезПоследних.Начисление КАК Начисление,
        ПлановыеНачисленияСрезПоследних.ДокументОснование КАК ДокументОснование,
        ВЫБОР
            КОГДА ПлановыйФОТСрезПоследних.ВкладВФОТ ЕСТЬ NULL
                ТОГДА ПлановыеНачисленияСрезПоследних.Размер
            ИНАЧЕ ПлановыйФОТСрезПоследних.ВкладВФОТ
        КОНЕЦ КАК Размер,
        Начисления.РеквизитДопУпорядочивания КАК Порядок,
        ЕСТЬNULL(НачисленияПоказатели.Показатель, ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)) КАК ОсновнойПоказатель,
        Начисления.ВидВремени КАК ВидВремени
    ПОМЕСТИТЬ ВТПлановыеНачисленияСотрудниковПредварительно
    ИЗ
        ВТПлановыеНачисленияСотрудниковСрезПоследних КАК ПлановыеНачисленияСрезПоследних
            ЛЕВОЕ СОЕДИНЕНИЕ ВТПлановыйФОТСотрудниковСрезПоследних КАК ПлановыйФОТСрезПоследних
            ПО ПлановыеНачисленияСрезПоследних.Период = ПлановыйФОТСрезПоследних.Период
                И ПлановыеНачисленияСрезПоследних.Сотрудник = ПлановыйФОТСрезПоследних.Сотрудник
                И ПлановыеНачисленияСрезПоследних.Начисление = ПлановыйФОТСрезПоследних.Начисление
                И ПлановыеНачисленияСрезПоследних.ДокументОснование = ПлановыйФОТСрезПоследних.ДокументОснование
            ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления КАК Начисления
                ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления.Показатели КАК НачисленияПоказатели
                ПО Начисления.Ссылка = НачисленияПоказатели.Ссылка
                    И (НачисленияПоказатели.ОсновнойПоказатель)
            ПО ПлановыеНачисленияСрезПоследних.Начисление = Начисления.Ссылка
    ГДЕ
        ПлановыеНачисленияСрезПоследних.Используется
    ИНДЕКСИРОВАТЬ ПО
        Период,
        Сотрудник,
        Порядок,
        Начисление
    
  13. Определение порядка основных начислений: Если у сотрудника несколько начислений, относящихся к отработанному времени, мы определяем самое "главное" (с минимальным порядком).
  14. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ПлановыеНачисленияСотрудников.Период КАК Период,
        ПлановыеНачисленияСотрудников.Сотрудник КАК Сотрудник,
        МИНИМУМ(ПлановыеНачисленияСотрудников.Порядок) КАК Порядок
    ПОМЕСТИТЬ ВТПорядокОсновныхНачислений
    ИЗ
        ВТПлановыеНачисленияСотрудниковПредварительно КАК ПлановыеНачисленияСотрудников
    ГДЕ
        ПлановыеНачисленияСотрудников.ВидВремени В (ЗНАЧЕНИЕ(Перечисление.ВидыРабочегоВремениСотрудников.ОтработанноеВПределахНормы), ЗНАЧЕНИЕ(Перечисление.ВидыРабочегоВремениСотрудников.ЧасовоеОтработанноеВПределахНормы))
    СГРУППИРОВАТЬ ПО
        ПлановыеНачисленияСотрудников.Период,
        ПлановыеНачисленияСотрудников.Сотрудник
    ИНДЕКСИРОВАТЬ ПО
        Период,
        Сотрудник,
        Порядок
    
  15. Выбор основных начислений: На основе определенного порядка, выбираем сами основные начисления.
  16. 
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ПлановыеНачисленияСотрудников.Период КАК Период,
        ПлановыеНачисленияСотрудников.Сотрудник КАК Сотрудник,
        МИНИМУМ(ПлановыеНачисленияСотрудников.Начисление) КАК Начисление,
        ПорядокОсновногоНачисления.Порядок КАК Порядок
    ПОМЕСТИТЬ ВТОсновныеНачисленияСотрудников
    ИЗ
        ВТПлановыеНачисленияСотрудниковПредварительно КАК ПлановыеНачисленияСотрудников
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПорядокОсновныхНачислений КАК ПорядокОсновногоНачисления
            ПО ПлановыеНачисленияСотрудников.Период = ПорядокОсновногоНачисления.Период
                И ПлановыеНачисленияСотрудников.Сотрудник = ПорядокОсновногоНачисления.Сотрудник
                И ПлановыеНачисленияСотрудников.Порядок = ПорядокОсновногоНачисления.Порядок
    ГДЕ
        ПлановыеНачисленияСотрудников.ВидВремени В (ЗНАЧЕНИЕ(Перечисление.ВидыРабочегоВремениСотрудников.ОтработанноеВПределахНормы), ЗНАЧЕНИЕ(Перечисление.ВидыРабочегоВремениСотрудников.ЧасовоеОтработанноеВПределахНормы))
    СГРУППИРОВАТЬ ПО
        ПлановыеНачисленияСотрудников.Период,
        ПлановыеНачисленияСотрудников.Сотрудник,
        ПорядокОсновногоНачисления.Порядок
    ИНДЕКСИРОВАТЬ ПО
        Период,
        Сотрудник,
        Порядок,
        Начисление
    
  17. Итоговая выборка: Наконец, объединяем все полученные временные таблицы для формирования окончательного набора данных, содержащего действующие плановые начисления, их размеры, основные показатели и их значения.
  18. 
    ВЫБРАТЬ
        ПлановыеНачисленияСотрудников.Период КАК Период,
        ПлановыеНачисленияСотрудников.ПериодЗаписи КАК ПериодЗаписи,
        ПлановыеНачисленияСотрудников.Регистратор КАК Регистратор,
        ПлановыеНачисленияСотрудников.Сотрудник КАК Сотрудник,
        ПлановыеНачисленияСотрудников.Начисление КАК Начисление,
        ПлановыеНачисленияСотрудников.ДокументОснование КАК ДокументОснование,
        ПлановыеНачисленияСотрудников.Размер КАК Размер,
        ПлановыеНачисленияСотрудников.ОсновнойПоказатель КАК ОсновнойПоказатель,
        ЗначенияПоказателей.Значение КАК ЗначениеОсновногоПоказателя,
        ВЫБОР
            КОГДА ОсновныеНачисленияСотрудников.Начисление ЕСТЬ NULL
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ КАК НачислениеТарифнойСтавки
    ПОМЕСТИТЬ ПредставленияПлановыеНачисленияСотрудников
    ИЗ
        ВТПлановыеНачисленияСотрудниковПредварительно КАК ПлановыеНачисленияСотрудников
            ЛЕВОЕ СОЕДИНЕНИЕ ВТОсновныеНачисленияСотрудников КАК ОсновныеНачисленияСотрудников
            ПО ПлановыеНачисленияСотрудников.Период = ОсновныеНачисленияСотрудников.Период
                И ПлановыеНачисленияСотрудников.Сотрудник = ОсновныеНачисленияСотрудников.Сотрудник
                И ПлановыеНачисленияСотрудников.Начисление = ОсновныеНачисленияСотрудников.Начисление
                И ПлановыеНачисленияСотрудников.Порядок = ОсновныеНачисленияСотрудников.Порядок
            ЛЕВОЕ СОЕДИНЕНИЕ ВТЗначенияПоказателейСотрудниковСрезПоследних КАК ЗначенияПоказателей
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗначенияПоказателейСотрудниковСрезПоследнихПоследниеПериоды КАК ЗначенияПоказателейПоследниеПериоды
                ПО ЗначенияПоказателей.Период = ЗначенияПоказателейПоследниеПериоды.Период
                    И ЗначенияПоказателей.ПериодЗаписи = ЗначенияПоказателейПоследниеПериоды.ПериодЗаписи
                    И ЗначенияПоказателей.Сотрудник = ЗначенияПоказателейПоследниеПериоды.Сотрудник
                    И ЗначенияПоказателей.Показатель = ЗначенияПоказателейПоследниеПериоды.Показатель
                    И ЗначенияПоказателей.ДокументОснование = ЗначенияПоказателейПоследниеПериоды.ДокументОснование
            ПО ПлановыеНачисленияСотрудников.Период = ЗначенияПоказателей.Период
                И ПлановыеНачисленияСотрудников.Сотрудник = ЗначенияПоказателей.Сотрудник
                И ПлановыеНачисленияСотрудников.ДокументОснование = ЗначенияПоказателей.ДокументОснование
                И ПлановыеНачисленияСотрудников.ОсновнойПоказатель = ЗначенияПоказателей.Показатель
                И ПлановыеНачисленияСотрудников.ГоловнаяОрганизация = ЗначенияПоказателей.Организация.ГоловнаяОрганизация
    
  19. Очистка временных таблиц: В конце запроса обязательно уничтожаем все созданные временные таблицы для освобождения ресурсов.
  20. 
    УНИЧТОЖИТЬ ВТПлановыеНачисленияСотрудниковСрезПоследних ;
    УНИЧТОЖИТЬ ВТЗначенияПоказателейСотрудниковСрезПоследних ;
    УНИЧТОЖИТЬ ВТПлановыйФОТСотрудниковСрезПоследних ;
    УНИЧТОЖИТЬ ВТПлановыеНачисленияСотрудниковПредварительно ;
    УНИЧТОЖИТЬ ВТПорядокОсновныхНачислений ;
    УНИЧТОЖИТЬ ВТОсновныеНачисленияСотрудников ;
    УНИЧТОЖИТЬ ВТЗначенияПоказателейСотрудниковСрезПоследнихПоследниеПериоды
    

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

Повышение надежности запросов с помощью ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц()

Разработчики 1С постоянно оптимизируют и изменяют внутреннюю структуру регистров. Прямые запросы к регистрам могут перестать работать после обновления конфигурации. Для создания "долговечных" и стабильных запросов в 1С ЗУП 3.1 рекомендуется использовать механизм представлений виртуальных таблиц и служебную функцию ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц().

Рассмотрим, как это работает:

  1. Создание шаблона запроса: Вы начинаете с создания запроса, который использует не реальные регистры, а их представления или пустые временные таблицы, имитирующие структуру данных, которые вы хотите получить. Это позволяет абстрагироваться от конкретной реализации хранения.
  2. 
    ВЫБРАТЬ
        &период КАК период,
        Сотрудники.Ссылка КАК Сотрудник
    ПОМЕСТИТЬ ВТПериодыПлановыхНачислений
    ИЗ
        Справочник.Сотрудники КАК Сотрудники
    ГДЕ
        Сотрудники.Ссылка = &Сотрудник ;
    ////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ДАТАВРЕМЯ(1, 1, 1) КАК Период,
        ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
        ЗНАЧЕНИЕ(ПланВидовРасчета.Начисления.ПустаяСсылка) КАК Начисление,
        0 КАК Размер,
        ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка) КАК ОсновнойПоказатель,
        ИСТИНА КАК НачислениеТарифнойСтавки
    ПОМЕСТИТЬ Представления_ПлановыеНачисленияСотрудников
    ИЗ
        ВТПериодыПлановыхНачислений КАК ИзмеренияДатыДляНабораЗаписей
    ГДЕ
        "ТолькоРазрешенные" = ИСТИНА
    

    Обратите внимание, что второй блок этого запроса создает пустую временную таблицу Представления_ПлановыеНачисленияСотрудников с предопределенной структурой. Она не извлекает реальные данные, а служит шаблоном.

  3. Преобразование запроса функцией: Затем, полученный текст запроса передается в функцию ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапроса). Эта функция анализирует шаблон запроса и заменяет обращения к "виртуальным таблицам-представлениям" на реальные запросы к данным, учитывая текущую структуру регистров в конфигурации. Это позволяет получать данные в стандартизированном виде, независимо от внутренней реализации хранения.

Преимущества данного подхода:

Программный интерфейс для получения кадровых данных

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

Рассмотрим примеры таких функций:

  1. Для одного сотрудника:
    
    ТекущиеНачисления = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, ТекущаяДата(),,);
    

    Эта функция возвращает структуру с действующими плановыми начислениями для указанного сотрудника на заданную дату.

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

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

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

Документы для изменения плановых начислений и показателей

Для изменения и отмены плановых начислений, а также для корректировки показателей в 1С ЗУП 3.1 используются следующие документы:

В документе Изменение плановых начислений вы можете просмотреть все действующие на определенную дату показатели расчета зарплаты для сотрудников, что может помочь в анализе и отладке данных.

Кроме того, в документах расчета зарплаты, таких как Больничный лист, Командировка, Начисление зарплаты и взносов, предусмотрена кнопка «Показать подробности расчета», которая позволяет увидеть, какие показатели и их значения были использованы при расчете, или применить кастомные настройки отчета "Анализ начислений и удержаний".

Создание собственных показателей

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

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

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

← На главную