Практикум 12. Створення процедури розрахунку записів регістру Нарахування
Досі ми з вами просто заносили до регістру розрахунку <strong>Нарахування</strong> записи про те, що необхідно виконати будь-який вид розрахунку. Але яким саме чином отримувати ці результати, не говорили. Тепер настав час описати алгоритми формування різних видів розрахунків.Створення звіту НарахуванняПрацівникам. Виконання перерахунку записів регістру розрахунку. Графічне подання нарахувань. Діаграма Ганта. Створення звіту ДіаграмаНарахувань
Створення звіту НарахуванняПрацівникам
Виконання перерахунку записів регістру розрахунку
Створення звіту ДіаграмаНарахувань
Досі ми з вами просто заносили до регістру розрахунку Нарахування записи про те, що необхідно виконати будь-який вид розрахунку. Але яким саме чином отримувати ці результати, не говорили. Тепер настав час описати алгоритми формування різних видів розрахунків.
Оскільки ці алгоритми нам знадобиться використовувати не лише в документі НарахуванняПрацівникам, найзручніше буде розмістити їх в окремому загальному модулі.
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. Створимо основну форму звіту та помістимо до неї елемент керування діаграма Ган-
та з іменем Діаграма Ганта.
![0 Конфигуратор учебная версия - Конфигурация Файл Правка іЛ-ін 1 і - а [ Конфигурация Действия Ў Ж Журналы Ё Перемисл Й ] Отчеты Й - Матер Й ! '' Реест Й - Рейти Й-Выру Й - Рейти Й- ' Пере Й-' У ниве Й- ’ У ниве В- _ Остат Й Оборе Форма Конфигурация Отладк](/img/materialy_praktikum_12_sozdanie_protsedury_rascheta_zapisey_registra_nachisleniya/407.png)
Курсором «розтягнемо» поле діаграми. Отримаємо таку картинку:

3. Відкриємо модуль форми звіту та до обробника події Натискання кнопки Сформувати вставимо заготовку запиту:

4. Відкриємо конструктор запиту та виберемо віртуальну таблицю регістру розрахунку Нарахування.ФактичнийПеріодДії.
5. Із цієї таблиці виберемо такі поля:
- Працівник;
- ВидРозрахункуа;
- ПеріодДіїПочаток;
- ПеріодДіїКінець;
- Результат;
- Реєстратор;
- Реєстратор.Подання.

6. Усе, запит готовий. Тепер натиснемо ОК.

7. Після тексту запиту додамо до процедури такий текст:


Спочатку у змінній Діаграма ми зберігаємо розташовану у формі діаграму Ганта і забороняємо оновлення діаграми на час, поки заповнюватимемо її даними. Це потрібно для того, щоб у процесі заповнення не виконувалися перерахунки за кожної зміни даних діаграми. Після завершення заповнення діаграми ми дозволимо оновлення, і всі перерахунки буде виконано один раз.
Потім у циклі за вибіркою запиту ми заповнюємо діаграму. Спочатку, використовуючи методи УстановитиСерію() і УстановитиТочку(), ми отримуємо або наявні, або нові точку та серію. Точки й серії однозначно ідентифікуються своїми значеннями, як які ми використовуємо працівника та вид розрахунку з результату запиту.
Після того як точку та серію отримано, за допомогою методу ОтриматиЗначення() ми отримуємо відповідне їм значення діаграми.
Потім ми додаємо до значення діаграми новий інтервал, задаємо його початок і кінець, задаємо текст інтервалу, який показуватиметься у спливаючій підказці, і задаємо розшифрування інтервалу, яке виконуватиметься під час подвійного клацання мишею на цьому інтервалі.
Після того як усі значення діаграми сформовано, ми розфарбовуємо серії своїми кольорами. Серії діаграми являють собою колекцію значень, яку ми перебираємо за допомогою конструкції Для кожного …¦ Цикл.
8. На завершення створення нашого звіту налаштуємо вісь часу для діаграми Ганта. Для цього використаємо команду контекстного меню Налаштування

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

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

10. Натиснемо ОК і закриємо вікно налаштування діаграми Ганта.
11. Запустимо 1С:Підприємство в режимі налагодження та подивимося на результат роботи звіту:
12. А тепер подивимося, як виглядає механізм витіснення за періодом дії У дії. Відкриємо документ Нарахування працівникам №–3 і замість одного прогулу з 1 по 10 число задамо Гусакову два прогули з 3 по 7 число та з 12 по 15 число.
13. Проведемо документ і знову натиснемо Сформувати у нашому звіті:
Тепер ви наочно бачите, як записи виду розрахунку Невихід витіснили за періодом дії запис розрахунку Оклад, змінивши його фактичний період дії.
![Список Начисления Действия -о] /=] О Дета начала базов... Дата окончания базов... Актив... Сторно Сотрудник Результат Г рафик работы Исходные данные / ч 01.09.2003 0:00:00 30.09.2003 23:59:59 Гусаков Николай Дмитриевич 7 000,00 Г рафик мастеров 7 000,00 0](/img/materialy_praktikum_12_sozdanie_protsedury_rascheta_zapisey_registra_nachisleniya/386.png)
![Список Начисления Действия -о] Т _Э Регистратор Период... - Но... Виа ра... Период действия Дата начала пер... Дата окончания пер... Дата начала базов... Дата окончания базоїЛ ш Начисления сотру... 01.10.2003... 1 Оклад 01.03.2003 0:00:00 01.03.2003 0:00:0](/img/materialy_praktikum_12_sozdanie_protsedury_rascheta_zapisey_registra_nachisleniya/387.png)




