7-ая лекция. Сложные периодические расчеты. Периодические – это значит, что все наши действия мы делаем за какой-то период, который называется – Период начислений или расчетов. Как правило, это Месяц, на практике, как и на экзамене, размеры периода всегда известны. В задании всегда будет сказано, какой период начисления используется – «ежемесячно». Может быть, два расчетных периода и это будет также явно указано в задании – ежемесячные начисления и ежегодная премия – два расчетных периода (месяц и год). ВР – вид расчета, это некий алгоритм, в результате работы которого получают – результат расчета Начисления – Удержания = задолженность предприятия перед сотрудниками по заработной плате. Факт получения заработной платы – Выплата – самостоятельная операция, не являющаяся ни начислением, ни удержанием. Выплата – это погашение задолженности предприятия перед сотрудниками. Всегда, когда мы встречаем термин «Долг» - должны не забывать, что это задача остатков. Выплата и в жизни и на экзамене реализуется на регистре накопления с видом Остатки. В связи с тем, что сама Выплата не использует расчетный механизм, в задачах на экзамене она будет встречаться крайне редко. На экзамене мы будем работать исключительно с начислениями и удержаниями. На курсе будет один пример показывающий механизм самой выплаты. Способы начисления заработной платы 1. Метод отклонений – в начале расчетного периода вводится плановая занятость, далее, по мере возникновения событий реальной жизни плановая занятость корректируется вводом отклонения от плана. По сути это метод исправлений и благодаря именно этому способу начисления появилось большинство расчетных механизмов. 2. Метод начисления по табелю – вся информация по отработанному времени с учетом больничных, отпусков, прогулов и т.п. вводится в конце расчетного периода по факту. В жизни (сверху) данные методы определяют алгоритм работы расчетчика. В платформе (снизу) каждый из способов начисления определяет свой алгоритм по получению фактического времени. Понятие «ВРЕМЯ». Виды времени. Любая задача, связанная со временем отвечает на вопрос – Сколько такого-то вида времени в таком-то периоде, т.е. любая задача со временем – это вид времени в определённом периоде. Вид времени – з варианта Периоды – 4 варианта Всего – 12 вариантов 1. Календарное время. Является базой для расчета любого другого вида времени. Оплата по календарному времени означает, что чем бы вы ни занимались (работали, ели, спали) всё это происходит по календарному времени и значит, оплата по календарному времени не зависит от вида занятий. Тогда оплата зависит только от периода, а раз период постоянен, то и сумма за этот период тоже будет постоянна. С точки зрения теории, существует два варианта связанных с календарным временем: 1.1. Период, за который надо получить количество календарного времени – постоянный и равен периоду начисления, следовательно, и сумма фиксированная. !!!Важно, если мы начинаем говорить про разное количество дней в месяце, то сразу переходим на детализацию периода начисления по дням и начинаем использовать другой вид начисления. ВЫВОД - если мы говорим помесячно, то у нас детализация месяц и количество дней в месяце нас не интересует.!!! Когда говорят оплата фиксированной суммой, то это оплата по календарному времени за период начисления 1.2. Период, за который надо получить количество календарного времени – переменный. Количество календарного времени определяется как разность между концом и началом периода. Это значение типа Дата – дата + время с точностью до секунды, поэтому в разности мы всегда получаем количество секунд, после чего вводя стандартный коэффициент преобразования, переходим к другим единицам времени (минутам, часам, суткам). На экзамене таких задач не будет. !!!Теория. Если нужно использовать количество календарного времени за переменный период, то в задании будет примерно такая фраза – отпуск считается как сумма, деленная на количество календарных дней за два прошлых месяца или умноженное на количество календарных часов за текущий месяц. Если есть слово календарная с единицей измерения, а дальше обязательно есть период, то это сигнал, что надо получать такую информацию как разность дат. Период / Время Календарное Плановое (рабочее) Фактическое Период регистрации Период действия Фактический период действия Базовый период 2. 3. Плановое или рабочее время. Рабочее время определяется как календарное минус выходные и праздники. Производственный календарь на следующий год – это формирование плановой занятости, т.е. рабочего времени. Информация о рабочем времени хранится в специальных объектах – графиках работ, сейчас это производственный календарь. Для получения рабочего времени в платформе имеется механизм – Получение данных графиков. На экзамене всегда, когда надо получать плановое или рабочее время необходимо использовать этот механизм. Для реальных задач в жизни этот механизм не универсален. Фактическое время – время, сколько человек реально работал, был в командировке, в отпуске и т.д. Существует два варианта получения фактического времени в зависимости от метода начисления. 3.1. Если начисление по табелю, то фактическое время берётся из данных табеля. В табеле хранится вся информация о том, сколько человек работал, был в командировке, в отпуске, на больничном. В табеле хранится фактическое время и поэтому никаких записей в регистр расчета он делать не должен, т.е. табель не должен вводить информацию о начислениях и удержаниях в регистр расчета. 3.2. Если используется метод отклонений, то: 3.2.1 Фактическое время получают из данных графика 3.2.2 Фактическое время получают при получении базы Виды периодов 1. Период регистрации. Период, который есть во всех задачах расчета. На практике различают, когда происходило событие (период действия) и период, когда информацию об этом событии записали в журнал расчета (при ручном ведении учета). Запись в журнал расчета бухгалтер характеризовал так – мы зарегистрировали оклад Иванова в журнале расчетов за такой-то период, отсюда и название – период регистрации. Итак, период регистрации – это период когда информация о виде расчета была занесена в базу. Обычно период регистрации и период действия совпадают, но не всегда. В задачах на экзамене обычно есть только период регистрации, возникает вопрос, а чему тогда равен период действия, ведь если информация о виде расчета записана в журнал регистрации, т.е. зарегистрирована, значит, событие происходило и период действия явно был – получается, что если есть только период регистрации, то период действия всегда ему равен, без исключения. Если в такой задаче нужен период действия, то нужно взять период регистрации. Следует обратить внимание на размер периода регистрации, в наших задачах Длина периода регистрации постоянна и равна периоду начисления. Период регистрации характеризуется длиной и левой границей типа Дата. Если период начисления = месяц, то левая граница – начало месяца. 2. Период действия. Данный период может быть не всегда, он включается дополнительно и в жизни (сверху) учет по периоду действия иногда зависит просто от желания расчетчика, его знаний законодательства и опыта. На экзамене учет по периоду действия будет определяться снизу, с точки зрения платформы. Нельзя указывать период действия для расчета - алгоритм, которого не требует периода действия. Существует строго два случая, когда надо подключать период действия: 2.1. Получение данных графика 2.2. Настройка вытесняющего вида расчета Если включен период действия, то сверху просто появляется дополнительный период, который так и называется – период действия, а снизу, с точки зрения платформы появляется два периода – период действия и фактический период действия. Из раннего – период действия вести не надо когда он равен периоду регистрации, одинаковые значения нет смысла хранить, а когда период действия не равен периоду регистрации, то его (период действия) подключают. А когда период действия не равен периоду регистрации – в двух ситуациях: А. Сотрудник болел в январе, а зарегистрировали больничный в феврале, по факту предъявления больничного. Период действия – январь, период регистрации – февраль. Чтобы платформа могла идентифицировать эту ситуацию, и появился просто период действия, характеризующийся Длиной = периоду начисления (например, месяц) и левой границей типа Дата. Длина у периода действия и периода регистрации одинаковая, а ответ на вопрос, а в том ли периоде ввели данные, или не в том можно сравнив левые границы периодов. Если границы равны, значит в том, если не равны, значит точно не в том. Б. Сотрудник болел в январе и информацию ввели за январь, тогда период регистрации выступает как параметр и они равны с периодом действия – оба январь. НО!!! Период регистрации это всегда целиком месяц, а больничный 3 дня и получается, что по периоду действия они не равны. Отсюда появился следующий период действия: 3. Фактический период действия – он может быть любой длины и поэтому имеет две границы: - период действия начало – тип Дата - период действия конец – тип Дата Это снизу их два, с верху, период один, т.е. период действия и фактический период действия должны лежать в одном расчетном периоде. Поэтому сам период действия доступен только для чтения, формируется он автоматически платформой на основании данных фактического периода действия, чтоб расхождения не было от достоверности. И это еще не всё. На практике существуют переходящие виды расчета с одного месяца на другой. Больничный лист открыт в январе, а закрыт в феврале. Период начисления месяц и больничный затрагивает два месяца, два периода начисления. Если мы говорим о равенстве периода действия и фактического периода действия у нас начало и конец фактического периода действия не могут лежать в разных расчетных периодах. Если период действия – январь, то и границы фактического периода действия должны иметь январскую дату. Чтобы не было расхождений, в платформе реализовали специальный механизм, который умеет контролировать, чтобы начало и конец фактического периода действия лежали в одном расчетном периоде. В нашем случае формируют две записи - за январь (на дни больничного в январе) и за февраль (на дни больничного в феврале). Надо запомнить, что все расчетные механизмы предполагают, что человек должен работать. Допустим, в фирме используется метод отклонений и указано, что сотрудник в дни больничного оклад не получает. В начале расчетного периода предполагалось, что сотрудник должен работать весь месяц. В конце расчетного периода выясняется, что какие-то дни сотрудник болел. Оклад в фирме рассчитывается по фактически отработанному времени. Тогда, очевидно, что вместо одного периода надо было бы зафиксировать два периода – от начала расчетного периода до больничного и после больничного до конца расчетного периода. НО!! В 7-ке все записи регистрировались в одном журнале расчетов, в 8-ке для повышения эффективности, уменьшения количества записей в одной таблице (журнале расчетов), создали четыре таблицы: - регистр расчета - таблица фактического периода действия – физическая таблица. Используется в построении диаграммы Ганта и при получении фактического времени через данные графика (п 3.2.1 в видах времени) - таблица перерасчетов - таблица дополнений Когда включают учет по фактическому периоду действия, то кроме фактического периода действия, который характеризуется двумя границами, автоматически создаётся специальная таблица – Таблица фактического периода действия. Для повышения достоверности данная таблица доступна только для чтения, создаётся и заполняется она платформой автоматически. Отсюда наша задача будет иметь такое решение: - заводится оклад сотрудника с 1 по 31 - в регистре расчета появляется запись об окладе с 1 по 31 - и одновременно, внутри одной транзакции, появляется такая же запись в таблице фактического периода действия - заводится запись по больничному листу с 11 по 20: - в регистре расчета как была одна запись по периоду расчета так одна и останется, поменяется только результат + добавится запись по больничному - а в таблице фактического периода действия вместо одной записи появятся две записи - 1-ая с 1-го по 10-е - 2-ая с 21-го по 31-е - + добавится запись по больничному листу Регистр расчёта Оклад Иванова с 1 по 31 Сотрудник работал весь месяц Таблица фактического периода действия Оклад Иванова с 1 по 31 Сотрудник работал весь месяц и болел с 11 по 20 Регистр расчёта Таблица фактического периода действия Оклад Иванова с 1 по 31 Оклад Иванова с 1 по 10 Оклад Иванова с 21 по 31 Больничный лист с 11 по 20 Больничный лист с 11 по 20 Ситуация когда на оси времени вместо одного вида расчета появляется другой – получила название Вытеснение. Вид расчета - Оклад Виды расчета - Оклад + Больничный лист Сверху – Вытеснение – это конкуренция двух видов расчета за одно место на оси времени. Это означает, что если есть оклад, то не может быть больничного, если есть больничный, то не может быть оклада. Снизу – Вытеснение – это всего лишь перезапись таблицы фактического периода действия 4.Базовый период. Понятие базового периода пришло сверху, из теории заработной платы, где есть следующая расчетная схема: Результат одного вида расчета (Премия) зависит от другого вида расчета (Оклад) Премия = % * начисленный оклад . Термины – Оклад является Базой для премии и называется базовый вид расчета, а формула называется – расчет по базе. В платформе есть специальный механизм для получения базы. Получение базы всегда чтение, платформа чтобы получить базу идет в соответствующий регистр расчета, ставит при чтении данных два обязательных отбора (это необходимый минимум): – 1.По базовому виду расчета, из регистра нужны не все записи, а только по тому виду расчета, который является базовым для данного вида расчета (оклад, отпуск) - 2. По базовому периоду. Когда реализуется какой либо расчет, то получение данных всегда происходит за какой-то период, т.е. в задачах расчета нет такой ситуации когда надо получать все данные из регистра расчета с начала ведения учета, все алгоритмы всегда требуют определить период для получения данных. Период может быть и больше и меньше и равен периоду начисления. Сам базовый период характеризуется двумя границами: - Базовый период начало – тип Дата - Базовый период конец – тип Дата Регистр расчета Имеет два предопределенных (их не надо создавать) детализирующих признака - Вид расчета (ВР) – создавать у регистра расчета на экзамене Измерение «Вид расчета» нельзя, это показывает, что мы не понимаем как работает регистр расчета - Период регистрации (ПР) Помимо двух предопределенных регистр расчета будет еще иметь привязку к трем различным периодам: - Период действия (ПД) - Фактический период действия (ФПД) - Базовый период (БП) В расчетных задачах, для получения результата расчета все четыре вида периода независимы и самостоятельны. При вводе данных связь между ПД и ФПД имеется, но при чтении каждый из них рассматривается как самостоятельная независимая величина Ресурсы (накапливаемые показатели) - сумма - значение в денежном выражении, т.е. в основной валюте расчетов, но в отличие от бухгалтерского учета эта величина не обязательная. Расчеты могут быть и в виде натуральных единиц (количество чего-либо) – Начисления в натуральном выражении. На экзамене задач с натуральными единицами нет. А вот сумм может быть несколько, в задачах с валютным учетом. Валютный учет реализуется, так же как и в задачах оперативного и бухгалтерского учета. У регистра расчетов – есть таблица движений и таблица сводных помесячных оборотов. Прообраз регистра расчета – регистр накопления с видом Обороты. В таблице движений есть много записей, в том числе внутри одной секунды. Привязывается движение к точке на оси времени и характеризуется моментом времени. Сводная таблица помесячных оборотов, появляется по умолчанию – для быстрого чтения данных месяц или таблицы за другие периоды, их может быть несколько, если используется механизм агрегатов. Таблица движений регистра расчета Регистратор Номер Активность Сторно ПР ПД ПДначало ПДконец БПначало БПконец Вид расчета Измерения Ресурсы Реквизиты Левая граница Левая граница ПР, длина ПР, длина фактический фиксирована фиксирована период действия Ключ записи Каждая запись регистра расчетов, в отличие от регистра накопления и регистра бухгалтерии, привязывается не к точке на оси времени, а целиком к соответствующему периоду. Здесь в одной секунде не может быть сотни документов. На экзамене все отчеты по начислениям и удержаниям всегда строятся строго по регистру расчета. Все данные, которые необходимо будет в отчет ввести должны браться только из регистра расчета. НО!!! Сами отчеты могут содержать не только результаты расчета, но и какую-нибудь вспомогательную информацию, которая храниться в реквизитах регистра расчета. Подразделение Руководитель % премии Измерения Сумма премии Реквизит Результат расчета В отличие от задач оперативного и бухгалтерского учета, где реквизиты при построении отчетов (на экзамене) не использовались, в регистре расчета они активно используются. В реквизиты помещается вся вспомогательная информация. Учебная задача №1 Все задачи на экзамене будут построены по одинаковой схеме: - сначала идет размер расчетного периода «Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений» - дальше описываются графики работы «Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам» - далее идет описание видов расчета - потом описание документов - виды отчетов Постановка задачи происходит в два этапа: 1.Этап – определение необходимых видов расчета Шаг 1 – определяем формулы, которые надо будет программировать. В условии задачи ищем то место, где описываются виды расчетов. В данной задаче будет использоваться два вида расчетов: - «оклад пропорционально отработанному времени в часах» - «больничный лист - как количество дней болезни, умноженное на дневную ставку (пропорционально дням болезни)» Формула №1 «Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода» Начальный оклад Оклад = Кол-во рабочих часов Кол-во фактически * отработанных часов Шаг 2 - определить для каждого элемента формулы: - место хранения, при получении элемента прямым чтением - способ получения, если это какой-то механизм платформы Начальный оклад – «Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. В информационной базе необходимо хранить историю его изменения» - место хранения – периодический регистр сведений, т.к. необходимо хранить историю изменения, изменяться раз в день может и реквизит справочника, например. Получение значения – через срез или получить последнее(). Количество рабочих часов – здесь ничего придумывать не надо, как только мы видим в формуле единицу времени, то сразу обращаемся к перечню видов времени: - Календарное время – Нет, не написано «количество календарных дней» - Плановое (рабочее) время – Да, а раз так, то получение данных графика Количество фактически отработанных часов – есть единица времени, смотрим на виды времени: -Календарное время – Нет - Плановое (Рабочее) время – Нет - Фактическое время – Да - По табелю – Нет - Метод отклонений – Да - получение данных графика – Да, когда получаем фактическое время работы в первый раз, то это данные графика - получение базы – здесь получение фактического времени работы второй, треттий и далее раз Формула №2 Шаг 1 - «В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни, умноженное на дневную ставку. Дневная ставка едина для всех сотрудников компании и должна быть зафиксирована в информационной базе. Дни болезни сотрудника рассчитываются по пятидневному графику. В случае получения сотрудником пособия начисление по окладу не производится» Пособие (больничный лист) ═ Дневная ставка * Количество дней болезни Шаг 2 Дневная ставка – «едина для всех сотрудников компании и должна быть зафиксирована в информационной базе» - это константа. Количество дней болезни – «Дней» - это единица измерения времени, следовательно, опять идем к списку видов времени: Календарное – Нет, нет слова «календарное» Плановое (рабочее) – нет, как запланировать болезнь Фактическое – Да - по табелю – нет - метод отклонений – да - получение данных графика – Да, мы фактическое время болезни еще не получали. 3.Шаг – определить, в какой последовательности надо реализовывать расчет. К этому шагу следует переходить, когда определены все нужные для расчетов формулы и для них сделаны Шаг 1 и Шаг 2. !!!ТЕОРИЯ. Согласно теории заработной платы последовательность расчетов не может быть произвольной. Есть виды расчетов: - первичные, результат которых не зависит от результата других видов расчета, они рассчитываются в первую очередь - вторичные, результат которых теоретически зависит от результата других видов расчета, рассчитываются во вторую очередь. В теории заработной платы, т.е. сверху, последовательность расчетов определяется специальным параметром – Приоритетом (число целого типа, как правило). В 8-ке, на уровне платформы никакого приоритета нет, последовательность расчетов определяется написанным программным кодом. И уже программный код может использовать или не использовать Приоритет, это зависит от решаемой задачи и желания программиста. Белоусов считает, что приоритет надо использовать только в ситуациях, когда без него нельзя обойтись. Приоритет – это дополнительная характеристика вида расчета, известная в момент конфигурирования и у каждого вида расчета приоритет строго единственный => хранится в реквизите плана видов расчета. При постановке задачи надо использовать приоритет, чтобы расставить порядок операций и последовательно реализовывать их в конфигураторе. Тогда и решение будет развиваться последовательно без исправлений. Для одной задачи может быть несколько вариантов расстановки приоритетов. Как в этой задаче. - Можно начать с расчета Оклада, он не зависит от второго вида расчета Пособия. Оклад – первичный вид расчета, Больничный – вторичный вид расчета. - А можно начать и с расчета больничного, т.к. по условиям данной задачи он не зависит от результата расчета Оклада. 2.Этап – настройка зависимостей между видами расчетов Нужна табличка из 5-ти колонок Вид Расчета Вытесняющий Базовый Ведущий Оклад Больничный Это используется при перерасчетах, в условии задачи их нет Больничный Нет, настройка в конфигураторе возможна только в одну сторону. В формулах мы базу не получаем => Базового нет Нет Учет по периоду действия (из перерасчетов) Получаем данные графика и настраиваем вытесняющие виды расчета = ++ - Подключаем Нет + Оклад – будут ли у оклада вытесняющие виды расчета? Вытесняющий – это тот, кто вытесняет, Вытесняемый – тот, кого вытесняют. Здесь следует проверить три условия: Условие 1 – Вытеснение должно следовать из постановки задачи. Вытеснение с точки зрения постановки задачи, табличка из фактического периода действия: - с верху, вытеснение – это конкуренция двух видов расчета за место на оси времени. Надо ответить на вопрос – Могут ли быть в одном в одном периоде сразу и оклад и больничный – ответ в условии задачи – «В случае получения сотрудником пособия начисление по окладу не производится», а это говорит о том, что когда есть оклад не может быть больничного и наоборот. Значит, сверху вытеснение есть – условие 1 выполнено Условие 2 – выяснить в какую сторону должно быть вытеснение !!!В жизни бывает взаимное вытеснение. Например, сотруднику в начале расчетного периода рассчитали оклад на весь месяц, а он взял и заболел – вывод – больничный вытесняет оклад. Второй пример, Сотрудник болеет, и будет болеть еще 10 дней. В начале расчетного периода ему так и посчитали 10 дней больничного и далее оклад, а он взял и выздоровел через 5 дней. Вывод – оклад вытесняет больничный. Вот и получается взаимное вытеснение. Попытка реализовать взаимное вытеснение на уровне платформы оказалась неудачной и поэтому вытесняющий вид расчета можно настроить только в одну сторону. В нашей задаче, мы решили что больничный будет вытесняющим у оклада. НО!!!! Нельзя забывать, что вытеснение может быть и в другую сторону и чтобы это сработало, то настройку должен выполнять пользователь. Он руками поправляет период действия больничного и оклада. На экзамене обратного вытеснения не будет. Условие 3 – больничный может быть вытесняющим для Оклада только в том случае, если он будет влиять на результат расчета оклада. Как это узнать, влияет или нет? 1. С точки зрения платформы вытеснение это перезапись таблицы фактического периода действия, а таблица фактического периода действия, в свою очередь, используется при получении фактического времени через данные графика. Ответ на этот вопрос такой – смотрим на формулу оклада, если в ней есть фактическое время, полученное через данные графика, то больничный будет вытесняющим для оклада !!!Теория. Почему фактическое время получают через данные графиков, если графики должны хранить плановую занятость. Пояснение. Получение времени – это определенный вид времени в определенном периоде и получается, что при получении количества рабочих часов и фактически отработанных часов мы используем данные графика, т.к. вид времени в обоих случаях один и тот же – данные графика. Но почему значения разные план и факт, а потому что разные периоды. Когда мы получаем количество рабочих часов, рабочее время, т.е. план, то мы получаем его за весь расчетный период (период начислений), за весь месяц, а количество фактического времени мы получаем за фактический период, а фактический период, это кусочки периода, которые хранятся в таблице фактического периода времени. Система, для получения фактического времени, сначала идет в таблицу фактического периода действия, из нее берет нужные строки, т.е. отрезки и внутри их использует плановые данные графика, суммирует их и получается фактическое время. Базовый – базу мы не получаем Ведущее – для перерасчетов, по условию задачи их нет Учет по периоду действия – период действия подключается по необходимости, если в алгоритме расчета используется период действия. Обратимся в видам периодов: 1. Существует строго два случая, когда надо подключать период действия: 1.1. Получение данных графика 1.2. Настройка вытесняющего вида расчета !!! Условия периода действия независимы друг от друга, для подключения механизма периода действия достаточно выполнения одного из условий!!! Смотрим формулы: - Получение данных графика – Да, при получении количества плановых и фактических часов. - Настройка вытесняющего вида расчета (или его вытесняют или он сам является вытесняющим) – Да, вытесняющий вид - больничный. Значит – подключаем период действия. Больничный. Вытесняющий – не будет, т.к. вытесняющий вид расчета можно настроить только в одну сторону. Если больничному листу понадобится вытеснение (ситуация, когда вышел с больничного раньше срока), то настройку вытеснения будет производить сам пользователь Базовый – Нет Ведущий – Нет Учет по периоду действия – Да Решение задачи в Конфигураторе Шаг 1. Решение задачи начинается с создания видов расчета в Плане видов расчета. Они могут создаваться в Конфигураторе – предопределенный и в пользовательском режиме. На экзамене, если ничего дополнительно не указано в задании, создавать виды расчета в режиме исполнения нельзя. В условии задачи может быть такая фраза – «Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета» - это и говорит о том, что могут быть не предопределенные виды расчета. Настройка для вида расчета «Оклад» 1. Место хранения – План видов расчета «ОсновныеНачисления». В каркасной вид расчета Оклад создан заранее 2. Период действия – есть (из таблички) 3. Зависимость от базы - нет (из таблички) Настройка для вида расчета «Больничный» 1. Место хранения – в каком плане видов расчета создавать больничный? Вытесняемый и вытесняющий виды расчета должны находиться в одном регистре – требования платформы. – План видов расчета «ОсновныеНачисления» 2. Учет по периоду действия – Да 3. Зависимость от базы – Нет Указать вытесняющий вид расчета для Оклада (из таблички) Шаг 2. Создание регистра расчета. Имя – Основные начисления. Период действия и Базовый период – как в плане видов расчета График – мы получаем данные графика, следовательно, его надо создать. В платформе к хранению графиков есть специальные требования: - графики должны храниться в непериодическом регистре сведений - иметь как минимум одно измерение с типом Дата - иметь как минимум один ресурс с типом Число В каркасной конфигурации объект «Графики работы» создан заранее. Такая структура регистра предполагает хранение одного графика, но очень часто может быть не один график в организации, соответственно может быть несколько измерений и несколько ресурсов. Настройка регистра расчета Ресурсы. Определяем из данных задачи – какие в ней имеются единицы времени. В формуле Оклада – количество часов, в формуле Больничного – количество дней. Значит, в регистре должно быть два ресурса – ЗначенияЧасы и ЗначенияДни. Измерения. А когда Измерение – тогда когда количество графиков (значений) заранее неизвестно. В условии задачи сказано – «Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам». Какое количество графиков будет не известно. Получается, одно Измерение обязательное с типом Дата и одно Измерение График, т.к. не известно точное количество графиков в организации. Виды графиков будем хранить в простом справочнике «Графики». Такая настройка дает возможность хранения данных по разным видам графиков в разных единицах измерения (времени). Так создали место хранения. Теперь запись и чтение. Заполнять графики можно руками, если не сказано другого. НО!!! Надо заводить как можно больше данных, как минимум за месяц, лучше за два, по каждому виду графика. Так если графиков 2, значения за 2 месяца, то получается надо завести руками 120 записей минимум. Это, несомненно, требует времени, которого на экзамене нет. Поэтому в каркасной конфигурации создана обработка – Заполнение графика. НО!!! Сразу ее можно использовать только если в задаче участвует один график. Если графиков больше, то в обработку следует внести изменения. Работа с обработкой начинается с формы. На нее надо добавить информацию о графике, для которого будет выполняться заполнение. НА ФОРМЕ. В список реквизитов добавить реквизит График и типом – СправочникСсылка.Графики и вынести его на форму. Команда «Заполнить», на форме, вызывает процедуру модуля формы «Выполнить обработку», которая в свою очередь вызывает экспортную процедуру из модуля объекта обработки «Заполнить график» и передает в нее параметры - (ВыборПериода.ДатаНачала, ВыборПериода.ДатаОкончания, ВыходныеДни, График) – последним параметром добавляем созданный реквизит График и в процедуре модуля формы и процедуре модуля объекта обработки - ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Далее следует поправить программный код в модуле объекта – создать отборы по графику Создать регистр расчета «Основные начисления» Значение графика – можно указать и дни, и часы – без разницы. Далее это свойство использоваться не будет, будем четко работать с ресурсами Регистратор – Назначение зарплаты Периодичность – Месяц, т.к. начисления производятся ежемесячно Заполнение графика в режиме исполнения Выбрать период Выбрать график Указать какие номера дней выходные (6 – суббота, 7 – воскресенье) !!!!Теория!!! Связь с графиком!!! Если в регистре расчета на закладке Основные, настроена информация по графику, то платформа уже знает какое количество часов в рабочем дне. Она идет в регистр сведений Графики работы, отбирает записи за нужное число и если графиков несколько, то суммирует часы (дни) и получается, что 1 марта – 16 часов и 2 дня. А если три графика, то она сложит 3 числа. Вывод. Настройка на закладке Основные – для решения с одним графиком, если графиков больше, то требуется настройка свойства «Связь с графиком» на закладке «данные» Палитры свойств. Это свойство дает платформе команду делать дополнительный отбор в регистре сведений «Графики работы» по колонке «График», значение для отбора система видимо должна взять из Справочника Графики. Потому что в данной колонке можно делать отбор только тем значениям, которые есть в регистре сведений «Графики работы» и Сотрудников там нет. А может быть? Может. Если в регистр «Графики работы» добавить Измерение Сотрудник, а не График, то отбор будет возможен, а означать это будет, что каждый сотрудник работает по своему графику. Если создано Измерение «Подразделение», то значит, каждое подразделение работает по своему графику. Настройка регистра расчета «Основные начисления» Ресурс – Результат есть всегда (Число, 12,2) Данные. Измерения: Сотрудник – Справочник Физ.Лица, запрет незаполненных, базу не получаем связь с графиком не настраиваем «Каждый сотрудник может работать одновременно в нескольких подразделениях компании, то есть совместительство допускается» Если такая фраза есть в задаче, то не задумываясь создаем второе Измерение – Подразделение – Справочник Подразделения, запрет незаполненных, базу не получаем связь с графиком не настраиваем Реквизиты График – для связи с регистром Графики работы. Данные – Связь с графиком – График. В жизни, а особенно на экзамене, расчетные задачи надо тщательно тестировать. Для подобного тестирования ПС предлагает добавить в регистр дополнительную информацию, чтобы протестировать правильно ли рассчитался Оклад и правильно ли посчитали больничный. Реквизиты (дополнительные) – они для решения не нужны, они для отладки Факт – фактическое время (Число, 5,2) Еще надо взять для больничного Константу, а для Оклада – начальное значение. Поместим эти значения в реквизит «Размер» Размер – Число, 10, 2 Документ «Начисление зарплаты». Все данные в регистр расчета вносят этим документом. В каркасной конфигурации данный документ создан и определена его структура. Все необходимые данные находятся в табличной части. Настройка документа «Начисление зарплаты» Реквизит «Вид расчета» в каркасной конфигурации имеет составной тип, используя все созданные планы видов расчета. В нашей задаче мы используем только один план – Основные начисления. Следует выключить составной тип и оставить только план видов расчета «Основные начисления» Реквизит «Размер» не используется, в нем будет храниться % премии, размер штрафа – удалить Реквизит «График» - создать, в нем для каждого Сотрудника будет указан конкретный график (пятидневка, шестидневка и т.д.) Закончена 7-ая лекция. 03.43.24 – обсуждение третьей задачи ОУ ДЗ 8-ая Лекция. Продолжение Учебная задача №1 Реализация проведения документа «Начисление зарплаты» Оперативное проведение – Запретить, т.к. это бессмысленно. За расположением документов внутри суток смотреть не надо, они все привязаны с одной точке. Будущим временем вводить документы надо. Это для всех документов связанных с расчетами. Сформировать движения конструктором. Поправить в конструкторе: ПериодДействияКонец – ДатаОкончания ПериодРегистрации – Дата (документа) Результат, Факт, Размер – не заполнять !!!Теоия. Методика проведения документа «Начисление зарплаты» состоит их двух этапов, что похоже на новую методику проведения и состоит их двух этапов. Этап 1. Получение необходимых данных для формирования наборов записей только на основании проводимого документа: - Получаем данные документа - Формируем набор записей - Записываем Привести Период действия конец к Концу Дня, т.к. время 0 часов, 0 минут, а после приведения 23.59.59 После набора движений - делаем запись в пакетном варианте, чтоб по концу процедуры не было записи, сбрасываем флаг. Этап 2. Расчеты. Расчет по окладу Для того чтобы произвести расчет оклада, согласно формуле, нам надо получить срез для начального размера оклада и данные графика для рабочих часов и фактических часов. Это нужно сделать для всех сотрудников, всех подразделений заведенных в табличную часть. Для этого до цикла, чтобы избежать ошибки «Запрос в Цикле», формируем запрос. Оклад – хранится в периодическом регистре сведений «Сведения о Сотрудниках». Он уже создан в каркасной конфигурации, и в рамках данной задачи в нем ничего менять не надо. При формировании запроса следует понимать, что мы не можем сразу работать с виртуальной таблицей СрезПоследних регистра «Сведения о сотрудниках», т.к. на данный момент нам не известен список сотрудников и подразделений, для которых надо получать оклад. Поэтому начинаем с данных графика. !!!Теория!!! Для получения данных графика есть одноименная виртуальная таблица регистра расчета «Основные начисления» - Данные графика. Виртуальная таблица «Данные графика» формируется следующим образом: - берется целиком регистр расчета с названия, которого начинается таблица – регистр Основные начисления, т.е.: - все его колонки с «Период регистрации» по «Размер» - и его все строки начиная с момента ведения учета Для каждой строки рассчитывается плановая занятость в разных периодах и для каждого ресурса регистра «Графики работы»– это поля Значение… Так как мы записали сформированные движения, то они будут доступны для запроса в виртуальной таблице. Чтобы получить записи именно данного набора, то следует установить отбор по Регистратору, для расчетов этот отбор обязателен. Так мы получаем все записи данного набора, а нам надо записи касающиеся Оклада, следовательно, устанавливаем отбор еще и по «Вид расчета». Колонки: - ЗначениеЧасыФактическийПериодДействия – для получения количества фактически отработанных часов - ЗначениеЧасыПериодДействия - для получения плановой занятости (период действия целиком, количество рабочих часов в периоде) - НомерСтроки (он же ключ записи вместе с регистратором, по регистратору мы отфильтровались на равенство, остался номер строки) - для того чтобы внутри цикла, стоя на строке набора найти соответствующую строку выборки Получается следующее, что в одну строку выборки мы отобрали данные из регистра расчета «Основные начисления» (Номер строки), и данные из регистра Графики работы – (ЗначениеЧасы) - значит это соединение, это Левое соединение к регистру расчета и если данные графика будут не заполнены, то поля ЗначенияЧасы.. будут иметь значение NULL, а они у нас в арифметической формуле. Следовательно, делаем проверку на ЕСТЬNULL. Так мы получили данные для расчета. Для того чтобы получить срез нам нужны данные по сотрудникам и подразделениям, которые указаны в табличной части документа. К документу обращаться смысла нет, так как мы записали набор данных в регистр «Основные начисления». Отсюда и возьмем поля Сотрудник и Подразделение. Дадим псевдонимы полям Значение: - фактический – отработано - период действия – норма Поместим полученные данные во временную таблицу и проиндексируем по полям соединения – Сотрудник и Подразделение Вторая часть запроса Берем временную таблицу Таблицу срез последних – для нее прописываем параметры виртуальной таблицы Период – начало периода В отборе выбрать поля Сотрудник и Подразделение из временной таблицы «Дополнительно» включить свойство выборки – «Без повторяющихся» Закладка «Связь» - установить, поскольку в одной строке данные из разных таблиц. и на закладке Поля. Берем номер строки и значения графика, по сотруднику и подразделению у нас соединение. Берем Оклад, в связи он справа, следовательно, проверяем на ЕСТЬNULL и дадим ему псевдоним НачальныйОклад Запрос сформирован. Установим параметры запроса Начало месяца – это функция НачалоМесяца от Даты документа Переименуем ВыборкаДательныеЗаписи в ВыборкаДляОклада, чтобы потом различать выборку для больничного. ВыборкаДляОклада.Сбросить()** - !!!Разобраться – перемещение в начало выборки Для метода НайтиСледующий – можно использовать структуру, если поиск будет происходить и по одной колонке и сразу по нескольким, а можно использовать Значение – поиск только по одной колонке. Само значение – это номер строки, поскольку мы внутри Цикла, то СтрокаНабора.НомерСтроки. Второй параметр – имя колонки, как она называется в запросе, в кавычках «Номер строки». Набор записей в регистре "Основные начисления" Стою на этой записи, для нее надо найти строку в выборке ВыборкаДля Оклада ВыборкаДляОклада. НайтиСледующий(Ст рокаНабора.НомерС троки, "НомерСтроки"); Проверять на пустоту не надо, т.к. данные графика гарантируют наличие записи. И переходим непосредственно к расчету. Результат = Если норма = 0, то и результат 0 , иначе Размер/Норма*Отработано Факт (реквизит из регистра) = отработано Размер (реквизит из регистра) = начальный оклад Теперь расчеты надо записать Истина – это параметр «Только запись» Если включен режим по периоду действия, то при вызове записи происходит одновременная запись в две таблицы – таблицу Регистра Расчета и в таблицу фактического периода действия. Это и происходит при пакетной записи, у нас после формирования набора записей - Записать(). Когда же мы делаем расчет, то меняются значения только ресурсов и реквизитов регистра расчета, а таблица фактического периода не изменилась – здесь нет ресурсов, здесь периоды. Поэтому когда мы делаем запись повторно, то не надо перезаписывать таблицу фактического периода действия. Вот второй параметр метода Записать – Истина (ТолькоЗапись) – и говорит о том, что запись надо сделать только в регистр расчета. ** - ВыборкаДляОклада.Сбросить(); - дело в том, что этот метод после найденной записи в правой таблице так на этой записи и стоит, а каждый раз искать надо с самого начала. Дело в том что цикл Для каждого не известно как будет выбирать строки, все они могут быть в разнобой Тестирование в режиме исполнения Заполним регистр «Сведения о сотрудниках». Дату возьмем 01.01.2023 Заведем документ «Начисление зарплаты» Проведение документа – движения в регистре «Основные начисления» Расчет больничного листа Создать Константу – СтавкаБольничного (Число, 10, 2) В целом алгоритм как и для расчета Оклада: - Цикл Для каждого для Больничного - формирование запроса для получения – ВыборкаДляБольничного - установка параметров запроса - Метод Сбросить() - Метод НайтиСледующий() - Расчет больничного по формуле - Запись значения для реквизитов регистра – Факт, Размер Проведение документа – движения в регистре «Основные начисления» Больничный 4 дня по 8 часов = 32 часа Факт 184-2=152 часа факт для Бельдыева, 400 рублей за больничный Бельдыев работает в двух подразделениях (у него совместительство). Болеет он только в одном подразделении. Нельзя сделать вытеснение по одному больничному для двух подразделений При такой формулировке – «Документ в расчетном периоде может быть один (сразу для всех видов расчета), а может быть несколько (по одному для каждого отдельного вида расчета).» - надо делать проверку по виду расчета, это если претендуем на 5. В документе не может быть разных видов расчета. Получить список видов расчета из документа и делать проверку. Еще для тех, кто претендует на 5 – в коде образовалось многократные записи (две одинаковые строки), так быть не должно, одну надо удалить. Речь о строке , она есть и после оклада и после больничного. Закомментируем его после расчета Оклада. Из условия – «Следует учесть, что данные о болезни могут вводиться в систему задним числом.» ТЕОРИЯ!!! В теории заработной платы есть требования: – нельзя перейти на следующий расчетный период (апрель) не сделав расчет за текущий месяц (март) - нельзя исправлять данные прошлых периодов На практике выходит так, что исправлять в прошлых периодах все равно приходится. Контроль за запретом исправлений прошлых периодов на уровне платформы нет. Теоретически можно ввести данные задним числом в любом период, если они не вытесняют другие, т.е. если место на оси времени свободно, то нет никаких запретов. Ограничение существует только для вытесняющих видов расчета. Бельдыев болел в марте, при вводе документа поставили дату 1 апреля. Документ проведется, но - нет Результата, потому что нет Факта, а факта нет, потому что нет фактического периода, т.е. нет дней болезни. А получилось так из-за того, больничный не встал на положенное ему место на оси времени и не вытеснил Оклад. В нашем решении нужно предусмотреть данную ситуацию, чтобы при вводе больничного другим месяцем поля Результат и Факт заполнялись. Данную ситуацию следует обрабатывать, только если в задаче есть упоминание о том, что больничный может вводиться задним числом и есть вытесняющий вид расчета, потому что бывает, что фраза есть, а вытесняющего нет. Если этого нет (запись и наличие вытесняющего расчета), то и обрабатывать не надо. На рисунке место на оси времени занято, и чтобы больничный занял это место, его надо освободить. Запрет на внесение исправленийв прошлом периоде в основном связан с тем, что необходимо хранить историю ввода данных, что было, что стало. В жизни, везде где внесения изменений в прошлый период запрещены, а исправить надо, то надо понимать, что исправления возможны, но только при сохранении истории. И тогда появился следующий подход: - непостредственно в прошлом ничего не изменяется, как был оклад за октябрь, так эта информация в базе и осталась - вводится дополнительная информация, которая отменяет старые действия – операция Сторнирования - чтобы место на оси времени, нужном отрезке освободилось, необходимо ввести сторно записи, отменяющие действие оклада на данном отрезке записи - после введения сторно записи, система считает, что отрезок освободился и размещает на нем больничный Все это верно для цельного прошлого периода, т.е. если он уже не порезан на кусочки другими вытесняющими расчетами и частичным вводом данных. (Статья на ИТС) Если нужный отрезок оси времени уже состоит из кусков, то надо иметь информацию какие отрезки сторнировать, с какими границами эти отрезки и сколько их. Для решения этой проблемы в платформе имеется механиз дополнений – дополнений потому что сторно записи добавляются. Механизм построен на автоматическом заполнен Механизм построен на заполнении специальной таблицы, которая создается платформой автоматически – это таблица Дополнений. !!!Обязательно надо посмотреть эту таблицу в отладчике. Формирование таблицы Дополнений: - берется сформированный набор записей (что записаны в регистр, см. в начале кода) - для каждой записи заполняются три колонки в таблице: Колонка 1 – Период регистрации сторно записи Колонка 2 – Период действия Начало сторно записи Колонка 3 – Период действия Конец сторно записи