Готовимся к экзамену 1С: Специалист по платформе 8.х. Решаем расчётные задачи.


Цель данной публикации - познакомить начинающих программистов с тем что происходит "внутри программы" при решении расчётных задач. И так как подобных публикаций я нигде не встречал - я решил восполнить этот пробел. На примере решения одной задачи, похожей на экзаменационную задачу, вы сможете быстро окунуться в атмосферу сложных периодических расчётов и понять, что не такие они уж и сложные :)
И самое ГЛАВНОЕ: вы поймёте как нужно думать и в каком направлении, какие могут возникнуть сложности, на что надо обратить внимание и как "разложить задачу по полочкам".

Сразу хочу предупредить: эта публикация не сможет дать вам в полном объеме необходимый багаж знаний! Автор не ставит перед собой такую цель, да и это просто физически невозможно. Для более глубого изучения платформы хочу порекомендовать вам посетить курсы (очные или дистанционные) фирмы 1С или фирм-партнёров:

Учебный центр №1

http://www.1c.ru/rus/partners/training/uc1/courses.jsp?type=44

Учебный центр №3

http://www.1c-uc3.ru/dist.html

И прочитать следующие книги:

Радченко М. "Практическое пособие разработчика"

Хрусталева Е.Ю., Кухлевский Д.С., Козырев Д.В., Габец А.П. «Реализация прикладных задач в системе 1С Предприятие 8.2».


Начнём:

1. Условия задачи на рис.1.

2. Сначала определим сколько видов расчета (ВР) нам надо задействовать.

- фиксированная сумма

- надбавка

- компенсация

- пособие (больничный)

3. Теперь разберёмся где они будут храниться, в каких планах видов расчёта (ПВР).

- фиксированная сумма: это просто сумма денег, она неизменна, значит ей не нужен период действия. Для таких ВР обычно используется ПВР Дополнительные начисления. У этого ПВР должен быть снят флажок – Использует период действия.

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

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

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

4. Какие нужны регистры. Итак мы определили что нужно два ПВР. Создаем два регистра расчетов с аналогичными названиями. Привязываем к регистрам соответствующие ПВР, настраиваем периоды действия и график (ПВР Основные начисления).

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

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

- пособие (больничный): тут просто, чётко сказано что по пятидневке.

А вот теперь у нас получилась проблема: график будет всегда браться «по сотруднику» (мы ведь его связали с регистром графиков), но а нам же еще нужно для пособия использовать график – Пятидневка. Решим эту проблему за счёт второго ресурса в РС Графики работы. (Прим. автора: про другие способы связи с графиками можно узнать здесь, либо более подробно - на курсах 1С). 

6. В чем учет времени. Какие будут графики – мы определили, а теперь нужно посмотреть, а в чём учет рабочего времени будет: в часах, в днях, или может в минутах? Что хранить в графиках?

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

7. База. Теперь разберёмся, а базу для расчетов нам нужно получать или нет. Сказано что для пособия (больничный) нужна сумма за прошлый месяц. Это значит что нужно получать базу. А по какому регистру расчетов? Сказано что базой для пособия будет гарантированный оклад (фиксированная сумма), который у нас хранится в ПВР Дополнительные начисления (регистр расчета ДополнительныеНачисления), значит нужно указать в настройках ПВР Основные начисления (где пособие), что база будет браться из ПВР Дополнительные начисления (переключатель - Зависимость от базы и флаг - Базовые планы видов расчета). Переключатель поставим в положение - Зависит по периоду регистрации. Почему так? Система будет смотреть попадает ли период регистрации фиксированной суммы в указанный вами у пособия базовый период. А так как фиксированная сумма не обладает периодом действия, а только периодом регистрации, то вполне логично его и "ловить" (более подробно можно узнать из книг, либо на курсах 1С).

8. Теперь посмотрим еще нужно для задачи:

- Фиксированная сумма. Поместим в константы («Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода»);

- Часовая ставка для надбавки. Она может меняться каждый день, поэтому будем хранить её в регистре сведений, периодичность – В пределах дня («Она может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода»);

- Величина пробега для автомобиля. Напомню что сотрудники могут ездить на разных автомобилях («В зависимости от величины пробега автомобиля»). Величину пробега будем накапливать документами «Пробег» и хранить в регистре накопления;

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

- Разбивать ВР на периоды не требуется («все данные вводятся только в пределах одного месяца»);

- Нужно предусмотреть ввод суммы в документ Начисление зарплаты («некоторой суммы, указанной в документе «Начисление зарплаты» и выплачиваемой за каждые 100 километров пробега»). У нас есть в документе реквизит табличной части на этот случай;

- Пользователь будет сам создавать виды расчетов («предоставить пользователю возможность самостоятельно создавать новые виды расчетов»). Создадим реквизиты «Способ» в ПВР, тип – перечисление СпособРасчета.

9. Разбор кода. А теперь посмотрим на код. У нас два модуля – модуль документа Начисление зарплаты и общий модуль – Расчет. В модуле документа мы делаем предварительные записи по регистрам (получение данных, формирование периодов действия и т.д.), в общем – уже непосредственно расчёты (более подробно вы можете узнать из книг, либо на курсах 1С). Посмотрим на код модуля документа.

10. Модуль документа. Для удобства восприятия и отладки, автор создал несколько табличных частей в документе, отдельно для каждого ПВР. Сначала идёт запрос по табличной части Основные начисления, параметром передаем ссылку на документ. По результатам запроса делаем записи в регистр, записываем период действия (напомню, у этого регистра есть период действия), далее проверяем Способ расчета (способ расчета пользователь будет указывать для вида расчета в режиме 1С: Предприятие), если способ расчета Надбавка – записываем в Параметр (это реквизит регистра расчета)  часовую ставку. Если способ расчета Больничный – указываем базовый период (прошлый месяц). Напомню, базовый период указывается для того чтобы получить базу (сумму для расчетов) за какой-то период.

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

И наконец делаем запрос по табличной части Дополнительные начисления. Если способ расчета Фиксированная сумма – сразу записываем результат из константы, он у нас меняться не будет. А если способ Компенсация, тогда извлечем, соединением по сотруднику, из регистра накопления автомобили на которых ездил сотрудник в течении месяца (1), пробег этих автомобилей (2), и размер компенсации для каждых 100 км пробега, который у нас заполняется пользователем в документе Начисление зарплаты (3).

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

11. Общий модуль Расчет. Теперь когда у нас сделаны предварительные записи - сформированы периоды действия (надбавка может быть вытеснена больничным), сторно-записи (если больничный в другом периоде), собраны нужные для расчетов данные (записаны в реквизиты Параметр, Параметр1) – приступим к расчетам (напомню, нам нужно 4-е вида расчетов произвести, см. п. 2):

- Результаты по фиксированным суммам уже записан.

- Рассчитываем результат по Компенсациям: пробег каждого в отдельности автомобиля (Параметр) делим на 100 км, получаем целое число (кол-во «кусков» по 100 км) и умножаем на сумму из документа (Параметр1).

- Рассчитываем результат по Надбавкам: обращаемся к таблице ДанныеГрафика (нельзя брать данные графика из регистра сведений), извлекаем из нее количество фактически отработанных часов (ЗначениеФактическийПериодДействия КАК ФактЧасы). Разберём что есть «ЗначениеФактическийПериодДействия». Первая часть «Значение» это ни что иное как название ресурса из регистра сведений Графики работы, ресурса в котором хранятся часы, а вторая часть – «ФактическийПериодДействия» - значит что мы получим значение часов после всех вытеснений (в нашем случае вытеснение делает только больничный, но может быть например, и невыход, прогул, и прочее).  Умножим ФактЧасы на значение реквизита Параметр (напомню, туда мы записали часовую ставку одинаковую для всех сотрудников), и получим результат.

- Рассчитаем последний ВР – Пособие (больничный): для этого нам нужно половину оклада (50%) за прошлый месяц разделить на количество рабочих дней в прошлом месяце (получим среднюю дневную ставку) и умножить на количество дней болезни. Количество дней болезни мы получим вот так: ЗначениеДниПятидневкаФактическийПериодДействия КАК ДниПятидневка. Второй ресурс регистра сведений Графики работы (ЗначениеДниПятидневка) хранит рабочие дни по пятидневке, и значит мы получим фактически проведённые на больничном дни. Далее, сумму оклада прошлого месяца (ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База) нам надо получить из другой таблицы -  ОсновныеНачисленияБазаДополнительныеНачисления. Название говорит само за себя – для видов расчета из ОсновныеНачисления (для больничного) будет взята база из регистра ДополнительныеНачисления (фиксированная сумма). Не забывайте про проверку на NULL, ведь базы может и не быть. И наконец, рабочие дни прошлого месяца. Получим их вот так: ОсновныеНачисленияДанныеГрафика.ЗначениеДниБазовыйПериод КАК РабДни. Третий ресурс регистра сведений График работы «ЗначениеДни» хранит рабочие дни по графику сотрудника, «БазовыйПериод» - указывает что дни будут взяты за указанный базовый период - за прошлый месяц (период между БазовыйПериодНачало и БазовыйПериодКонец). Вот мы и получили результаты по Пособиям. Соответственно по сторно-записям делаем результаты со знаком «минус». 

12. Дополнительно: запросы в общем модуле нужно делать по каждому виду расчета (способу) отдельно, в этом решении не реализовано. Также не учтены приоритеты, из моего опыта, на экзаменационных задачах это не требуется если вы правильно записываете виды расчетов. Но что такое «приоритеты» вы должны знать, это важно. И еще обратите внимание как делается соединение таблиц в запросе по номеру строки.

13. Самая интересная часть – тестирование:

- нужно заполнить графики;

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

- нужно ввести фиксированную сумму за март месяц, чтобы она попала в базу пособия  и надбавку (тоже за март), чтобы посмотреть вытеснение ее пособием и создание сторно-записей (документ № 3);

- нужно ввести пособие за апрель, посмотреть вытесняет ли оно надбавку, создает ли сторно-записи (документ № 4);

- нужно ввести документы Пробег за март. Запишем в регистр накопления пробеги автомобилей за период;

- нужно ввести компенсации за март (документ № 1);

14. Типичные ошибки при тестировании:

- нет данных графика (создать, заполнить, сделать связь измерения/реквизита с графиком);

- нет базы (сделать настройку ПВР-ов, указать базовые виды расчетов, указать базовый период, указать нужную таблицу в запросе и проверить что берётся в запросе из этой таблицы).

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

16. Подводим итоги:

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

- потом графики и база

- потом дополнительные данные (регистры сведений, регистры накопления, константы и т.д.)

- дальше написание кода и тестирование


Желаю удачи!

 

Общий перечень требований к экзамену 1С: Специалист и рассмотрение типичных ошибок.

Бизнес-процессы для экзамена 1С: Специалист.


Новое (12.05.2012). Добавлены дополнительные материалы в rar-архиве: несколько решенных задач и краткое описание того что в них. Например, вы можете посмотреть: в какой задаче есть перерасчеты, где есть диаграмма Ганта, а где разбитие на периоды. Прошу понять, эти задачи автор решал в процессе подготовки к экзамену и их решения не идеальны. Но не переживайте на этот счёт, после того как вы прорешаете штук 20 задач, у вас сформируется правильное представление о многих вещах.





Файлы обработки:

-