Решения расчетных задач на экзамене 1С:Специалист по платформе 8.3. многовариантны. Поэтому наши слушатели при подготовке к данному экзамену активно советуются с тренером в Мастер-группе, просят оценить и/или покритиковать их способы решения задач. Например, из данной подборки вопросов вы сможете узнать, как быть, если в качестве расчетного периода выбрана Неделя и как можно корректно выполнить расчет удержаний за каждые 15 минут опоздания. Вариантов решений много, но самый оптимальный всегда один!
Вопрос №1: Как решать расчетную задачу на экзамене 1C:Специалист по платформе 8.3, если за расчетный период взята Неделя?
Ответ
У регистра расчета нет периодичности Неделя, есть только День (среди тех, что меньше месяца). Но периодичность День нам не подходит, так как вытеснение должно работать в течение недели, а не дня (при периодичности День, все что выходит за рамки дня будет считаться другим расчетным периодом), при этом при периодичности Месяц, вытеснение будет работать корректно. Поэтому какой-то особой разницы с тем как, если бы расчет выполнялся помесячно, нет, просто вместо одной записи за месяц, будет 4 записи по неделям. Базовый период для расчета больничных, премий и т.д. также указывается Неделя.
Уточняющий вопрос
Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл Если Месяц(ТекСтрокаОсновныеНачисления.ДатаНачала) <> Месяц(ТекСтрокаОсновныеНачисления.ДатаОкончания) Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецМесяца(ТекСтрокаОсновныеНачисления.ДатаНачала); Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.График = ТекСтрокаОсновныеНачисления.График; Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Больничный Тогда Движение.БазовыйПериодНачало = НачалоНедели(ТекСтрокаОсновныеНачисления.ДатаНачала)-7*24*60*60; Движение.БазовыйПериодКонец = КонецНедели(ТекСтрокаОсновныеНачисления.ДатаНачала-1); КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.ПериодДействияНачало = НачалоМесяца(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Больничный Тогда Движение.БазовыйПериодНачало = НачалоНедели(ТекСтрокаОсновныеНачисления.ДатаНачала)-7*24*60*60; Движение.БазовыйПериодКонец = КонецНедели(ТекСтрокаОсновныеНачисления.ДатаНачала-1); КонецЕсли; Иначе Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.График = ТекСтрокаОсновныеНачисления.График; Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Больничный Тогда Движение.БазовыйПериодНачало = НачалоНедели(ТекСтрокаОсновныеНачисления.ДатаНачала)-7*24*60*60; Движение.БазовыйПериодКонец = КонецНедели(ТекСтрокаОсновныеНачисления.ДатаНачала-1); КонецЕсли; КонецЕсли; КонецЦикла;
Ответ
Думаю, что код достаточный. В решении даже предусмотрена некоторая автоматизация (разбивка недели переходящей из месяца в месяц). Единственный момент, признак Сторно можно не указывать, так как он по умолчанию уже равен значению Ложь.
Да, неделю можно программно не разбивать, а вводить периоды полностью вручную.
Вопрос №2: Как реализовать начисление штрафов за каждые 15 минут опоздания на экзамене 1С:Специалист по платформе 8.3?
Вариант 1: Вводить количество минут вручную (по имеющейся информации экзаменатору данный вариант не нравится)
Вариант 2: РС Опоздания, по которому собирать количество целых 15 минуток
Вариант 3: РН оборотный + документ “Опоздания”, и по РН собирать количество целых 15 минуток
Вариант 4: РР Удержания, завести ресурс Минуты, документом “Опоздание” записывать туда, кто опоздал за месяц и на сколько, ПВР Удержания “Штраф”, ставим базовым расчетом “Штраф” :) При расчете в таблице УдержанияБазаУдержания поле МинутыБаза и будет нашими минутами, которые делим на 15 и берем целую часть.
Думаю вариант 4 будет разумнее :) Как считаете?
Ответ
Четвертый вариант кажется самым разумным, но на мой взгляд, хранить минуты опоздания лучше в оборотном РН, а не регистре расчета.
В этом случае при расчете штрафа будет удобно получать данные за месяц из этого РН, которые затем нужно будет разделить на 15 и умножить на размер штрафа.
В этом случае, не нужно делать Штраф базовым для самого себя, можно сразу рассчитывать штраф, исходя из данных в РН.
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.