Расчет заработной платы. Сложные периодические расчеты Регистры расчета 1с 8.2 виртуальные таблицы

Документы – суть ведения учета в 1С. Каждый документ имеет результат, например пришло товаров +10 шт.

Отчеты – позволяют смотреть результаты. Суммируют эти результаты и показывают пользователю.

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

Документы записывают свои результаты (называют «движения») в специальные таблицы – регистры 1с, которые сами суммируют результаты, чтобы отчет просто отобразил заранее посчитанные итоги.

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

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

Документ, который записал движения в регистр 1С, называют Регистратор. Дата и время движения равны (в 99% случаев) дате документа. Дату движения называют Период.

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

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

Как документ проводится по регистрам?

Движения документа по регистрам 1С

Посмотрим как работают регистры 1С. Вот у нас есть документ поступления товаров, в котором мы видим, что поступил товар Масло на склад Главный.

С точки зрения логики и математики этот документ имеет результат:

Масло кремлевское, Главный склад +10 (шт)

Проверим – так ли это?

Этот пункт меню покажет нам все движения документа, которые он сделал по регистрам. Как мы видим, документ сделал движения по целой куче регистров 1С, в каждый из которых он записал разную информацию (в соответствии с назначением регистра 1С). По регистру 1С Товары на складах он сделал ту проводку, которую мы с Вами рассчитали.

Как же это выглядит в регистре 1С? Откроем регистр 1С через меню Операции.

Открылся регистр 1С. Данных в нем много. Сделаем отбор только по нашему документу.

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

  • Плюс – вид движения (приход/расход)
  • Регистратор – наш документ
  • Активность – эта строка движения действительна (то есть не отключена)
  • Номенклатура, основное измерение
  • Склад, дополнительное измерение
  • Количество, ресурс (то есть цифра, которую мы считаем).

Если мы поставим отбор не по документу, а по номенклатуре (точно таким же образом), то мы увидим движения всех документов, которые трогали эту номенклатуру. Один документ – мы купили товар. Другой – продали. Итого естественно сам регистр 1С не показывает – для этого нужно использовать отчет или запрос.

Регистры 1С бывают разные (ниже мы обсудим это). Проводки по разным регистрам 1С выглядят тоже по разному. Мы сейчас смотрели проводки по регистру накопления 1С. Вот так выглядят проводки нашего этого же документа по бухгалтерскому регистру 1С, который работает на основании бухгалтерского (налогового) плана счетов 1С.

Зачем нужны регистры 1С

Регистры 1С бывают разных видов. Цель использования регистра 1С зависит от его вида.

  • Регистры сведений 1С
    Это обычная таблица, как в Excel. Она не имеет никаких движений (приходов/расходов). Регистр сведений 1С обычно используется для хранения дополнительных данных справочников. С помощью регистра сведений 1С можно организовать
  • Регистры бухгалтерии 1С
    С точки зрения пользователя учет ведется на бухгалтерском плане счетов. На самом деле учет ведется в таблице регистров бухгалтерии 1С, которые сделаны в разрезе плана счетов 1С.
  • Регистры накопления 1С (регистр остатков 1С)
    Таблица движения документов + и –, которая автоматически вычисляет итого на начало периода и итого на конец периода. Например движения товара Лопата было +10, а потом -8. Значит остаток на начало был 0, а остаток на конец стал 2.

    Регистр накопления 1С с видом «Остатки» обозначает, что будут хранится движения (приходы и расходы, которые также называют «Обороты») и дополнительно будут автоматически рассчитываться итоги (которые называют «Остатки»).

    Регистр остатков 1С используют в том случае, когда у справочника логически может быть остаток. Например, когда мы учитываем движения товаров, то мы будем использовать регистр остатков 1С – ведь мы можем сказать, что товара Лопата осталось 3 штуки.

  • Регистры накопления 1С (регистр оборотов 1С)
    Таблица движения документов + и -, которая не считает итого.

    Регистр оборотов 1С ничем не отличается от регистра остатков, за исключением того, что у него не рассчитываются автоматически остатки.

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

    Например, продажи товаров были +10 (мы продали) а потом -2 (нам вернули). Мы не можем сказать что остаток продаж стал 8, потому что логически понятия остатка продаж не существует, мы скажем что итого оборота (сумма каждой строки оборота) стала 8.

  • Регистры расчетов 1С

    Таблица движений в разрезе видов расчета и периодов. Используется в начислении заработной платы (называют Сложные периодические расчеты).

Где находятся регистры 1С

Проведение документа в коде (в программе) прописывается программистом. Для этого откройте . Найдите строку вида «Процедура ОбработкаПроведения(». Раскройте крестик и Вы видите программу проведения этого документа.

Настройка и разработка Регистров 1С

Основные особенности Регистров 1С, по закладкам:

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

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

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

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

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

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

Рассмотрим пример.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Установим флаг Базовый период .

Зададим в группе параметров Периодичность параметр Месяц .

Перейдем на вкладку Данные . Зададим здесь следующие параметры, рис. 1.11 :


Рис. 1.11.

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

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

Реквизит ИсходныеДанные - тип число, длина 10, точность 2. В этот реквизит мы будем записывать исходные данные для расчета. Например, для вида расчета Оклад мы запишем сюда исходный размер оклада, для вида расчета Премия - процент , который должен браться от расчетной базы, для вида расчета Удержание - размер удержания в рублях.

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

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

1.6. Документ Начисление зарплаты

Создадим новый документ, дадим ему имя НачислениеЗарплаты . Этот документ должен иметь следующую функциональность:

  1. Возможность ручного ввода начислений;
  2. Формирование движений по регистру расчета ;

Перейдем на вкладку Данные окна настройки свойств документа НачислениеЗарплаты , рис. 1.12 . Создадим реквизит документа ПериодРегистрации - тип Дата , состав даты - Дата .


Рис. 1.12.

Создадим табличную часть НачисленияИУдержания . Создадим в ней следующие реквизиты:

Теперь перейдем на вкладку Движения . Запретим оперативное проведение документа , добавим в состав регистров, по которым документ формирует движения, регистр НачисленияИУдержания .

Нажмем на кнопку Конструктор движений . Откроется окно конструктора, рис. 1.13 .


Рис. 1.13.

При заполнении полей, задающих правила формирования движений мы заполним их следующим образом:

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

Нажмем на кнопку ОК в окне конструктора движений и посмотрим, какой код он сформировал:

Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Для Каждого ТекСтрокаНачисленияИУдержания Из НачисленияИУдержания Цикл // регистр НачисленияИУдержания Движение = Движения.НачисленияИУдержания.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаНачисленияИУдержания.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания; Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаНачисленияИУдержания.Сотрудник; Движение.ИсходныеДанные = ТекСтрокаНачисленияИУдержания.ИсходныеДанные; Движение.График = ТекСтрокаНачисленияИУдержания.График; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры

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

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

Если ТекСтрокаНачисленияИУдержания.ВидРасчета= ПланыВидовРасчета.Основной.Премия Тогда Движение.БазовыйПериодНачало=НачалоМесяца(ПериодРегистрации); Движение.БазовыйПериодКонец=КонецМесяца(ПериодРегистрации); КонецЕсли;

Теперь немного изменим ту часть кода, которая задает начало и конец периода действия начисления. В нашем случае лишь один вид начисления нужно "оснастить" периодом действия , который в явном виде будет задавать пользователь . Это - Прогул . У всех остальных период действия будет равняться одному месяцу - начало периода будет совпадать с началом месяца, за который производится начисление заработной платы, конец периода действия будет совпадать с концом месяца. Поэтому мы, для того, чтобы избавить пользователя документа НачислениеЗарплаты от ввода ненужных значений, добавим в наш модуль следующий код, поместив его в цикл обработки строк табличной части:

Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Прогул Тогда Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания; Иначе Движение.ПериодДействияНачало = НачалоМесяца(ПериодРегистрации); Движение.ПериодДействияКонец = КонецМесяца(ПериодРегистрации); КонецЕсли;

Этот код заменит строки

Движение.ПериодДействияНачало = ТекСтрокаНачисленияИУдержания.ДатаНачала; Движение.ПериодДействияКонец = ТекСтрокаНачисленияИУдержания.ДатаОкончания;

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

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

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

Если все перенесено верно, а в нашем случае это именно так, мы можем приступать к реализации процедуры расчета. Сделаем это в том же модуле, в котором осуществляется формирование движений.

Сразу хотелось бы отметить, что в существующих конфигурациях обычно применяются несколько другие методы реализации расчетных процедур. В частности, для них характерна следующая последовательность действий. После того, как документ сформировал движения по регистру, происходит запись данных в регистр , после чего управление передается в расчетную процедуру общего модуля с установленным свойством Сервер , что актуально в том случае, если система работает в клиент-серверном режиме. В процедуре, с помощью запроса к таблицам регистра расчета , получают записанные данные и проводят манипуляции с ними. Все эти действия, в итоге, приводят к повышению быстродействия прикладных решений , которые могут использоваться в различных режимах, работать с большими объемами данных. Сущность действия такая же, как в нашем примере, но реализация отличается. Главная цель нашего учебного примера - показать принципы, по которым осуществляется решение расчетных задач, поэтому здесь мы концентрируемся именно на основных принципах, не обращая внимание на оптимальность кода или его быстродействие .

Добавим в процедуру проведения документа команду записи сформированных движений:

Движения.НачисленияИУдержания.Записать();

Эта команда должна следовать за командой закрытия цикла формирования движений.

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

Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Удержание Тогда Движение.Результат=Движение.ИсходныеДанные; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();

Теперь займемся расчетом оклада.

Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Оклад Тогда План = Движение.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ПериодДействия); Факт= Движение.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ФактическийПериодДействия); Движение.Результат= Движение.ИсходныеДанные*Факт.РабочийДень/План.РабочийДень; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();

Метод ПолучитьДанныеГрафика записи регистра расчета возвращает данные графика в виде таблицы значений, причем, этот метод вызывается с параметром типа ВидПериодаРегистраРасчета . Если вызвать его с видом периода ПериодДействия - будут возвращены данные по графику, отражающие, в нашем случае, полное количество рабочих дней. Вызов метода с видом периода ФактическийПериодДействия возвращает данные с учетом вытесняющих видов расчета .

Запись вида Факт позволяет обратиться к строке таблицы значений. А записью Факт.РабочийДень (напомним, РабочийДень - это имя ресурса регистра сведений , который используется как график ) мы "вытаскиваем" нужные данные. В нашем случае - количество рабочих дней, отработанных по факту.

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

И, наконец, последним этапом нашей расчетной задачи является расчет премии. Его мы реализуем с помощью следующего кода:

Ресурсы=Новый Массив(1); Ресурсы="НачисленияИУдержания.Результат"; Измерения =Новый Структура ("Сотрудник", "НачисленияИУдержания.Сотрудник"); Для Каждого Движение из Движения.НачисленияИУдержания Цикл Если Движение.ВидРасчета=ПланыВидовРасчета.Основной.Премия Тогда ДанныеБазы=Движение.ПолучитьБазу(Ресурсы, Измерения); Движение.Результат=Движение.ИсходныеДанные*ДанныеБазы.Результат/100; КонецЕсли; КонецЦикла; Движения.НачисленияИУдержания.Записать();

Для начала мы подготовим параметры для передачи в метод ПолучитьБазу . Это будет массив Ресурсы , который в нашем случае содержит имя ресурса базового регистра расчета в формате "ИмяРегистра.ИмяРесурса" . Так же мы готовим структуру Измерения . В структуру мы добавляем новый элемент, имя которого совпадает с именем измерения регистра расчета ("Сотрудник" ), а значение содержит список измерений (в формате "ИмяРегистра.ИмяИзмерения" ), в нашем случае это одно измерение. Эти данные будут использованы при получении расчетной базы при расчете премии.

В цикле мы записываем в переменную ДанныеБазы результаты выполнения метода ПолучитьБазу для текущей записи регистра расчета (то есть - для вида расчета Премия ). Метод ПолучитьБазу возвращает таблицу значений, строки которой хранят запрошенные при вызове метода данные.

Вспомним, как называется ресурс регистра расчета , в котором хранятся результаты вычислений - это ресурс Результат . Именно по такому имени мы можем обратиться к строке таблицы значений (в нашем случае это одна строка с индексом 0) и получить расчетную базу.

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

После того, как все вышеперечисленные действия выполнены, мы можем испытать наше решение на практике. Если все выполнено верно - в

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

Свойства регистра расчета

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

Редактирование регистра расчета выполняется в окне редактирования.

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

План видов расчета - основная характеристика регистра. Выбирается один из объектов типа "План видов расчетов" .

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

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

Значение графика - свойство доступно, если установлено свойство Период действия . В свойстве выбирается ресурс регистра сведений, определенного в свойстве График .

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

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

Периодичность - определяет период, с которым регистрируются движения и в пределах которого движения могут влиять друг на друга (для регистров, поддерживающих период действия).

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

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

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

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

Регистры расчета предназначены для хранения записей расчета (промежуточных и итоговых результатов). Формы регистра позволяют просматривать записи расчетов. Например, нижена рисунке приведена форма регистра ОсновныеНачисления.

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

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

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

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

Ресурсы - результаты расчета, например, ресурс Начислено для регистра ОсновныеНачисления, ресурс Удержано для регистра Налоги и т.д. Ресурсы могут быть только числового типа.

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

Графики

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

Ниже приведен пример регистра сведений, который служит графиком работы.

Перерасчеты

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

Например, при изменении начислений сотрудника нужно пересчитать налоги. Тогда для вида расчета «НДФЛ» начисления будут являться ведущими видами расчета, что настраивается в плане видов расчета на закладке «Ведущие».

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

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

Ниже на примере показана схема работы перерасчета:

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

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

Запросы к регистрам расчета

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

  • основная таблица записей регистра расчета,
  • таблица фактического периода действия,
  • таблица перерасчета.

С помощью средств механизма запросов можно группировать результаты расчета в необходимых разрезах, подсчитывать итоги, отбирать только нужные записи расчета. Это позволяет сформировать весь спектр необходимых отчетов, например, РасчетныеЛистки, ЛицевыеСчета, ВедомостьВыплатыЗарплаты и т.д. Механизм запросов был подробно описан в главе «Запросы». Список полей таблиц-источников регистров расчета приведен в документации.

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

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

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

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

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

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

Сотрудник

Период

Вид расчета

Результат

Данные

Комментарий

Измерение

Служебный

Служебный

Реквизит

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

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

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

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

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

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

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

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

Вид расчета

Описание

Пример

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

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

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

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

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

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

Ведущие расчеты

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

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

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

Период

Описание

Период регистрации

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

Период действия

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

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

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

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

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

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

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

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

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

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

Дата

Вид графика

Значение

11.01.05 пт

Пятидневка

11.01.05 пт

Шестидневка

12.01.05 сб

Пятидневка

12.01.05 сб

Шестидневка

Почему используется измерение дата, а не периодический регистр сведений? Все очень просто - если 11 января в пятницу по пятидневке у нас 8 рабочих часов, то это еще не значит, что на следующий день у нас будет опять же 8 рабочих часов. А ведь если бы мы использовали периодический регистр, значение на следующий день бралось бы из предыдущего дня при отсутствии записей.

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

Перерасчет

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

Для этого и служат перерасчеты.

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

По сути перерасчеты - это список записей регистра расчета, которые нужно перерасчитать .

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

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

Практическое задание

Достаточно теории. Попробуем изучить детали на практике. За основу возьмем каркасную конфигурацию.

Постановка задачи:

Пусть премия задается фиксированным процентом к окладу (за вычетом невыходов и командировочных).

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

Пусть за невыходы с сотрудника взымается штраф в размере половины оклада за период невыхода.

Ход выполнения:

Начальная подготовка

Создадим новый план видов расчета «Основной».

Определим виды расчета и зависимости между ними:

Базовые

Вытесняющие

Ведущие

Оклад

Невыход, Командировка

Премия

Невыход, Командировка

Оклад, Невыход, Командировка

Командировка

Невыход

Занесем эти виды расчета в план видов расчета «Основной» и в свойствахвидов расчета поставим зависимости согласно таблице.

В регистре расчета зарплаты сделаем измерение «Сотрудник» типа «ФизическиеЛица » - чтобы в регистре был разрез аналитики по сотрудникам.

В конфигурации уже имеется документ «Начисление зарплаты».

В нем две даты в шапке - «дата» и «период регистрации», а также по две даты «дата начала» и «датаконца » в каждой строчке.

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

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

Модуль документа будет выглядеть примерно так:

Для К аждого ТекСтрокаСписок Из Список Цикл

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

Движение = Движения.Р асчеты.Добавить ();

Движение.С торно = Ложь;

Движение.В идРасчета = ТекСтрокаСписок.ВидРасчета ;

Движение.П ериодДействияНачало = НачалоДня (ТекСтрокаСписок.ДатаНачала );

Движение.П ериодДействияКонец = КонецДня ();

Движение.П ериодРегистрации = ПериодРегистрации ;

Движение.Б азовыйПериодНачало = НачалоДня (ТекСтрокаСписок.ДатаНачала );

Движение.Б азовыйПериодКонец = КонецДня (ТекСтрокаСписок.ДатаОкончания );

Движение.С отрудник = ТекСтрокаСписок.Сотрудник ;

Движение.Г рафикРаботы = ТекСтрокаСписок.График ;

Движение.Р езультат = 0;

Движение.Д анные = ТекСтрокаСписок.Размер ;

КонецЦикла ;

Реквизит Сторно нужен чтобы сторнировать записи (аналог минуса).

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

Все документы датировать будем 20.01.2003, период регистрации будем ставить 02.01.2003 (специально указываю не начальные и конечные данные, здесь это неважно, все равно при записи в ПериодРегистрации преобразуется в начало периода 01.01.2003). Январь 2003 года используем, потому что за этот период заполнены графики работ.

Заведем перерасчет «Перерасчет», добавим в него измерение «Сотрудник», связанное с измерением «Сотрудник».

Играем с Перерасчетами.

Для игры откроем консоль запроса - обработка «ПроизовльныйЗапрос » в каркасной конфигурации. Создадим новый запрос конструктором запроса, добавим туда виртуальную таблицу Перерасчеты.Р асчеты.Перерасчет , текст запроса будет таким:

ВЫБРАТЬ

РасчетыПерерасчет.О бъектПерерасчета ,

РасчетыПерерасчет.В идРасчета ,

РасчетыПерерасчет.С отрудник

ИЗ

РегистрРасчета.Р асчеты.Перерасчет КАК РасчетыПерерасчет

Сформируем три документа - первым начислим оклад сотрудникам А и Б. Сотрудник А работает с 1 по 31 января, Б работает с 1 по 20 января. Вторым начислим премию сотруднику Б за период с 1 по 31 января, третьим назначим невыход сотруднику А с 20 по 25 января.

Играем с Фактическим периодом действия.

Создадим новый запрос - на этот раз в него добавим данные таблицы РегистрыРасчета.Р асчеты.ФактическийПериодДействия .

Сформируем запрос и увидим, что сотруднику А период действия оклада разбит на два периода - с 1 по 19 и с 26 по 31 января. Надеюсь вам понятно, что период был разбит на два, т.к. невыход вытеснил оклад.

Думаю, механизмы работы регистра расчета проясняются на глазах.

Изучаем графики.

Теперь попробуем начислить зарплату по окладу сотрудника.

Создадим новый запрос по регистру расчета используя виртуальную таблицу РегистрыРасчета.Р асчеты.ДанныеГрафика . У этой виртуальной таблицы можно задать параметр - условие отбора записей, например Сотрудник=&ВыбСотрудник и ВидРасчета=&ВидРасчета и График=&ВидГрафика .

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

Колонка результата

Значение

ЗначениеПериодДействия

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

ЗначениеФактическийПериодДействия

Сколько сотрудник фактически проработал в часах

ЗначениеБазовыйПериод

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

ЗначениеПериодРегистрации

Сколько рабочих часов в периоде регистрации (месяц январь)