1С:Предприятие 8.2 /
Разработчикам /
Практикум
Практикум 12. Создание процедуры расчета записей регистра Начисления
Создание отчета НачисленияСотрудникам
Выполнение перерасчета записей регистра расчета
Графическое представление начислений
Создание отчета ДиаграммаНачислений
До сих пор мы с вами просто заносили в регистр расчета Начисления записи о том, что необходимо выполнить какой-либо вид расчета . Но каким именно образом получать эти результаты, не говорили. Теперь настало время описать алгоритмы формирования различных видов расчетов.
Поскольку эти алгоритмы нам понадобится использовать не только в документе НачисленияСотрудникам, удобнее всего будет разместить их в отдельном общем модуле.
1. Откроем в конфигураторе текст обработчикапроведения документаНачисленияСотрудникам и добавим в него вызов процедуры из общего модуля ПроведениеРасчетов.
Обратите внимание: при проведении документа мы сначала записываем движения, сформированные документом, в регистр, а затем передаем этот набор записей регистра в процедуру расчета. Сначала для расчета первичных записей (Оклад), а затем для расчета вторичных (Премия). Процедура расчета на основе описанных в ней алгоритмов и данных, содержащихся в записях регистра, должна сформировать значения ресурсов регистра. После того, как ресурсы будут рассчитаны, мы перезаписываем набор записей регистра без формирования записей перерасчета (второй параметр в методе Записать() → Истина).
Перед вызовом процедуры из общего модуля мы формируем список сотрудников, содержащихся в документе, чтобы передать его в вызываемую процедуру.
2. Теперь создадим в ветке Общие новый общий модуль ПроведениеРасчетов. Укажем, что он будет глобальный, установив соответствующий флажок.
3. Добавим в него заготовку процедуры РасчитатьНачисления:
Алгоритм расчета начислений будет различным при расчете первичных и вторичных записей, и каждая из его частей будет находиться в своей ветке условия Если…¦
4. При расчете первичных записей нам понадобятся данные графика из регистра расчета, поэтому добавим в первую ветку условия запрос по виртуальной таблице регистра расчета РегистрРасчет.Начисления.ДанныеГрафика:
В этом запросе мы выбираем из виртуальной таблицы данных графика регистра расчета значение графика для периода действия и для фактического периода действия. При задании параметров виртуальной таблицы мы ограничиваем выборку регистратором, нужным нам видом расчета и списком сотрудников, по которым нужно получить значения графика.
5. Теперь добавим обход переданного в процедуру набора записей и расчет записей, для которых получены значения графика:
Для каждой записи из набора записей регистра расчета мы получаем номер строки и по этому номеру ищем соответствующую запись в выборке из результата запроса. Если в результате запроса есть запись с таким номером строки, мы рассчитываем результат записи регистра расчета.
6. Добавим текст запроса во вторую ветку условия Если …¦ с той лишь разницей, что теперь мы будем получать значения базы, используя виртуальную таблицу регистра расчета РегистрРасчета.Начисления.БазаНачисления:
В параметрах виртуальной таблицы запроса мы кроме привычных для нас регистратора, вида расчета и списка сотрудников задаем еще измерения основного и базового регистров. В нашем случае это будет один и тот же регистр, а нужное нам измерение → Сотрудник.
7. В заключение осталось добавить во второе условие Если …¦ обход набора записей регистра расчета и вычисление результата вторичных записей:
Сумму начисленной премии мы рассчитываем как 10% от рассчитанной оплаты по окладу.
8. Запустим 1С:Предприятие в режиме отладки и проверим правильность работы процедуры расчета.
Отменим проведение документа Начисления сотрудникам №–3 и Перепроведем документы Начисления сотрудникам №–1 и №–2. Регистр расчета Начисления должен выглядеть следующим образом:
Гусакову и Деловому начислена премия в размере 10% от суммы начисления по окладу.
9. Проведем документ Начисления сотрудникам №–3, а затем №–1 и №–2. Состояние регистра изменится следующим образом:
В результате невыхода Гусакова на работу сумма оплаты по окладу будет уменьшена и соответствующим образом уменьшится начисленная ему премия.
Создание отчета НачисленияСотрудникам
1. Создадим новый объект конфигурацииОтчет с именем НачисленияСотрудникам.
2. Создадим основную схему компоновки данных отчета, добавим новый Набор данных → запрос, откроем конструктор запроса.
3. Выберем таблицу регистра расчета Начисления.
4. Из нее выберем следующие поля: Сотрудник, ВидРасчета, ПериодДействияНачало, ПериодДействияКонец, Регистратор и Результат:
5. На закладкеОбъединения/Псевдонимы определим следующие псевдонимы полей ПериодДействияНачало и ПериодДействияКонец:
6. На этом создание запроса закончено, нажмем ОК.
7. Перейдем на закладку Ресурсы и укажем, что должна быть рассчитана сумма по полю Результат.
8. На закладке Настройки создадим структуру отчета . Добавим группировку по полю Сотрудник и в ней → подчиненную группировку детальных записей:
9. В качестве полей, выводимых в отчет, выберем поля ВидРасчета, Начало, Окончание, Регистратор и Результат.
10. На закладке Сортировка укажем, что сортировка должна выполняться по возрастанию значения поля Сотрудник и Регистратор.
11. На закладке Другие настройки зададим заголовок отчета → Начисления сотрудникам.
Создание схемы компоновки данных закончено. Запустим 1С:Предприятие в режиме отладки. В результате работы отчета мы получим следующую таблицу:
Выполнение перерасчета записей регистра расчета
Итак, в нашем алгоритме работы с данными расчета осталось одно «узкое» место → контроль актуальности данных, содержащихся в регистре расчета. До сих пор мы с вами использовали служебный отчет Перерасчет для того, чтобы определить, являются ли данные в регистре расчета актуальными или же они требуют перерасчета.
Теперь мы с вами создадим специальную процедуру, которая будет определять, требуется ли перерасчет данных регистра расчета, и, если есть такая необходимость, выполнять перерасчет.
Поскольку единственным способом получения итоговой информации о начислениях сотрудникам в нашей конфигурации является отчет НачисленияСотрудникам, для вызова этой процедуры мы создадим основную форму этого отчета и добавим кнопкуПерерасчитать в командную панель ДействияФормы:
- в командной панели выделим кнопку ;
- вызовем контекстное меню и выберем команду Добавить;
- появится кнопка ;
- поставим ее после кнопки ;
- в палитре свойств новой кнопки зададим имя и текст:
Теперь наша командная панель будет выглядеть следующим образом:
В обработчик события нажатия кнопки (Палитра свойств: в группе Основные нужно выбрать поле Действие и кликнуть по лупе) вставим текст вызова процедуры перерасчета, очистки табличного поля и вывода нового результата:
Саму процедуру перерасчета поместим в общем модуле ПроведениеРасчетов:
В самом начале процедуры мы запросом выбираем данные о записях перерасчетов, содержащих переданный вид расчета и сгруппированных по объекту перерасчета. Далее, при обходе результата запроса, мы формируем для каждого объекта перерасчета список сотрудников, читаем соответствующие записи регистра расчета и вызываем процедуру РасчитатьНачисления, которая использовалась нами при расчете записей документа НачисленияСотрудникам. После того, как расчет записей выполнен, мы записываем набор записей без формирования записей перерасчета и очищаем записи перерасчета по тому объекту перерасчета, который только что обработали.
Запустим 1С:Предприятие в режиме отладки и проверим, как выполняется перерасчет записей регистра расчета.
Отменим проведение всех документов Начисления сотрудникам и проведем документ Начисления сотрудникам №–1 и затем №–2. Сформируем отчет Начисления сотрудникам.
Теперь откроем документ Начисления сотрудникам №–1, изменим оклад Гусакова на 10 000 и проведем документ. В отчете Начисления сотрудникам нажмем кнопку Перерасчитать. Будет выполнен перерасчет начисления премии Гусакову и Деловому.
Результат работы отчета будет содержать новые значения премии Гусакова:
И, наконец, проведем документ Начисления сотрудникам №–3 и нажмем Перерачитать в отчете Начисления сотрудникам. Снова будет произведен перерасчет оклада и премии Гусакова:
А данные отчета будут содержать актуальные значения начисления оклада и премии:
Графическое представление начислений
Теперь создадим отчет, который в графическом виде будет показывать нам фактический период действия записей расчета. Помимо наглядной демонстрации работы механизма вытеснения записей по периоду действия этот отчет позволит нам познакомиться с элементом управления, позволяющим создавать диаграммы Ганта.
Диаграмма Ганта
Диаграмма Ганта представляет собой диаграмму интервалов на шкале времени и отражает использование объектами (точками) ресурсов (серий).
Чтобы проще было представить себе составные части диаграммы Ганта, изучим диаграмму, которая должна получиться в результате работы создаваемого нами отчета.
Как мы уже говорили, эта диаграмма будет отображать для каждого сотрудника фактический период действия записи по каждому из видов расчета, имеющих место для этого сотрудника.
Итак, диаграмма Ганта представляет собой совокупность точек, серий и значений для каждой пары точка-серия. В нашем случае точками диаграммы являются сотрудники, а сериями → виды расчетов . Таким образом, для каждого сотрудника существует некоторое значение диаграммы по каждой из серий, то есть по каждому из видов расчета.
Значение диаграммы Ганта представляет собой специальный объект, который автоматически формируется системой на основании того, какие точки и какие серии определены для данной диаграммы. Этот объект является совокупностью (коллекцией) интервалов, т.е. может содержать не один, а несколько интервалов, которые соответствуют паре серия-точка. Создаваемый по умолчанию объект ЗначениеДиаграммыГанта не содержит ни одного интервала. Разработчик может получить значение диаграммы, указав интересующую его точку и серию, и затем добавить в коллекцию необходимое количество интервалов.
Все интервалы всех значений диаграммы располагаются с привязкой к единой оси времени, что дает возможность видеть их взаимное расположение.
В качестве исходных данных для построения такой диаграммы мы возьмем данные регистра расчета Начисления. Каждая запись этого регистра уже содержит все необходимое для построения диаграммы: сотрудника, вид расчета, начало и конец интервала. Нам остается только средствами встроенного языка разместить все это в диаграмме.
Создание отчета ДиаграммаНачислений
1. Создадим новый объект конфигурации Отчет и назовем его ДиаграммаНачислений.
2. Создадим основную форму отчета и поместим в нее элемент управления диаграмма Ган-
та с именем Диаграмма Ганта.
Курсором «растянем» поле диаграммы. Получим следующую картинку:
3. Откроем модуль формы отчета и в обработчик события Нажатие кнопки Сформировать вставим заготовку запроса:
4. Откроем конструктор запроса и выберем виртуальную таблицу регистра расчета Начисления.ФактическийПериодДействия.
5. Из этой таблицы выберем следующие поля:
- Сотрудник;
- ВидРасчета;
- ПериодДействияНачало;
- ПериодДействияКонец;
- Результат;
- Регистратор;
- Регистратор.Представление.
6. Все, запрос готов. Теперь нажмем ОК.
7. После текста запроса добавим в процедуру следующий текст:
Сначала в переменной Диаграмма мы сохраняем расположенную в форме диаграмму Ганта и запрещаем обновление диаграммы на то время, пока мы будем заполнять ее данными. Это нужно для того, чтобы в процессе заполнения не выполнялись пересчеты при каждом изменении данных диаграммы. После окончания заполнения диаграммы мы разрешим обновление, и все пересчеты будут выполнены один раз.
Затем в цикле по выборке запроса мы заполняем диаграмму. Сначала, используя методы УстановитьСерию() и УстановитьТочку(), мы получаем либо существующие, либо новые точку и серию. Точки и серии однозначно идентифицируются своими значениями, в качестве которых мы используем сотрудника и вид расчета из результата запроса.
После того как точка и серия получены, с помощью метода ПолучитьЗначение() мы получаем соответствующее им значение диаграммы.
Затем мы добавляем в значение диаграммы новый интервал, задаем его начало и конец, задаем текст интервала, который будет показываться во всплывающей подсказке, и задаем расшифровку интервала, которая будет выполняться при двойном щелчке мышью на этом интервале.
После того как все значения диаграммы сформированы, мы раскрашиваем серии своими цветами. Серии диаграммы представляют собой коллекцию значений, которую мы перебираем при помощи конструкции Для каждого …¦ Цикл.
8. В завершение создания нашего отчета настроим ось времени для диаграммы Ганта. Для этого используем команду контекстного меню Настройка
и на закладке Шкала времени зададим Формат дня как День месяца.
9. После этого нажмем кнопку выбора в колонке Формат. В открывшемся окне конструктора форматной строки перейдем на закладку Дата, установим флаг Формат даты и зададим его как d. В нашем случае на оси времени диаграммы Ганта будут выводиться только числа месяцев.
10. Нажмем ОК и закроем окно настройки диаграммы Ганта.
11. Запустим 1С:Предприятие в режиме отладки и посмотрим на результат работы отчета:
12. А теперь посмотрим, как выглядит механизм вытеснения по периоду действия В действии. Откроем документ Начисления сотрудникам №–3 и вместо одного прогула с 1 по 10 число зададим Гусакову два прогула с 3 по 7 число и с 12 по 15 число.
13. Проведем документ и снова нажмем Сформировать в нашем отчете:
Теперь вы наглядно видите, как записи вида расчета Невыход вытеснили по периоду действия запись расчета Оклад, изменив ее фактический период действия.
Курс "Бухгалтерский учет + 1С:Бухгалтерия 8.2 для начинающих"
Тренинг-семинар «Как получить работу бухгалтера»
Курсы бухгалтеров с трудоустройством
Другие материалы по теме:
диаграмма, перерасчет, премия, регистратор, вид расчета, регистр., сформировать, оклад, 23, 09, 00, выбрать, результат, работы, счета, сотрудник, данные, значение, начисления, регистр, справочник, отчет, действия, вид, расчет, счет, документ
Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Практикум
Другие материалы по теме:
Источники данных для расчетов бюджетирования
Практикум 11. План видов расчета, регистр расчета
Нас находят: Отчет Начисления сотрудникам 1C, РегистрРасчета Начисления БазаНачисления, запрос начисленой премии, необходимо сделать выборку категорий расчета и цикл по ней с вызовом процедуры расчета премий, сделайте выборку категорий расчета и цикл по ней с выховом процедуры расчета премий, 89234, 30250, 35802, 84980, как получить БазаНачисления 1c
Мы на Facebook