Как запросом получить записи перерасчета 1с

Обновлено: 04.07.2024

Многие программисты 1С никогда не сталкивались в своей практике с компонентой «Расчет»,поэтому, когда им приходится сдавать экзамены на Специалиста по Платформе 8.0, где в каждомзадании есть задача по сложным периодическим расчетам, возникают сложности, прежде всего сложности понимания.

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

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

Честно говоря, я долго пытался придумать, для чего еще нужны расчеты, но не придумал, поэтому будем рассматривать задачу расчета зарплаты.

Что такое расчеты

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

Сотрудник

Период

Вид расчета

Результат

Данные

Комментарий

1 января – 31 января

1 январь – 31 января

1 января – 10 февраля

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

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

Каждая запись регистра расчетов относится к определенному виду расчета и периоду времени.

Виды расчетов

Каждая запись видов расчета имеет служебный реквизит – вид расчетов.

Вид расчетов можно представлять себе как элемент особого справочника типа «План видов расчетов» - он также имеет реквизиты, табличные части, предопределенные и заведенные пользователем элементы. В системе может быть несколько таких «справочников».

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

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

Вид расчета

Описание

Пример

По базовому периоду

Результат расчета зависимого периода зависит от результата базового периода. Если результат базового периода изменится, то результат зависимого периода нужно пересчитать.

Премия зависит по базовому периоду от оклада.

Вытеснение по периоду

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

Невыход влияет на фактический период действия оклада.

Расчет зависит от ведущего расчета, но не прямо а косвенно, т.е. расчет А зависит от базового расчета Б, а расчет Б зависит от базового расчета В, следовательно А косвенно зависит от В, т.е. А зависит от ведущего расчета В. В самом деле, при изменении расчета В может измениться Б и следовательно может измениться А. Система автоматически не отслеживает такие сложные зависимости, поэтому нужно указывать какие расчеты являются ведущими.

Премия зависит по базе от оклада, но также косвенно зависит и от невыхода.

В силу подобного влияния, период действия записи регистра расчетов делится на четыре периода:

Период

Описание

В каком периоде действует событие, т.е. к какому периоду относится событие.

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

Фактический период действия

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

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

Графики времени

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

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

Измерение, которое связывается с регистром расчета обычно носит смысл «вид графика».

Особенности настройки объекта Перерасчет

Объект Перерасчет служит для хранения информации о том, для каких записей регистров расчета необходимо перерассчитать результаты расчета (ресурсы). Он является объектом конфигурации подчиненным регистру расчета. Необходимость перерасчета ресурсов может возникнуть из-за неправильной последовательности ввода документов пользователем (ввода документов "задним числом"), которая приводит к необходимости пересчитать результаты расчета тех записей, которые зависят от результатов расчета других записей, введенных в систему позже.

Настройки объекта перерасчет

Информация о требующих перерасчета записях может храниться с разной подробностью.

Записи перерасчета содержат предопределенные поля:

  • Объект перерасчета – ссылка на регистратор, результаты расчета которого необходимо пересмотреть;
  • Вид расчета – ссылка на вид расчета из того плана видов расчета, который назначен регистру – владельцу объекта Перерасчет.

Таким образом, как минимум, информация о перерасчетах хранится с точностью до регистратора (документа) и вида расчета.

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

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

Таблица перерасчета может заполнять системой автоматически на основании настроек выполненных при конфигурировании. Автоматическое отслеживание записей для которых требуется пересмотр результата – основное предназначение объекта перерасчет.

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

Для этого служат свойства измерения перерасчета:

  • Измерение регистра – ссылка на измерение "родительского" регистра расчета, которому подчинен перерасчет.
  • Данные ведущих регистров – ссылки на измерения и реквизиты ведущих регистров расчета.

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

  • Основной регистр – это регистр расчета, которому подчинен перерасчет и за актуальностью результатов которого он "следит".
  • Ведущие регистры – это регистры расчета, записи которых влияют на результат расчета записей основного регистра.

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

Для того чтобы описать, какие именно изменения записей ведущих регистров приведут к появлению перерасчетов и служат измерения перерасчета. Чтобы задать необходимость перерасчета записей по тому же сотруднику, по которому введены (изменены) записи ведущих регистров делается следующее. В свойство "Измерение регистра" вводится ссылка на измерение "Сотрудник" основного регистра, а в свойство "Данные ведущих регистров" - ссылки на измерение "Сотрудник" всех ведущих регистров. При такой настройке в случае любого изменения состава записей ведущего регистра (т.е. при записи соответствующего набора записей), будет выполнено следующее:

  • Проанализирован набор записей ведущего регистра (допустим в наборе записей есть записи на сотрудника Иванова, которые имеют некоторый период действия (например, март)
  • Будет автоматически запрошен основной регистр
  • Если в нем уже есть записи, по тому же Иванову и их результат потенциально зависит от записей ведущего регистра (что такое "потенциально зависит…" будет рассмотрено ниже), то в перерасчет будут введены строки со следующими данными:
    • Объект перерасчета – регистратор "неактуальных" записей основного регистра
    • Вид расчета – виды расчета "неактуальных" записей основного регистра
    • Сотрудник – ссылка на Иванова.

    При этом строки будут введены только в случае, если таких строк еще нет в таблице перерасчета.

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

    Настройки планов видов расчета, связанные с перерасчетами

    Зависимость одних записей регистра от других строится за счет настроек планов видов расчета. Для этого служат понятия:

    • Вариант зависимости от базы – свойство плана видов расчета;
    • Базовые планы видов расчета – свойство плана видов расчета ;
    • Ведущие виды расчета - свойство вида расчета;
    • Базовый период – реквизит записи регистра расчета;
    • Период действия – реквизит записи регистра расчета;
    • Период регистрации – реквизит записи регистра расчета.

    Допустим, основному регистру расчета назначен план видов расчета "Основной", а ведущему регистру – план видов расчета "Вспомогательный". Тогда основному плану видов расчета необходимо установить следующие свойства группы свойств "Расчет":

    • Зависимость от базы – "по периоду действия" или "по периоду регистрации";
    • Базовые планы видов расчета – план видов расчета "Вспомогательный".

    Это будет означать, что основной регистр расчета, который ведет себя согласно плану видов расчета "Основной", зависит от тех регистров, которым назначен план видов расчета "Вспомогательный" (т.е. в нашем случае – ведущий регистр расчета) и при этом записи основного регистра зависят от записей ведущего по периоду действия или по периоду регистрации.

    При настройке плана видов расчета "Основной" его видам расчета (например, виду расчета "Надбавка") необходимо в списке ведущих видов расчета задать виды расчета плана "Вспомогательный" (например, виды расчета "Доплата персональная" и "Доплата ежемесячная"). Это будет означать, что результаты расчета записей основного регистра с видом расчета "Надбавка" зависят от результатов записей ведущего регистра с видами расчета "Доплата персональная" и "Доплата ежемесячная" и должны быть пересчитаны в случае их любого изменения (появления или удаления).

    При этом, для того чтобы выяснить какие записи нужно пересчитать, система сопоставит записи ведущего и основного регистров расчета:


    Например, был начислен оклад, который составил 20 000. Затем была рассчитана премия в размере 10% от оклада, которая составила 2 000. Если сейчас изменить сумму оклада, то запись с премией станет не актуальной, ее нужно будет пересчитать. Для автоматического отслеживания таких ситуаций и предназначен перерасчет.

    Перерасчет создается как подчиненный объект регистра расчета и может хранить записи только для текущего регистра расчета:

    Перерасчет

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

    Объект перерасчетаВид расчета

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

    Для каждого измерения перерасчета будет добавлена еще одна колонка:

    Объект перерасчетаВид расчетаСотрудник

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

    В свойствах измерения нужно указать связь текущего и ведущих регистров:

    Связь измерений перерасчета

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

    Если после расчета премии Иванова изменить оклад Иванова, то в таблице перерасчета появится следующая запись:

    Объект перерасчетаВид расчетаСотрудник
    Начисление ЗП №3ПремияИванов

    То есть нужно пересчитать премию Иванова из документа №3.

    Посмотреть таблицу перерасчета можно с помощью запроса:

    Перерасчет1.ОбъектПерерасчета КАК ОбъектПерерасчета , РегистрРасчета.РегистрРасчета1.Перерасчет1 КАК Перерасчет1

    Записи перерасчета

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

    Условия возникновения перерасчета

    Автоматическое формирование записей перерасчета выполняется при записи в регистр расчета.

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

    Для базовых видов расчета одновременно должны быть выполнены три условия:

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

    Несмотря на то, что вытесняющие виды расчета необязательно включать в список ведущих, иногда есть смысл сделать это. Например, оклад является базовым видом расчета для премии. А командировка вытесняет по периоду действия оклад. Если изменить командировку, то автоматически сформируется запись о перерасчете оклада. После перерасчета оклада автоматически сформируется запись о перерасчете премии. Но пришлось выполнять пересчет дважды: сначала оклад, потом премию.

    В этом случае есть смысл включить командировку в список ведущих видов расчета для премии. Тогда при изменении командировки в перерасчет будет добавлено сразу две записи: для оклада и для премии.

    Удаление записей перерасчета

    Автоматическое удаление записей перерасчета происходит при удалении связанной записи регистра расчета. Так как при перепроведении документа сначала выполняется удаление текущих движений, а потом формирование новых, то достаточно просто перепровести документ, чтобы были удалены записи перерасчета.

    Программная работа с перерасчетом

    Добавление записей перерасчета

    Для добавления записей перерасчета нужно создать набор записей, установить отбор по объекту перерасчета, добавить новые записи и записать в базу данных:


    Регистр расчета используется для накопления данных о рассчитанной заработной плате.

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

    Для каждого регистра расчета в базе данных создается одна таблица. Состав колонок данной таблицы зависит от настроек, и состава измерений, ресурсов и реквизитов. Изначально в данной таблице будет шесть колонок:

    Период регистрацииРегистраторНомер строкиВид расчетаАктивностьСторно

    Основные настройки выполняются на закладке Основные:

    Регистр расчета

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

    Связь позволяет определить данные о каких видах расчета могут храниться в данном регистре.

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

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

    Данное свойство влияет на заполнение колонки Период регистрации. В период регистрации всегда будет записываться начальная дата того периода, который указан в свойстве Периодичность. Например, если периодичность месяц и период регистрации равен 15.03.2021, то в базу данных будет записано 01.03.2021 (начало месяца). Если бы периодичность была равна квартал, то в базу данных было бы записано 01.01.2021 (начало квартала).

    Период действия и график

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

    Если данный флаг установлен, то также должны быть заполнены свойства: График, Значение графика и Дата графика:

    Период действия и график регистра расчета

    В свойстве График нужно выбрать непериодический регистр сведений, в котором будут храниться данные графика.

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

    В свойстве Дата графика нужно выбрать измерение типа Дата, в котором будет храниться дата графика.

    Например, это может быть такой регистр сведений:


    В данном регистре будет храниться дата и признак: это рабочий день или нет. Если рабочий, то 1. Если не рабочий, то 0:

    График регистра расчета

    Данный график позволит определить количество рабочих дней в месяце. Вместо 1 и 0 можно было бы указать количество рабочих часов за день. Тогда можно было бы определить общее количество рабочих часов в месяце.

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

    • Период действия
    • Период действия начало
    • Период действия конец

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

    Например, если для регистра указана периодичность месяц, то для оклада за март 2021 года это будет:

    Период действия01.03.2021
    Период действия начало01.03.2021
    Период действия конец31.03.2021

    Если период действия оклада равен с 15 марта 2021 года по 31 марта 2021 года, то:

    Период действия01.03.2021
    Период действия начало15.03.2021
    Период действия конец31.03.2021

    Если бы периодичность была равна квартал, а не месяц, то Период действия приводился бы к началу квартала:

    Период действия01.01.2021
    Период действия начало15.03.2021
    Период действия конец31.03.2021

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

    Период действия01.03.2021
    Период действия начало15.03.2021
    Период действия конец31.03.2021
    Период действия01.04.2021
    Период действия начало01.04.2021
    Период действия конец15.04.2021

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

    РегистраторНомер строкиПериод действия началоПериод действия конец

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

    Например, если сначала была введена запись об окладе за март 2021 года:

    Период регистрацииРегистраторНомер строкиВид расчетаАктивностьСторноПериод действияПериод действия началоПериод действия конец
    01.03.2021Начисление ЗП №11ОкладИстинаЛожь01.03.202101.03.202131.03.2021

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

    РегистраторНомер строкиПериод действия началоПериод действия конец
    Начисление ЗП №1101.03.202131.03.2021

    Но если в основную таблице ввести запись о командировке с 20 по 25 марта, то так как командировка вытесняет оклад по периоду действия (сотрудник не может одновременно работать в офисе и быть в командировке), то фактический период для оклада будет разбит на две строки:

    Период регистрацииРегистраторНомер строкиВид расчетаАктивностьСторноПериод действияПериод действия началоПериод действия конец
    01.03.2021Начисление ЗП №11ОкладИстинаЛожь01.03.202101.03.202131.03.2021
    01.03.2021Начисление ЗП №12КомандировкаИстинаЛожь01.03.202120.03.202125.03.2021
    РегистраторНомер строкиПериод действия началоПериод действия конец
    Начисление ЗП №1101.03.202119.03.2021
    Начисление ЗП №1126.03.202131.03.2021
    Начисление ЗП №1220.03.202125.03.2021

    Базовый период

    Если установить флаг Базовый период:

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

    То в основную таблицу будет добавлено еще две колонки:

    • Базовый период начало
    • Базовый период конец

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

    Измерения, ресурсы и реквизиты

    На закладке Данные у регистра расчета можно добавить измерения, ресурсы и реквизиты. Для каждого измерения, ресурса и реквизита в основной таблице будет добавлена новая колонка.

    Измерения, ресурсы и реквизиты регистра расчета

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

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

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

    У измерений есть свойство Базовое:

    свойство Базовое

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

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

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

    Запись в регистр расчета

    Регистр расчета обязательно должен быть подчинен регистратору.

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

    Читайте также: