d9e5a92d

Конфигурирование в системе 1С:Предприятие 8.0 Решение задач расчета зарплаты и учета персонала

Введение

Настоящий курс является продолжением курса «Введение в конфигурирование в системе «1С:Предприятие 8.0». Основные объекты».

Для успешного прохождения курса требуются знание основных объектов и механизмов системы «1С:Предприятие 8.0».

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

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

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





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

Поставим задачу для конфигурирования. Необходимо на базе конфигурации от предыдущего курса «Введение в конфигурирование в системе «1С:Предприятие 8.0». Основные объекты» организовать простейший расчет зарплаты сотрудников организации.

Для этого нужно:



Решение задачи



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Сначала попытаемся представить, как можно было бы решить задачу, используя уже известные нам объекты 8.0 (справочники, документы, регистры сведений и т.д.).

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



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



Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач

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

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

Также представим, что регистр накопления «Зарплата» мы

преобразовали в похожий объект и назвали его регистром расчета

(перед этим также добавив «регистру накопления» ряд важных

свойств (полей), например, период регистрации, период действия,

базовый период, фактический период действия (нечто похожее на

подчиненный справочник), вид расчета (тип

ПланВидовРасчетаСсылка...), перерасчеты и др.).

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

Назовем рассмотренную схему Решением 1. Потому что в системе «1С:Предприятие 8.0» существует возможность реализовать поставленную задачу еще одним способом (назовем это Решением 2).

10

В документе реквизитам типа «СправочникСсылка...» изменили тип на «ПланВвдовРасчетаСсылка...». Документ при проведении вводит в регистр записи.



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Решение задачи

Специфика Решения 2 состоит в том, что и планов видов расчета, и регистров расчета в системе «1С:Предприятие 8.0» может быть много (их количество не ограничено).

Различающиеся по структуре учета начисления и удержания отражаются в разных регистрах расчета.

При этом каждый регистр расчета связан со «своим» планом видов расчета. Свойства объектов обеспечивают взаимное влияние записей

раЗНЫХ регистров расчета. План видов расчета Начисления и удержания!

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Рассмотрим каждое из рассмотренных решений задачи подробнее.

11



Решение 1. Один план видов расчета и один регистр расчета

Планы видов расчета. План видов расчета ВсеВидыРасчета

Планы видов расчета предназначены для описания множеств однотипных видов расчета. Под видами расчета подразумеваются начисления, удержания и выплаты. Виды расчета являются элементами плана видов расчета.

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

Рассмотрим объект план видов расчета на примере плана видов расчета «ВсеВидыРасчета».

Основные свойства плана видов расчета

Создадим новый план видов расчета и зададим его основные свойства:

Параллельно создадим новое перечисление «ТипыВидовРасчета».

Перечисление ТипыВидовРасчета

Определим три значения перечисления:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Замечание. К Начислениям будем относить виды расчета Оклад, ПремияПроцентом и Отпуск, к Удержаниям Штраф, а к Выплатам Выплата (этот вид расчета не относится ни к начислениям, ни к удержаниям).

Расчетные свойства плана видов расчета

На закладке Расчет уточняются три свойства плана видов расчета:

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

13



Конфигурирование в системе "1С: Предприятие 8.0". Решение расчетных задач

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

Установим признаки как показано на картинке.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


14



Решение задачи

Формы плана видов расчета

Планы видов расчета могут иметь формы: формы списка, формы выбора и формы вида расчета.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


И ФормуВидаРасчета.

Создадим Форму Списка.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


На форме вида расчета разместим командную панель с закладками Основное и Виды расчета. Через меню «Форма» - «Размещение данных» поместим на закладке Основное реквизит Тип, а также поля Код и Наименование.

На закладке Виды расчета разместим предопределенные табличные части плана видов расчета и флажок Базовый период как период действия как отображено на картинке.

Предопределенные табличные части плана видов расчета

Планы видов расчета содержат следующие предопределенные табличные части:

Базовые виды расчета,

15



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

В табличной части Базовые виды расчета указываются виды расчета, которые определяют состав расчетной базы текущего вида расчета (например, для «ПремияПроцентом» базовым видом расчета является «Оклад»).

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

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

Вытесняющие виды расчета

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

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

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

Понятие «вытеснение» рассмотрим позже.

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

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

16



Решение задачи

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

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

Предопределенные виды расчета

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

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


17

Создайте следующие предопределенные виды расчета и определите их свойства:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе " 1С: Предприятие 8.0". Решение расчетных задач

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Заполним всем предопределенным видам расчета табличную часть Базовые виды расчета следующими данными:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Остальные табличные части заполним позже.

Виды расчета - объекты информационной базы

Откройте план видов расчета «ВсеВидыРасчета» в режиме «С:Предприятие».

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

Вид расчета это объект данных, хранимый в информационной базе (так же как и элемент справочника, счет в плане счетов и т.д.).

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

Создадим в режиме исполнения новый вид расчета «Премия к юбилею».

18



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Решение задачи

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

нижнем углу.

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

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

Объекты регистры расчета служат для накопления информации о периодических расчетах.

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

Создадим новый регистр расчетов «РасчетыВсе». Основные свойства:

19



Полный набор свойств записи регистра расчета посмотрите в Синтаксис -Помощнике:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Период действия: установить флажок. Флажок

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

записи с «Окладом». Этот флажок (свойство) определяет

доступность свойств записи регистра расчета:

ПериодДействия, ПериодДействияНачало,

ПериодДействияОкончание, а также доступность свойства График регистра расчета.

Базовый период: установить флажок. Флажок устанавливаем, т.к. в регистре расчета будут храниться записи с «ПремиейПроцентом». Этот флажок (свойство)

20



Решение задачи

определяет доступность свойств записи регистра расчета: БазовыйПериодНачало, БазовыйПериодОкончание.

Разберемся подробней со следующими свойствами записи регистра расчета:

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

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

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

Определяется период регистрации в момент ввода информации в регистр из документа-регистратора.

Период действия: ПериодДействияНачало,

ПериодДействияОкончание. Свойство ПериодДействия

Каждая запись регистра расчета характеризуется понятием период действия записи. Период действия записи определяется свойствами записи (точнее свойствами объекта РегистрРасчетаЗапись.о) ПериодДействияНачало и ПериодДействияОкончание.

ПериодДействияНачало - это дата начала периода действия записи. ПериодДействияОкончание - это дата окончания периода действия.

Существует еще одно свойство объекта РегистрРасчетаЗапись.о -ПериодДействия.

Замечание. Тут не должно возникнуть путаницы. Понятие «период действия», определяемое свойствами ПериодДействияНачало и ПериодДействияОкончание объекта РегистрРасчетаЗапись.о и свойство ПериодДействия объекта РегистрРасчетаЗапись.о - это разные вещи.

Свойство ПериодДействия - это дата, которая принимает дискретные

значения в зависимости от периодичности регистра расчета. Значение

свойства ПериодДействия приводится к началу периода (в нашем

случае месяца) от даты ПериодДействияНачало.

ПериодДействияНачало может и не совпадать со значением свойства ПериодДействия (например, когда запись действует с 10.01.03 по

21



20.01.03, ЛериодДействияНачало будет равен 10.01.03, а ПериодДействия - 01.01.03).

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

Замечание. В 7.7 период действия имел тип «период журнала расчетов», а в 8.0 это дата.

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

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

БазовыйПериодНачало - дата начала базового периода записи регистра.

БазовыйПериодОкончание - дата окончания базового периода записи регистра.

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

Представим рассмотренные понятия в виде схемы на примере «Отпуска», введенного в апреле и действующего с 10.04 по 20.05.

22



Решение задачи



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Замечание 1. На представленной схеме следует внимательней

отнестись к понятиям «период действия» и «ПериодДействия». Под

«периодом действия» понимается период действия начисления или

удержания, в примере начисление отпуск действует с 10.04 по 20.05.

«ПериодДействия» это свойство объекта

РегистрРасчетаЗапись.имя. Это свойство всегда определяется свойством «ПериодДействияНачало» и всегда совпадает с датой начала периода, в котором лежит «ПериодДействияНачало».





Частичное попадание записей регистра расчета в базовый период

На представленной выше схеме рассмотрен достаточно простой пример, в котором базовый период кратен периоду регистра расчета (в нашем случае месяц). Рассмотрим случай, когда, базовый период не кратен периоду регистра расчета. Например, существует какая-нибудь "особая" премия (действующая в мае), которая имеет базовый период с 15.04.2003 по 15.04.2003 (для примера также можно привести следующие варианты базовых периодов: 2 последних недели, первая и последняя неделя предыдущего месяца, два последних дня, понедельники, и т.д.). При получении базы система должна сложить результаты всех записей, попавших в этот период.

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

Попасть в базовый период записи могут «по периоду регистрации» или «по периоду действия».

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



23



Конфигурирование в системе "1 С: Предприятие ^0"'. Решение расчетных задач

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

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

В нашем случае в базовый период «особой» премии не попадет ни одна запись, поскольку период с 15.04.2003 по 15.04.2003 не охватывает ни одну дату начала периода регистра расчета.

Представим рассмотренные понятия в виде схемы.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Напомним, что период действия - это интервал дат, определяемый свойствами ПериодДействияНачало и ПериодДействияОкончание.

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

Если же какая-то запись попадает в базовый интервал только частично, то неправомерно брать ее результат целиком. В то же время совсем ее не учитывать тоже нельзя. Значит нужно как-то определить, какая часть результата должна быть взята при расчете базы. Чтобы придать «дискретность» таким результатам существует понятие «График».

График - это непериодический регистр сведений, который задает «веса» для каждого дня (а может быть даже для каждого часа). Например, в графике указаны продолжительности каждого дня в часах - пн-чт - 8 часов, пт-7 часов, сб-вс - 0 часов. Если регистр расчета поддерживает период действия (основан на соответствующем плане видов расчета), то ему обязательно должен быть указан график (свойство Трафик регистра расчета мы рассмотрим ниже).

24



Решение задачи

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

Например, сумма по окладу в апреле была 1000 руб. Если базовый период майской «особой» премии определен с 15.04.2003 по 15.04.2003, то от суммы по окладу будет взята только часть результата (45.45 = 1000/22, где 22 - количество рабочих дней по пятидневке).

Представим рассмотренные понятия в виде схемы.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Замечание. На данной схеме предполагается, что период действия оклада совпадает с фактическим периодом действия (понятие фактический период действия рассмотрим ниже).

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

Разберемся со свойством График регистра расчета. Перед тем, как устанавливать это свойство нам придется создать, как минимум, еще один объект - регистр сведений «Графики работы».

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

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

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

25



Конфигурирование в системе " 1С: Предприятие 8.0". Решение расчетных задач

Справочник «ГрафикиРаботы»

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

Основные свойства справочника:

Имя «ГрафикиРаботы», Реквизиты:

о ТипГрафика тип

«ПеречислениеСсылка.ТипыРабочихГрафиков». Создадим перечисление «ТипыРабочихГрафиков» со значениями:



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала










Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Формы:

о ВыходныеДни типа Строка длиной 7 символов. Сюда будем записывать порядковые номера выходных дней недели.

о ФормаСписка



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


26



Решение задачи

Рассмотрим подробно процесс создания элементов диалога.

  1. Вставим в форму элемента реквизиты Код, Наименование,

    ТипГрафика.
  2. Создадим на закладке Реквизиты новый реквизит с именем

    Календарь и определим его тип:

    «РегистрСведенийСписок.ГрафикиРаботы».

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


  1. Вставим элемент управления Табличное поле и зададим ему

    имя ТабличноеПолеКалендаря. Свяжем Табличное поле с реквизитом

    Календарь. В разделе свойств Использование табличного поля

    установите флажок Только просмотр.
  2. Вставим элемент управления Поле списка с именем

    ДниНедели. На закладке Использование поставим флажок

    Отображать пометку. Тип значения поле списка СписокЗначений.

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

27

Замечание. СписокЗначений - это объект, который можно представить себе как таблицу вида:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала




Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач

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

Процедура ПриОткрытии()

ТекущийДень = НачалоНедели(ТекущаяДата()); // начнем с понедельника сДлинаСуток = 86400; // в секундах Для Сч = 1 По 7 Цикл

НазваниеДняНедели = Формат(ТекущийДень,"ДФ=дддд");

ДниНедели.Добавить(Строка(ДеньНедели(ТекущийДень)),Врег(Лев(НазваниеДняН едели, 1 ))+Сред(Название ДняНедели,2));

ТекущийДень = ТекущийДень + сДлинаСуток; КонецЦикла;

// расставляем пометки для выходных дней графика Для Сч = 1 По СтрДлина(ВыходныеДни) Цикл

ДниНедели.НайтиПоЗначению(Сред(ВыходныеДни,Сч,1)).Пометка =

Истина;

КонецЦикла;

//выставляем отбор в списке дней календаря (регистр сведений):

// отбираем дни нашего графика

Календарь.Отбор.ГрафикРаботы.Значение = Ссылка;

Календарь.Отбор.ГрафикРаботы.Использование = Истина;

// отбираем дни текущего месяца

УстановитьОтборВКалендаре(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

КонецПроцедуры

Процедура

УстановитъОтборВКалендаре(ДатаНачалаИнтервалаКалендаря,ДатаОкончанияИнтервалаК алендаря)

Календарь. Отбор. Дата.ЗначениеС = ДатаНачалаИнтервалаКалендаря; Календарь.Отбор.Дата.ЗначениеПо = ДатаОкончанияИнтервалаКалендаря;

Если обЗначениеНеЗаполнено(ДатаНачалаИнтервалаКалендаря) и

обЗначениеНеЗаполнено(ДатаОкончанияИнтервалаКалендаря) Тогда

Календарь.Отбор.Дата.Использование = Ложь; Иначе Если обЗначениеНеЗаполнено(ДатаНачалаИнтервалаКалендаря) Тогда

Календарь.Отбор.Дата.ВидСравнения =

ВидСравнения.МеньшеИлиРавно;

ИначеЕсли обЗначениеНеЗаполнено(ДатаОкончанияИнтервалаКалендаря)

Тогда

Календарь.Отбор.Дата.ВидСравнения =

ВидСравнення.БольшеИлиРавно;

Иначе

28



Решение задачи

Календарь.Отбор.Дата.ВидСравнения ВидСравнения.ИнтервалВключаяГраницы;

КонецЕсли;

Календарь.Отбор.Дата.Использование = Истина; КонецЕсли; КонецПроцедуры

Комментарии.

Заполняем список с пометками названиями дней недели, начиная с понедельника. В качестве значения указываем порядковый номер дня недели, а в качестве представления - представление даны в формате "ДФ=дддд" (такой формат означает представление даты в виде строкового названия дня недели).

Замечание. Обратите особое внимание на то, что для перехода на следующую дату к текущей дате необходимо прибавить 86400 секунд (60*60*24), т.к., если к дате прибавлять число, то это число воспринимается как число секунд.

После заполнения списка датами, устанавливаем пометки. Признаки пометок хранятся в реквизите ВыходныеДни (тип Строка длиной 7) в виде номера дня недели, который является выходным. Поэтому анализируем строку ВыходныеДни, и отмечаем в списке значения, соответствующие выходным, пометками.

Затем через реквизит Календарь (тип

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

Механизм установки отбора в регистре сведений ГрафикиРаботы по

интервалу дат реализован в процедуре

УстановитъОтборВКалендаре(). Мы будем вызывать алгоритм установки отбора по интервалу дат из нескольких мест модуля, поэтому и выделяем этот процесс в отдельную процедуру. В процедуре УстановитьОтборВКалендаре() производим анализ заполненности значений начала и окончания интервала дат. В зависимости от варианта, выбираем тот или иной вид сравнения для установки отбора.

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

Функция обЗначениеНеЗаполнено(Значение) Экспорт



шрование в системе " 1С:ПЈедприятие^8.0". Решение^асчетных задач

Результат = Ложь;

ТипЗначения = ТипЗнч(Значение);

// Сначала примитивные типы

Если Значение = Неопределено Тогда

Результат = Истина; ИначеЕсли Значение = NULL Тогда

Результат = Истина; ИначеЕсли ТипЗначения = Тип("Строка") Тогда

Если СокрЛП(Значение) = "" Тогда Результат = Истина;

КонецЕсли; ИначеЕсли ГипЗначения = Тип("Число") Тогда

Если Значение = 0 Тогда

Результат = Истина;

КонецЕсли; ИначеЕсли ТипЗначения = Тип("Дата") Тогда

Если Значение = Дата('00010101') Тогда Результат = Истина;

КонецЕсли; ИначеЕсли ГипЗначения = Тип("Булево") Тогда

Результат = Ложь; // Булево будем считать не пустым // Для остальных будем считать значение пустым, если оно равно // дефолтному значению своего типа Иначе

Если Значение = Новый(ТипЗначения) Тогда Результат = Истина;

КонецЕсли; КонецЕсли;

Возврат Результат; КонецФункцнн

Комментарии.

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

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

Процедура ДниНеделиПриИзмененииПометки(Элемент)

30



Решение задачи

ЭлементСписка = Элемент. ТекущаяСтрока; Если ЭлементСписка.Пометка Тогда

Если Найти(ВыходныеДни,ЭлементСписка.Значение) = 0 Тогда ВыходныеДни = ВыходныеДни+ЭлементСписка.Значение

КонецЕсли; Иначе

ВыходныеДни=СтрЗаменить(ВыходныеДни,ЭлементСписка.Значение,""); КонецЕсли; КонецПроцедуры

Комментарии.

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

  1. Вставим элемент управления Командная панель с именем

    КоманднаяПанельКалендаря. В качестве источника действий укажем

    элемент управления ТабличноеПолеКалендаря.
  2. На панели КоманднаяПанельКалендаря создадим две

    кнопки:

о «Интервал», действие:

ИзменитъИнтервалПоказаКалендаръ. При

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

о «Заполнить», действие:

КоманднаяПанельКалендаряЗаполнить. При

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

7. В модуль формы вставим соответствующие процедуры-

обработчики событий:

о ИзменитьИнтервалПоказаКалендаря()

Процедура ИзменитьИнтервалПоказаКалендаря()

ИнтервалПоказа = Новый НастройкаПериода(); ИнтервалПоказа.ДатаНачала = Календарь.Отбор.Дата.ЗначениеС;

ИнтервалПоказа.ДатаОкончания = Календарь.Отбор.Дата.ЗначениеПо; ИнтервалПоказа.ВариантНачала = ВариантГраницыИнтервала.КонкретнаяДата; ИнтервалПоказа.ВариантОкончания = ВариантГраницыИнтервала.КонкретнаяДата; Если ИнтервалПоказа.Редактировать() Тогда

УстановитьОтборВКалендаре(ИнтервалПоказа.ПолучитьДатуНачала(),ИнтервалПо

каза.ПолучитьДатуОкончания());

31



Конфигурирование системе "1С:Предприятие 8.0". Решение расчетных задач

КонецЕслн; КонецПр» цедуры

Комментарии.

Сначала готовим объект для выбора интервала (создаем объект НастройкаПериода), затем вызываем диалог для выбора интервала (ИнтервалПоказа.РедактироватъО) и обращаемся к процедуре УстановитьОтборВКалендаре() для установки назначенного отбора по датам в регистре расчетов ГрафикиРаботы.

о КоманднаяПанелъКалендаряЗаполнитъ()

Процедура КоманднаяПанельКалендаряЗаполнить(Кнопка) ЕслиЭтоНовый() Тогда

Предупреждение("Перед заполнением график необходимо записать!");

Возврат; КонещЕсли;

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

ЗалолнитьКалендарьЗаИнтервал(ИнтервалПоказа); Иначе

Воз врат; КонецЕсли; КонецПроцедуры

Комментарии.

В данной процедуре проверяем, записан ли текущий элемент

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

выбора даг (вызываем диалог для выбора интервала) и, если интервал

дат установлен, вызываем процедуру

ЗаполнитъКалендаръЗаИнтервал(ИнтервалПоказа), в которой и

заполняем регистр сведений «ГрафикиРаботы» в соответствии с

назначенными условиями. Процедуру

ЗаполнитьКалендаръЗаИнтервал() рассмотрим ниже.

8. Процедуру ЗаполнитьКалендарьЗаИнтервал() разместим в модуле объекта (поставим в строку объявления процедуры ключевое слово Экспорт, чтобы процедура заполнения календарей была доступна не только из модуля объекта):

Процедура ЗаполнитьКалендарьЗаИнтервал(Интервал) Экспорт сДлинаСуток = 86400; // в секундах

32



Решение задачи

ДатаНачалаИнтервала = Интервал,ПолучитьДатуНачала(); ДатаОкончанияИнтервала = Интервал.ПолучитьДатуОкончания(); ТекущийДень = ДатаНачалаИнтервала;

НаборЗаписейКалендарь РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();

НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Значение = Ссылка; НаборЗаписейКалендарь.Отбор.ГрафикРаботы.Использование = Истина; НаборЗаписейКалендарь.Прочитать();

ЗаписейВНаборе = НаборЗаписейКалендарь.Количество()-1;

Для инд = 0 по ЗаписейВНаборе Цикл

ДеньКалендаря = НаборЗаписейКалендарь[инд];

Если ДеньКалендаря.Дата ДатаНачалаИнтервала Тогда

Продолжить ИначеЕсли ДеньКалендаря.Дата = ТекущийДень Тогда

Если ДеньЯвляетсяРабочим(ТекущийДень) Тогда

ДеньКалендаря.Значение = 1;

Иначе

ДеньКалендаря.Значение = 0;

КонецЕсли;

ТекущийДень = ТекущийДень + сДлинаСуток; Иначе

Пока ТекущийДень

Мин(ДеньКалендаря.Дата,ДатаОкончанияИнтервала) Цикл

НовыйДень = НаборЗаписейКалендарь. Добавить(); НовыйДень.ГрафикРаботы = Ссылка; НовыйДень.Дата = ТекущийДень; Если ДеньЯвляетсяРабочим(ТекущийДень) Тогда

НовыйДень.Значение =

1;

Иначе

НовыйДень. Значение =

0;

КонецЕсли;

ТекущийДень = ТекущийДень + сДлинаСуток; КонецЦикла;

Если ДеньКалендаря.Дата ДатаОкончанияИнтервала Тогда

Прервать ИначеЕсли ДеньЯвляетсяРабочим(ТекущийДень) Тогда

ДеньКалендаря.Значение =

1;

Иначе

33



ДеньКалендаря.Значение =

0;

КонецЕсли;

ТекущийДень = ТекущийДень + сДлинаСуток; КонецЕсли;

КонецЦикла;// по записям набора Пока ТекущийДень ДатаОкончанияИнтервала Цикл

НовыйДень = НаборЗаписейКалендарь.Добавить();

НовыйДень.ГрафикРаботы = Ссылка;

Если ДеньЯвляетсяРабочим(ТекущийДень) Тогда

НовыйДень.Значение = 1;

Иначе

НовыйДень.Значение = 0;

КонецЕсли;

НовыйДень.Дата = ТекущийДень;

ТекущийДень = ТекущийДень + сДлинаСуток; КонецЦикла;

НаборЗаписейКалендарь.Записать(); КонецПроцедуры

Функция ДеньЯвляетсяРабочим(ПроверяемаяДата)

Возврат ?(Найти(ВыходныеДни,Строка(ДеньНедели(ПроверяемаяДата))) 0,Ложь,Истина);

КонецФункции

Комментарии.

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

Регистр сведений «ГрафикиРаботы»

Назначим основные свойства регистра:

Измерения:

34



Решение задачи ТИП

Ресурсы:

о «ГрафикРаботы»

«СправочникСсылка.ГрафикиРаботы». о «Дата» типа Дата.

о «Значение» типа Число длиной 5, точностью 2.



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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Связь Регистра расчетов с графиком работы

Теперь мы можем назначить свойству График значение регистра сведений «ГрафикиРаботы».

Кроме этого необходимо заполнить свойства:

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

35



Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






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

Разберемся с остальными свойствами регистра расчета. Измерения:

Ресурсы:

«Результат» тип Число длиной 10 разрядов точностью 2;

Реквизиты:

«График» тип данных

«СправочникСсылка.ГрафикиРаботы». В разделе свойств Расчет данного реквизита заполним поле Связь с графиком значением «ГрафикРаботы» как показано на рисунке.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

36



Решение задачи

ПолучитьДанныеГрафика() будет автоматически вычислять количество отработанных дней по указанному в реквизите «График»

значению.

«ПараметрРасчета» тип Число длиной 10 точностью 2.

Формы регистра расчетов

Создадим форму списка регистра расчета.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

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

37



Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Представим основные свойства и методы данных объектов в виде таблиц.

38



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала








Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Решение задачи

Запись видов расчета в регистр расчета. Документ «НачислениеЗарплатыВсей»

Разберемся с тем, каким образом вводить записи в регистр расчета.

Для ввода информации в регистр расчета чаще всего используются

документы.

Создадим документ «НачислениеЗарплатыВсей». Основные свойства:

Имя: «НачислениеЗарплатыВсей». Реквизиты:

о «ПериодРегистрации» тип Дата. Табличные части:

о Список

»,

Формы:

о ФормаСписка,

о ФормаДокумента.

49



Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






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

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



Процедура ПериодРегистрацииРегулирование(Элемент, Направление,

СтандартнаяОбработка)



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


// Вставить содержимое обработчика. СтандартнаяОбработка=Ложь; Если Направление = 1 Тогда

ПериодРегистрации = КонецМесяца(ПериодРегистрации)+1; Иначе

ЛериодРегистрации = НачалоМееяца(ПериодРегистрации-1);

КонецЕсли;

КонецПроцедуры

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

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

Процедура СписокСотрудникПриИзменении(Элемент) Запрос = Новый Запрос("

50



Выбрать Сотрудник.Наименование, Подразделение, Должность

Из РегистрСведений.Сотрудники.СрезПоследних(парамДата, Сотрудник = парамСотрудник)

Где Состояние = парамСостояние

I");

Запрос.УстановитьПараметр("парамДата", Дата);

Запрос.УстановитьПараметр("парамСотрудник", Элемент,Значение);

Запрос.УстановитьПараметр("парамСостояние", Перечисления.СостоянияФизлица.Работает);

МестаРаботы = Запрос.Выполнить().Выгрузить(); Если МестаРаботы.Количество()=0 Тогда

Предупреждение(""+Элемент.3начение+" не работает в организации " +Константы.НазваниеОрганизации);

ИначеЕсли МестаРаботы.Количество()=1 Тогда

Подразд = МестаРаботы[0] .Подразделение; ЭлементыФормы.Список.ТекущиеДанные.Подразделение = Подразд;

ЭлементыФормы.Список.ТекущиеДанные.Должность =

МестаРаботы[0].Должность;

Иначе

ВыбраннаяСтрока = МестаРаботы.ВыбратьСтроку("Выберите место работы");

Если ВыбраннаяСтрока о НЕОПРЕДЕЛЕНО Тогда

ЭлементыФормы.Список.ТекущиеДанные.Подразделение =

ВыбраннаяСтрока.Подразделение;

ЭлементыФормы.Список.ТекущиеДанные.Должность =

ВыбраннаяСтрока.Должность;

КонецЕсли; КонецЕсли; КонецПроцедуры

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

Процедура СписокВидРасчетаПриИзменении(Элемент) // Вставить содержимое обработчика.

Если Элемент.Значение=ПланыВидовРасчета.ВсеВидыРасчета.Оклад Тогда Запрос = Новый Запрос(" Выбрать Сотрудник, Подразделение, Должность, Оклад, Регистратор

Из РегистрСведений.Сотрудники.СрезПоследнихСшрамДата,

(Сотрудник = парамСотрудник) и (Подразделение = парамПодразделение) и (Должность = парамДолжность))



Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач



Запрос.УстановитьПараметр("парамДата", Дата);

Запрос.УстановитьПараметр("парамСотрудник",

ЭлементыФормы.Список.ТекущиеДанные.Сотрудник);



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Запрос.УстановитьПараметр("парамПодразделение", ЭлементыФормы.Список.ТекущиеДанные.Подразделение);

Запрос.УстановитьПараметр("парамДолжность", ЭлементыФормы.Список.ТекущиеДанные.Должность);

ТЗОклад = Запрос.Вьшолнить().Выгрузить(); Если ТЗОклад.Количество()оО Тогда ОкладВСписок= ТЗОклад[0]. Оклад;

Если ТипЗнч(ОкладВСписок)=Тип("Число") Тогда

ЭлементыФормы.Список.ТекущиеДанные.Размер ОкладВСписо к;

ИначеЕсли ТипЗнч(ОкладВСписок)=Тип("СправочникСсылка.ЕТС") Тогда

ЭлементыФормы.Список.ТекущиеДанные. Размер Число(ОкладВСписок.Наименование);

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры



Также установим следующие свойства документа:

В модуле документа поместим процедуру-обработчик события ОбработкаПроведения.

Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для Каждого Строка Из Список Цикл

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

Движение.ПериодРегистрации = ПериодРегистрации; Движение. ПериодДействияНачало = Строка.ДатаНачала; Движение.ПериодДействияОкончание = Строка.ДатаОкончания; Движение.Сотрудник = Строка.Сотрудник; Движение.Подразделение = Строка.Подразделение; Движение.Должность = Строка. Должность; Движение.График = Строка.График; Движение.ВидРасчета = Строка.ВидРасчета; Движение.ПараметрРасчета = Строка.Размер; Движение.Сторно = Строка.Сторно; КонецЦикла;

52



Решение задачи

Движения.РасчетыВсе.Записать();

НаборЗаписей = РегистрыРасчета.РасчетыВсе,СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Значение = Ссылка;

Отбор= НаборЗаписей.Отбор;

//можно и так

/Ютбор= Новый Структура("Регистратор",Ссылка);

Ресурсы = Новый Массив(1);

Ресурсы[0] = "РасчетыВсе.Результат";

Измерения= Новый Структура();

Измерения.Вставить("Подразделение","РасчетыВсе.Подразделение");

Измерения.Вставить(" Должность", "РасчетыВсе.Должность");

Измерения,Вставить("Сотрудник","РасчетыВсе.Сотрудник");

ДанныеБазы =

Регистр ыРасчета.РасчетыВсе.ПолучитьБазу(Отбор,Ресурсы,Измерения);

Отработано =

РегистрыРасчета.РасчетыВсе.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета .ФактическийПериодДействия);

Норма =

РегистрыРасчета.РасчетыВсе.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета

. ПериодДействия);

ОтработаноПоБазе =

Регистр ыРасчета.РасчетыВсе.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета .БазовыйПериод);

Для Каждого Движение Из Движения.РасчетыВсе Цикл

Движение.Результат = РассчитатьНачисленияУдержания(Движение, Движения.РасчетыВсе.Индекс(Движение), ДанныеБазы, Отработано, Норма, ОтработаноПоБазе);

КонецЦикла; КонецПроцедуры

Комментарии.

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

После добавления записей в регистр выполняем самое важное действие - рассчитываем результат. Расчет результата будем проводить в общем модуле ПроцедурыРасчетов в процедуре РассчитатьНачисленияУдержания (это мы рассмотрим ниже).

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

Перед вызовом процедуры РассчитатъНачисленияУдержания проводится подготовительный этап, а именно:

53



Конфигурирование в системе "1 С:Предприятие 8.0"- Решение расчетных задач

определяются данные расчетной базы. Для этого

вспользуется метод регистра расчета ПолучитьБазу

(Отбор, Ресурсы, Измерения, Разрезы).

Метод возвращает расчетную базу для записей регистра,

подчиненных заданному регистратору (в нашем случае

конкретному документу «Начисление зарплаты всей»). В

результате работы метода возвращается

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

Замечание 1. Обратите внимание на типы данных параметров данного метода (см. описание процедуры в Синтаксис-Помощнике).

Для примера рассмотрим тип данных параметра Отбор.

Параметр может быть задан двумя типами: Структура или Отбор. Если параметр имеет тип Структура, то представляет собой фильтр для записей регистра, по которому будет получена база. Имена элементов структуры должны быть или словом "Регистратор" и/или совпадать с именами измерений регистра расчета. Значения элементов структуры представляют собственно значения отбора. Должно присутствовать как минимум условие на регистратор.

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

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

Замечание 2. В качестве базовых регистров (из ресурсов которых рассчитывается база) могут выступать несколько регистров расчета (этот вариант рассмотрим позже).

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

Замечание 4. Обязательно посмотрите внешний вид этой таблицы в режиме отладки.

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

54



Решение задачи

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

Расчет результатов начислений, удержаний, выплат

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

Функция РассчитатьНачисленияУдержания(СтрокаДвижений, Индекс, ДанныеБазы, Отработано, Норма, ОтработаноПоБазе) Экспорт

Если СтрокаДвижений.ВидРасчета = ПланыВидовРасчета.ВсеВидыРасчета. Оклад Тогда

//1

НормаДней = Норма[Индекс].Значение; Если НормаДней = 0 Тогда

Сообщить("Расчет оплаты по окладу: Нет рабочих дней в заданном периоде", СтатусСообщения.Информация);

Возврат 0;



Иначе

Если СтрокаДвижений.Сторно Тогда

Возврат-СтрокаДвижений.ПараметрРасчета;

Иначе

Возврат СтрокаДвижений.ПараметрРасчета *

Отработано [Индекс] .Значение/НормаДней * ?(СтрокаДвижений.Сторно,-1,1);

КонецЕсли; КонецЕсли;

ИначеЕсли СтрокаДвижений.ВидРасчета =

ПланыВидовРасчета,ВсеВидыРасчета.ПремияПроцентом Тогда //2

Если СтрокаДвижений.Сторно Тогда

Возврат-СтрокаДвижений.ПараметрРасчета; Иначе

Возврат ДанныеБазы[Индекс],Результат*СтрокаДвижений.ПараметрРасчета/100;

КонецЕсли;

ИначеЕсли СтрокаДвижений.ВидРасчета =

ПланыВидовРасчета.ВсеВидыРасчета.Отпуск Тогда //3

ОтработаноДней = ОтработаноПоБазе [Индекс]. Значение; Если ОтработаноДней = 0 Тогда

Сообщить("Расчет отпуска: Нет рабочих дней в базовом периоде", СтатусСообщения.Информация);

Возврат 0;

Иначе

Возврат ДанныеБазы[Индекс].Результат/ОтработаноДней * Отработано [Индекс] .Значение * ?(СтрокаДвижений.Сторно,-1,1);

КонецЕсли;

ИначеЕсли СтрокаДвижений.ВидРасчета =

ПланыВидовРасчета.ВсеВидыРасчета.ШтрафСуммой ИЛИ //4

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

ПланыВидовРасчета.ВсеВидыРасчета.Выплата Тогда

//5

Возврат СтрокаДвижений.ПараметрРасчета; КонецЕсли; Возврат 0; КонецФункции

Комментарии.

//1: Расчет Оклада. Алгоритм расчета: плановый оклад умножается на фактически отработанное количество дней и делится на норму дней в периоде. Так и делаем. Из таблицы значений, в которой находятся нормы часов, по номеру строки, соответствующему номеру записи в регистре расчета из колонки Значение получаем нужную сумму. Аналогично из таблицы значений, в которой содержатся отработанные

56



Решение задачи

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

//2; Расчет ПремииПроцентом. Берем данные базы, умножаем на ПараметрРасчета (в данном случае процент премии, задается в документе-регистраторе) и делим на 100. Сторнирование рассмотрим позже. При этом понятия Отработанное количество дней, Норма и Отработано по базе не используются

//3: Расчет Отпуска. Данные базы делим на отработанное количество дней по базе и умножаем на количество дней отпуска (здесь количеством дней отпуска является параметр фактически отработано дней). Норма и ПараметрРасчета не используются.

//4: Расчет ШтрафаСуммой. Это настолько простой расчет, что используется только ПараметрРасчета что указываем в документе-регистраторе, то и попадет в результат.

//5: Расчет Выплаты. То же самое, что и алгоритм для ШтрафаСуммой. Результат берется из ПараметраРасчета.

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

После проведения документа в регистре расчета «РасчетыВсе» появятся записи:

57

Попробуем создать в режиме исполнения следующий документ.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала




Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач

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

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

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

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

Создадим в режиме исполнения следующий набор документов. Расчеты за январь (Период регистрации - 1 января). Документ для ввода окладов:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


После проведения документа в регистре расчета «РасчетыВсе» появятся записи (двойной щелчок по строке открывает документ-регистратор):

58



Решение задачи



Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Документ для ввода премий процентом:

Документ для ввода штрафа:









Документ для ввода выплат;

59



Конфигурирование в системе "1С предприятие 8.0". Решение расчетных задач

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Документ для ввода премий:

60

Расчеты за февраль (Период регистрации - 1 февраля). Документ для ввода окладов:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала




Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Решение задачи

Вытесняющие расчеты. Вид расчета «Отпуск»

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

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

Реализуем вытеснение «Оклада» «Отпуском». Для начала заполним табличную часть Вытесняющие виды расчета вида расчета «Оклад» в плане видов расчета «ВсеВидыРасчета» следующим образом:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


«Оклад» вытесняется «Отпуском».

Реализуем механизм ввода «Отпуска» в регистр расчета «РасчетыВсе». Вспомним, что «Отпуск» имеет расчетную базу и эта расчетная база лежит в базовом периоде, который представляет собой три месяца, предшествующие периоду действия.

61



Доработаем модуль документа «НачислениеЗарплатыВсей». В процедуре ОбработкаПроведения после строки:

Движение.ПериодДействияОкончание = Строка. ДатаОкончания;

вставим строки:

Если Строка.ВидРасчета = ПланыВидовРасчета.ВсеВидыРасчета.Отпуск

Тогда

Движение.БазовыйПериодНачало

ДобавитьМесяцСДвижение.ПериодДействия, -3);

Движение.БазовыйПериодОкончание

Движение.ПериодДенствия-1;

КонецЕсли;

Создадим и проведем документ «НачислениеЗарплатыВсей» (определим Отпуск с 01.02.2003 по 10.02.2003), в качестве графика выберем Неосновной график (соответственно создадим в справочнике «ГрафикиРаботы» новый элемент и определим тип неосновного графика - Шестидневка):

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Посмотрим с помощью запроса, что получилось в регистре расчета после ввода «Отпуска» (используем отчет «Знакомство с запросом»):

Выбрать

из

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


62



Решение задачи

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

Фактический период действия. Запрос к таблице ФактическийПериодДействия

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

Можно представлять Фактический период действия как таблицу, «подчиненную» регистру расчетов.

Посмотрим с помощью запроса как выглядит таблица Фактического периода действия.

Выбрать *

из

РегистрРасчета.РасчетыВсе.ФактическийПериодДействия

63

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Этот фактический период действия относится к Оплате по окладу.

Представим результат вытеснения Оклада видом расчета Отпуск, действующим с 01.02.2003 по 10.02.2003 в виде схемы.

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


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

Представим основные свойства данных объектов в виде таблицы

64

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

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала




Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала






". Решение расчетных задач

Теперь перепроведем документ, которым начислялся «Оклад» в феврале. При этом произойдет перерасчет результата «Оклада».

Посмотрим, что получилось в регистре расчетов - результат «Оплаты

по окладу» изменился. Дело в том, что в алгоритме расчета «Оклада»

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

действия (так работает метод ПолучитьДанныеГрафика (Отбор,

ВидПериодаРегистраРасчета. ФактическийПериодДействия),

кстати, метод ПолучитьБазуО также опирается на фактический период действия).

Замечание. На уровне системы исключаются циклические вытеснения. Например, если задать в плане видов расчета, что «Отпуск» вытесняет «Оклад», и, в тоже время, что «Оклад» вытесняет «Отпуск», и попытаться сохранить изменения, то система выдаст предупреждение:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Механизм сторнирования. Работа механизма вытеснения при регистрации записей с периодом действия меньшим, чем период регистрации

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

Реализуем такую ситуацию в нашей конфигурации. Доработаем документ «НачислениеЗарплатыВсей». В модуле документа перед строкой

Движения.РасчетыВсе,Записать();

добавим строку:

Доп = Двнжения.РасчетыВсе.ПолучитьДополнение();

66



Решение задачи

В системе «1 (^Предприятие 8.0» для автоматического получения сторно-записей используется метод ПолучитъДополнение() набора записей. Этот метод опирается на фактический период действия. Метод получает дополнение к текущему набору записей в виде таблицы значений со структурой, повторяющей структуру набора записей (дополнение - это дополнительные записи, имеющие признак сторно). Такие сторно-записи формируются на основании периодов действия записей регистра расчета и правил конкуренции за период действия, задаваемых списками вытесняемых видов расчета в плане видов расчета регистра.

Создадим для сотрудника Петрова документ по вводу отпуска с 10.01.2003 по 20.01.2003 как показано ниже:

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала


Поставим в отладчике точку останова на строке

Доп = Движения.РасчетыВсе.ПолучитьДополнение();

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

67

отладчика).

Конфигурирование в системе и1С:Предприятие 8.0м Решение задач расчета зарплаты и учета персонала




йййЈйЗ»^2г:饣:5:Шя;^^

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

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

Добавим после строки

Доп = Движения.РасчетыВсе.ПолучитьДополнение();

следующее:

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

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

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

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

Движение.ПериодДействияОкончание =

Строка.ПериодДенствияОкончание;

Движение.БазовыйПериодНачало = Строка.БазовыйПериодНачало; Движение.БазовыйПериодОкончание = Строка.БазовыйПериодОкончание; Движение.Сотрудник = Строка.Сотрудник; Движение.ВидРасчета = Строка.ВидРасчета; Движение.Подразделение = Строка.Подразделение; Движение. Должность = Строка. Должность; Движение.График = Строка.График; Движение.ПараметрРасчета = СтрокаПараметрРасчета; Движение.Сторно = Строка.Сторно; КонецЦикла;



Содержание раздела