Меню


Курсы СтимулСправочникПолезные материалы1С:Предприятие 8.2РазработчикамПрактикум

1С:Предприятие 8.2 /
Разработчикам /
Практикум

Оглавление

Практикум 12. Создание процедуры расчета записей регистра Начисления

Создание отчета НачисленияСотрудникам

Выполнение перерасчета записей регистра расчета

Графическое представление начислений

Диаграмма Ганта

Создание отчета ДиаграммаНачислений

 

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

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

1. Откроем в конфигураторе текст обработчикапроведения документаНачисленияСотрудникам и добавим в него вызов процедуры из общего модуля ПроведениеРасчетов.

 Процедура ОбработкаПроведения Отказ, Режим / / {{_КОНСТРУКТОР_ДВИКЕНИЙ_РЕГИСТРОВ Для Каждого ТекСтрокаНачисления Из Начисления Цикл КонецЦикла; // Записываем движения регистров Движения.Начисления.Записать ; // Получим список всех сотрудников, содержащихс

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

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

2. Теперь создадим в ветке Общие новый общий модуль ПроведениеРасчетов. Укажем, что он будет глобальный, установив соответствующий флажок.

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

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

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

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

// Рассчитать первичные записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Запрос = Новый Запрос; Запрос.Текст = ВЫБРАТЬ НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма, НачисленияДанныеГрафика.ЗначениеФактическийПе

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

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

ВыборкаРезультата = Запрос.Выполнить .Выбрать ; Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл СтруктураНомер = Новый Структура НомерСтроки ; СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки; ВыборкаРезультата.Сбросить ; Если ВыборкаРезульт

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

6. Добавим текст запроса во вторую ветку условия Если …¦ с той лишь разницей, что теперь мы будем получать значения базы, используя виртуальную таблицу регистра расчета РегистрРасчета.Начисления.БазаНачисления:

// Рассчитать вторичные записи ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда Запрос = Новый Запрос; Запрос.Текст = ВЫБРАТЬ НачисленияБазаНачисления.РезультатБаза КАК База, НачисленияБазаНачисления.НомерСтроки КАК НомерСт

Запрос.УстановитьПараметр Регистратор , Регистратор ; Запрос.УстановитьПараметр ВидРасчета , ТребуемыйВидРасчета ; Запрос.УстановитьПараметр СписокСотрудников , СписокСотрудников ВыборкаРезультата = Запрос.Выполнить .Выбрать ; КонецЕсли; КонецПроцедуры

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

7. В заключение осталось добавить во второе условие Если …¦ обход набора записей регистра расчета и вычисление результата вторичных записей:

ВыборкаРезультата = Запрос.Выполнить .Выбрать ; Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл СтруктураНомер = Новый Структура НомерСтроки ; СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки; ВыборкаРезультата.Сбросить ; Если ВыборкаРезульт

Сумму начисленной премии мы рассчитываем как 10% от рассчитанной оплаты по окладу.

8. Запустим 1С:Предприятие в режиме отладки и проверим правильность работы процедуры расчета.

Отменим проведение документа Начисления сотрудникам №–3 и Перепроведем документы Начисления сотрудникам №–1 и №–2. Регистр расчета Начисления должен выглядеть следующим образом:

 Список Начисления Действия -о] /=] О Дета начала базов... Дата окончания базов... Актив... Сторно Сотрудник Результат Г рафик работы Исходные данные / ч 01.09.2003 0:00:00 30.09.2003 23:59:59 Гусаков Николай Дмитриевич 7 000,00 Г рафик мастеров 7 000,00 0

Гусакову и Деловому начислена премия в размере 10% от суммы начисления по окладу.

9. Проведем документ Начисления сотрудникам №–3, а затем №–1 и №–2. Состояние регистра изменится следующим образом:

Список Начисления Действия -о] Т _Э Регистратор Период... - Но... Виа ра... Период действия Дата начала пер... Дата окончания пер... Дата начала базов... Дата окончания базоїЛ ш Начисления сотру... 01.10.2003... 1 Оклад 01.03.2003 0:00:00 01.03.2003 0:00:0

Действия т • • ’7 ЇЙ ’г І Дата окончания базов... Активность Сторно Сотрудник Результат Г рафик работы Исходные данные Л 30.09.2003 23:53:53 Гусаков Николай Дмитриевич 4 454,55 Г рафик мастеров 7 000,00 30.03.2003 23:53:53 Деловой Иван Сергеевич 3 000,00 Г

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

Создание отчета НачисленияСотрудникам

1. Создадим новый объект конфигурацииОтчет с именем НачисленияСотрудникам.

2. Создадим основную схему компоновки данных отчета, добавим новый Набор данных → запрос, откроем конструктор запроса.

3. Выберем таблицу регистра расчета Начисления.

4. Из нее выберем следующие поля: Сотрудник, ВидРасчета, ПериодДействияНачало, ПериодДействияКонец, Регистратор и Результат:

Поля . ....11 Начисления.Сотрудник . ....- Начисления.ВиаРасчета . ....- Н ачисления. П ериодДействияН ачало . ....- Н ачисления. П ериод ДействияКонец . ....- Начисления.Регистратор . .... Начисления.Результат

5. На закладкеОбъединения/Псевдонимы определим следующие псевдонимы полей ПериодДействияНачало и ПериодДействияКонец:

Имя поля Запрос 1 . ....ивЯЯ 1.....1— Начисления. Сотруаник . ....— ВиаРасчета . ....- Начисления.ВиаРасчета . ....— Начало . ....- Н ачисления. П ериодДействияН ачало - Окончание J . ....- Н ачисления. П ериодДействияКонец . ....— Регистратор . ....- Начи

6. На этом создание запроса закончено, нажмем ОК.

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

8. На закладке Настройки создадим структуру отчета . Добавим группировку по полю Сотрудник и в ней → подчиненную группировку детальных записей:

В- В -y шз Сотрудник = -0ош Детальные записи

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

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

11. На закладке Другие настройки зададим заголовок отчетаНачисления сотрудникам.

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

if Отчет Начисления сотрудникам Действия Сформировать Конструктор настроек... Настройки... 1 Начисления сотрудникам Сотрудник Результат Вид расчета Начало Окончание Регистратор Гусаков Николай Дмитриевич 4 900,01 Оклад 01.09.2008 0:00:00 30.09.2008 23:59:5

Выполнение перерасчета записей регистра расчета

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

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

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

Свойства: Элемент панели Ў Основные: 0 Имя Т ипКнопки Доступность Действие КнопкаП оУ молчаниі Изменяет Данные Пометка Ў Представление: Перерасчигать Действие За Текст Перерасчигать Сочетание клавиш, которое позволяет быстро выполнить выбранное действие Со

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

Отчет Начисления сотрудникам Действия Ў Сформировать Перерасчетать Конструктор настроек... Настройки... 1 1 а -- _Л-II-1

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

Е Процедура ДействияФормыПерерасчитать Кнопка ПерерасчитатьНачисления ПланыВидовРасчета.ОсновныеНачисления.Оклад ; ПерерасчитатьНачисления ПланыВидовРасчета.ОсновныеНачисления.Премия ЭлементыФормы.Результат.Очистить ; - КонецПроцедуры

Саму процедуру перерасчета поместим в общем модуле ПроведениеРасчетов:

Е Процедура ПерерасчитатьНачисления ТребуемыйВидРасчета Экспорт // Здесь следует выбрать из набора записей перерасчета // записи в следующей последовательности: // записи документа! для сотрудников из списка, // записи документа2 для сотрудников из списка

Запрос.УстановитьПараметр ТребуемыйВидРасчета , ТребуемыйВидРасчета ; СписокСотрудников = Новый СписокЗначений; // Перебрать группировку по регистратору ВыборкаПоРегистратору = Запрос.Выполнить . Выбрать ОбходРезультатаЗапроса.ПоГруппировкам ; Пока Выборка

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

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

Отменим проведение всех документов Начисления сотрудникам и проведем документ Начисления сотрудникам №–1 и затем №–2. Сформируем отчет Начисления сотрудникам.

Начисления сотрудникам Сотрудник Результат Вид расчета Начало Окончание Регистратор Гусаков Николай Дмитриевич 7 700 Оклад 01.09.2008 0:00:00 30.09.2008 23:59:59 Начисления сотрудникам 1 от 06.10.2008 0:00:00 7 000 Премия 01.09.2008 0:00:00 30.09.2008 23:5

Теперь откроем документ Начисления сотрудникам №–1, изменим оклад Гусакова на 10 000 и проведем документ. В отчете Начисления сотрудникам нажмем кнопку Перерасчитать. Будет выполнен перерасчет начисления премии Гусакову и Деловому.

 Выполнен расчетНачисления сотрудникам 2 от 06.10.2008 12:00:00-Премия-Гусаков Николай Дмитриевич Выполнен расчетНачисления сотрудникам 2 от 06.10.2008 12:00:00-Премия-Деловой Иван Сергеевич

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

Начисления сотрудникам Сотрудник Результат Вид расчета Начало Окончание Регистратор Гусаков Николай Дмитриевич 11 000 Оклад 01.09.2008 0:00:00 30.09.2008 23:59:59 Начисления сотрудникам 1 от 06.10.2008 0:00:00 10 000 Премия 01.09.2008 0:00:00 30.09.2008 23

И, наконец, проведем документ Начисления сотрудникам №–3 и нажмем Перерачитать в отчете Начисления сотрудникам. Снова будет произведен перерасчет оклада и премии Гусакова:

 Выполнен расчетНачисления сотрудникам 1 от 06.10.2008 0:00:ОО-Оклад-Гусаков Николай Дмитриевич Выполнен расчетНачисления сотрудникам 2 от 06.10.2008 12:00:00-Премия-Гусаков Николай Дмитриевич

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

Начисления сотрудникам Сотрудник Результат Вид расчета Начало Окончание Регистратор Гусаков Николай Дмитриевич 7 000 Оклад 01.09.2008 0:00:00 30.09.2008 23:59:59 Начисления сотрудникам 1 от 06.10.2008 0:00:00 6 363,64 Премия 01.09.2008 0:00:00 30.09.2008 2

Графическое представление начислений

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

Диаграмма Ганта

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

Интервал ай Дмигр евич Деловой Иваь Сергеевк- Отчет Диаграмма начислений Симонов Валерий Миха лович Точки С Значение Невыход Премия Оклад Сформировать

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

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

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

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

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

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

Создание отчета ДиаграммаНачислений

1. Создадим новый объект конфигурации Отчет и назовем его ДиаграммаНачислений.

2. Создадим основную форму отчета и поместим в нее элемент управления диаграмма Ган-

та с именем Диаграмма Ганта.

0 Конфигуратор учебная версия - Конфигурация Файл Правка іЛ-ін 1 і - а [ Конфигурация Действия Ў Ж Журналы Ё Перемисл Й ] Отчеты Й - Матер Й ! '' Реест Й - Рейти Й-Выру Й - Рейти Й- ' Пере Й-' У ниве Й- ’ У ниве В- _ Остат Й Оборе Форма Конфигурация Отладк

Курсором «растянем» поле диаграммы. Получим следующую картинку:

Отчет Диаграмма начислений Действия Ў 13 14 15 16 17 13 19 20 21 22 23 ДиаграммаГ анга1 Точка 1 ! ' ' ' ' Точка2 ТочкаЗ Точка4 Серия1 Сформировать Закрыть

3. Откроем модуль формы отчета и в обработчик события Нажатие кнопки Сформировать вставим заготовку запроса:

Е Процедура КнопкаСформироватьНажатие Элемент Запрос = Новый Запрос; Запрос.Текст = 1- КонецПроцедуры

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

5. Из этой таблицы выберем следующие поля:

Поля г-Х— Н ачисленияФ актическийП ериод Действия. Сотрудник .....- Н ачисленияФ актическийП ериод Действия. В идРасчета .....- Н ачисленияФ актическийП ериод Действия. П ериод ДействияН ачало .....- Н ачисленияФ актическийП ериод Действия. П ериод Действи

6. Все, запрос готов. Теперь нажмем ОК.

Е Процедура КнопкаСформироватьНажатие Элемент Запрос = Новый Запрос; Запрос.Текст = ВЫБРАТЬ НачисленияФактическийПериодДействия.Сотрудник, НачисленияФактическийПериодДействия.ВидРасчета, НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФ

7. После текста запроса добавим в процедуру следующий текст:

ВыборкаРезультата = Запрос.Выполнить .Выбрать ; Диаграмма = ЭлементыФормы.ДиаграммаГанта; // Запретить обновление диаграммы Диаграмма.Обновление = Ложь; Диаграмма.Очистить ; Диаграмма.ОтображатьЗаголовок = Ложь; // Заполнить диаграмму Пока ВыборкаРезультат

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

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

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

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

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

После того как все значения диаграммы сформированы, мы раскрашиваем серии своими цветами. Серии диаграммы представляют собой коллекцию значений, которую мы перебираем при помощи конструкции Для каждого …¦ Цикл.

8. В завершение создания нашего отчета настроим ось времени для диаграммы Ганта. Для этого используем команду контекстного меню Настройка

Отчет Диаграмма начислений Действия Ў 13 14 15 16 17 22 23 ДиаграммаГ анта1 1 Точка 1 Добавить элемекг Точка2 Настройка... ТочкаЗ Точка4 Свойства АИ+Еп1ег Серия1 Сформировать Закрыть

и на закладке Шкала времени зададим Формат дня как День месяца.

Настройка Шкала времени Интервалы Фона І І3кх Кратность Формат дня Формат Видимость Периодичес. Единица вре.. Метки 0 0 День Поддержка масштаба при изменении размеров окна • Все данные Автоматически День меся День месяца День недели День месяца + д... День

9. После этого нажмем кнопку выбора ... в колонке Формат. В открывшемся окне конструктора форматной строки перейдем на закладку Дата, установим флаг Формат даты и зададим его как d. В нашем случае на оси времени диаграммы Ганта будут выводиться только числа месяцев.

Конструктор Форматной строки Русский Язык Страна Число Дата Логическое значение у Формат даты Локальный Формат даты Представление пустой даты Пример: — 13.11.2003 3:00:47 Ш х ДФ= О К Отмена Справка

10. Нажмем ОК и закроем окно настройки диаграммы Ганта.

11. Запустим 1С:Предприятие в режиме отладки и посмотрим на результат работы отчета:

Отчет Диаграмма начислений Действия Ў 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 13 19 20 21 22 23 24 25 26 27 28 29 30 1 Гусаков Николай Дмитриевич -- И и Симонов Валерий Михайлович Деловой Иван Сергеевич Оклад Невыход Премия Сформировать Закрыть

12. А теперь посмотрим, как выглядит механизм вытеснения по периоду действия В действии. Откроем документ Начисления сотрудникам №–3 и вместо одного прогула с 1 по 10 число зададим Гусакову два прогула с 3 по 7 число и с 12 по 15 число.

13. Проведем документ и снова нажмем Сформировать в нашем отчете:

Отчет Диаграмма начислений _ П Действия 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 13 13 20 21 22 23 24 25 26 27 23 23 30 1 Гусаков Николай Дмитриевич шшшшшш шшшшш ' Симонов Валерий Михайлович Деловой Иван Сергеевич Оклад Невыход Премия Сформировать Закр

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


Нас находят: Отчет Начисления сотрудникам 1C, РегистрРасчета Начисления БазаНачисления, запрос начисленой премии, необходимо сделать выборку категорий расчета и цикл по ней с вызовом процедуры расчета премий, сделайте выборку категорий расчета и цикл по ней с выховом процедуры расчета премий, 89234, 30250, 35802, 84980, как получить БазаНачисления 1c


Подписка на новости RSS

Мы на Facebook