Базовый курс. Занятие №15
Последнее занятие 4-го блока.
Необходимо изучить следующие главы.
Глава 13. Разработка отчетов.
Глава 14. Универсальные алгоритмы.
Глава 15. Сторнирование записей регистров расчета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Задание Выполнил. Небольшие трудности возникли только при расчете НадбавкиРуководителю, и так проблем нет…
А теперь ответы на вопросы?
Что нового я узнал в третьем да и не только третьем, так это почти все что я услышал, увидел и прочитал тут. Отдельное спасибо за краткий курс БухУчета и РасчетаЗП
Трудности возникали в основном при работе с регистром.помогает справиться повторный просмотр материала. По мне поподробнее бы это краткий курс БухУчета и РасчетаЗП, а остальное наверное можно будет увидеть в продвинутом.
А так еще раз СПАСИБО ВАМ,за превосходные курсы!
С уваженем Алексей! Готов помогать, продвигать Ваши курсы! Советую все кого знаю, кто хочет чего нибудь получить от 1С.
Поздравляю с финалом базового курса! :)
Спасибо, приятно было познавать 1С с Вами
Задание выполнено.
Все вроде шло нормально пока не дошла до премии руководителю, сама сделать не смогла, поэтому разбирала с решением ДЗ.
Эта тема для меня оказалась тяжеловата, но думаю что здесь нужна практика и одновременный просмотр уроков.
Материал для меня полностью новый, не знаю пригодится ли в ближайшем будущем, поэтому пока заострю внимание на других темах, а изучать надо очень много. В 1с я новичок.
Сделано.
1) Добавлены требуемые реквизиты в планы видов расчетов (типы – перечисления).
2) Сделан общий модуль РасчетНачислений с галочкой Привилегтрованный. Теперь в документе идет сначало движения без расчета, потом обращаемся в процедуру РассчитатьНачисления(ДокОбъект, Отказ) Экспорт, откуда уже идет обращения в процедуры по основным начислениям или по дополнительным с учетом новых свойств.
СпРасчетов = Новый СписокЗначений;
ДвиженияОсновные = ДокОбъект.Движения.ОсновныеНачисления;
ДвиженияДополнит = ДокОбъект.Движения.ДополнительныеНачисления;
Запрос = Новый Запрос;
Запрос.Текст=”
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| 1 КАК Расчет,
| ОсновныеНачисления.ВидРасчета.КатегорияРасчета.Порядок КАК ПорядокРасчета,
| ОсновныеНачисления.ВидРасчета,
| ОсновныеНачисления.ВидРасчета.КатегорияРасчета КАК КатегорияРасчета
|ИЗ
| РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
|ГДЕ
| ОсновныеНачисления.Регистратор = &Регистратор
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| 2,
| ДополнительныеНачисления.ВидРасчета.КатегорияРасчета.Порядок,
| ДополнительныеНачисления.ВидРасчета,
| ДополнительныеНачисления.ВидРасчета.КатегорияРасчета
|ИЗ
| РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
|ГДЕ
| ДополнительныеНачисления.Регистратор = &Регистратор
|
|УПОРЯДОЧИТЬ ПО
| ПорядокРасчета,
| Расчет
|ИТОГИ ПО
| ПорядокРасчета,
| Расчет
|”;
Запрос.УстановитьПараметр(“Регистратор”,ДокОбъект.Ссылка);
Результат = Запрос.Выполнить();
ВыборкаПоПорядку = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоПорядку.Следующий() Цикл
ВыборкаПоРасчету = ВыборкаПоПорядку.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоРасчету.Следующий() Цикл
Выборка = ВыборкаПоРасчету.Выбрать();
СпРасчетов.Очистить();
Пока Выборка.Следующий() Цикл
Расчет = Выборка.Расчет;
СпРасчетов.Добавить(Выборка.ВидРасчета);
КонецЦикла;
Если Расчет = 1 Тогда
РассчитатьОсновныеНачисления(СпРасчетов, ДокОбъект, Отказ);
ИначеЕсли Расчет = 2 Тогда
РассчитатьДополнительныеНачисления(СпРасчетов, ДокОбъект, Отказ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
3) Сделаны новые виды расчетов: компенсация – основное начисление, остальные – дополнительные.
4) Отчет на основе компановке данных с настройкой вывода в таблицу.
1) основное новое – это расчеты. с этим разделом я очень мало знакома вообще и, как правильно было замечено в начальном видео этого раздела, лезть в эту область мне никогда особо не хотелось глубоко, хотя зарплату сопровождаю и разбираюсь, просто на это уходит очень много времени.
После курсов начала достаточно просто ориентироваться в управляемых формах, пришло понятие когда прописывать на клиенте, когда на сервере.
2) в основном в понятии что прописывать в базовых, что в ведущих у планов видов расчетов, долго игралась при выполнении заданий.
3) сложно сказать, т.к. плохо ориентируюсь в теме, по работе знаю, что основные ошибки расчетчика – это неправильное вытеснение периода (неправильное оформление кадрами или самим расчетчиком).
Создал перечисление СпособыРасчета. Добавил соответствующие реквизиты для всех планов видов расчета. Также добавил числовой реквизит Категория. Заполнил новые свойства в пользовательском режиме.
Что касается доработки алгоритмов расчета, то делал все синхронно с просмотром видео уроков 14 главы. Пришлось немного помучатся с премией руководителю, поскольку алгоритм её расчета не похож на другие. Доработал динамический запрос.
Отчет сделал с помощью СКД.
1. Блок для меня был очень интересным, поскольку с расчетными задачами почти не сталкивался, а все знания были поверхностными. Теперь хочется попробовать использовать объекты периодических расчетов 1С не только для расчета заработной платы.
2. Главная проблема – нехватка времени. Других затруднений не было.
3. Пример реализации других видов периодических расчетов (не зарплаты).
Задание выполнил.
При выполнении очень помогла проработка главы видеоуроков о создании универсальных алгоритмов. Фактически, там как раз почти все и реализовано.
1. Одно сомнение все-таки появилось. Может я пропустил, но мне кажется, что в видеоуроках не проявилась необходимость расчета с различными категориями (т.е. примера такого не оказалось). Когда я попытался реализовать такой пример, конфигурация сругалась, что, мол, “не реализован такой способ расчета”. И это потому, что уже в конце расчета, при переборе записей из набора они перебираются все – нет отбора по категориям в этой части алгоритма (вот это то место, которое я не обнаружил в видеоуроках).
Чтобы обойти эту трудность, я выполнил следующее:
1) В первоначальном запросе процедуры РассчитатьРегистрРасчета() добавляем извлечение поля ВидРасчета, в секцию ИТОГИ ПО добавляем СпособРасчета. Т.к. в наборе может быть несколько записей с одним и тем же ВР, слово РАЗЛИЧНЫЕ оставляем.
2) Далее, для каждой категории формируем массив ВР, которые должны быть рассчитаны (при
обходе выборки по детальным записям).
3) Этот массив передаем в процедуру ПолучитьДанныеДляРасчета(), где используем для отбора получаемых записей:
Регистратор = &Регистратор И ВидРасчета В (&МассивВидовРасчета)
– и аналогично для физических таблиц.
4) В процедуру РассчитатьЗаписиРегистраРасчета() этот массив также передаем, чтобы при обходе набора записей пропускать по условию:
МассивВидовРасчета.Найти(Запись.ВидРасчета) = Неопределено.
– вот при выполнении этих действий на заключительном этапе расчета расчитывались только записи подходящей категории.
2. С ежемесячной премией, как наверное многие, не обратил внимания на формулировку “…по всем начислениям, сделанным в текущем месяце”, т.е. зависимость по периоду регистрации. Но когда обнаружил это при просмотре решений, далее добавил необходимые доработки, в т.ч. и
дополнительный регистр расчета (по правде, регистр добавил не сразу, а только после того, как вышла ошибка). Регистры рассчитываются и записываются строго один за другим, поэтому нет
необходимости устанавливать для ежемесячной премии категорию (т.е. оставляем по умолчанию 0).
3. С надбавкой руководителю идея с надлежащим параметром “Измерения” понятна. Также понятно, что встраивание этой особенности в общий алгоритм приводит к сильному его усложнению. Впрочем, конечно главное здесь – продемонстрировать возможность получения базы по всему подразделению.
Есть небольшой вопрос.
В процедуре ПолучитьДанныеДляРасчета() в запросе мы извлекаем поле ИмяРегистра>.Размер, однако далее в процедуре РассчитатьЗаписиРегистраРасчета() используется Запись.Размер. Понятно, что раз набор предварительно был записан, можно использовать любое выражение из двух. Какой вариант предпочтительнее с точки зрения универсальности и дальнейших возможных модификаций?
Обратная связь.
Этот блок оказался для меня значительно более легким, чем я ожидал. Мне кажется, что наши достижения после освоения данного блока наиболее далеки от реальных задач, если сравнивать с учетом движения средств и бух.учетом.
Однако такая ситуация, по-моему, имеет объективные причины. И дело здесь в том, что все-таки сам по себе учет периодических расчетов – это сложная тема, а встроенные в платформу механизмы – тоже являются более сложными. Поэтому для лучшего освоения сути этих механизмов на начальном этапе примеры должны быть наиболее простыми.
Что касается собственно моих достижений, то это – опыт построения системы учета зарплаты с нуля.
Ранее мне приходилось разбираться в отдельных особенностях типовой ЗУП, однако получающиеся при этом знания фрагментарны. Данный же блок даёт общую картину.
Кроме того, простота примеров даёт больше свободы в экспериментировании с применяемыми методами (т.е.: в типовой конфигурации стоит сделать ошибку – часто единственный вариант избавиться от неё – это вернуться к типовому решению, а здесь же можно видеть несколько различных способов решения проблемы и выбирать из них наиболее приемлемый).
Спасибо за информацию.
Обязательно учтем ее при подготовке новой версии курса.
>Какой вариант предпочтительнее с точки зрения универсальности и дальнейших возможных модификаций?
Считаю, что все-таки более правильно обращаться к данным запроса.
Создал необходимые реквизиты планов видов расчёта(Основного и Дополнительного). Задал их в пользовательском интерфейсе. создал функции получения данных по параметрам планов видов расчетов , основная часть выполняется в общем модуле на сервере. и вызываю их в модуле объекта.
поигрался с запросами до тех пор пока не получил необходимый результат для всех видом, сократил код до вызова 1 процедуры на сервре при расчете с необходимыми параметрами. скрипт запросов меняю динамически невсегда заменой строк. время жмёт ))
1. В задании 15 “Что нового я узнал в 3 блоке”, но думаю имели ввиду 4. Могу сказать что блок новый, хоть и делал некоторые надрезы(скальпелем) в типовых конфигурациях если расчёты были не верны учитывая постоянно меняющееся законодательство.
2. Глобальное затруднение с нахождением свободного времени, очень плотный для меня график.
3. Неуспеваю Добраться до МГ, но всё забираю и по возможности прослушаю.
Задание выполнено.
1.Создал перечисление «Способы расчета». Добавил в планы видов расчета реквизиты «Способ расчета», тип перечисление «Способ расчета», и «Категория расчета, тип «Число».
2.В предприятии добавил новые виды расчетов «Годовая премия», «Премия ежимесечная», «Надбавка руководителю отдела» – это дополнительные, и «Компенсация за обеды» – это основной вид расчета.
3.Создал общий модуль «Расчет ЗП» и добавил процедуры «РасчитатьРегистрРасчета(Набор, Отказ) Экспорт», «РасчитатьЗаписиРегистраРасчета(Выборка, Набор, Отказ)», «ПолучитьПараметрыДляРасчета(Выборка)», «ПолучитьДанныедляРасчета(Параметры,ИмяРегистра,Ссылка,КатегорияРасчета)».
4.В обработке проведения документа «Начисления заработной платы» добавил вызов процедуры «РасчитатьРегистрРасчета(Набор, Отказ)».
5.Для расчета надбавки руководителю определил отдельный способ расчета «НадбавкаРуководителюОтдела». База для расчета определяется как («База по подразделению» – «База по сотруднику и подразделению»).
6.Отчет по начислениям строится на основании таблиц регистра расчета «Основные начисления» и «Дополнительные начисления».
Задание выполнено.
Добавлены реквизиты планов видов расчетов “Категория расчета”, “Способ расчета”. Реализован универсальный алгоритм, показанный в видеоуроках. Создан новый план видов расчетов и регистр расчета для учета начислений, зависящих от базы по периоду регистрации. Для реализации надбавки руководителя пришлось подсмотреть в решение. К сожалению, не смог догадаться, что можно разделить месячную премию на премию сотруднику и премию руководителю – это сильно облегчает задачу. Создан отчет по начислениям.
Подскажите, пожалуйста, а как учитываются в базе (по периоду действия) начисления, которые не имеют периода действия? Например, в одном плане видов расчетов имеются: премия годовая и премия квартальная. Для этого плана НЕ стоит галочка “использует период действия”, зависимость по базе = “по периоду действия”. Премия годовая зависит по базе от премии квартальной. Как поведет себя система при расчете годовой премии, ведь в соответствующем данному плану регистре расчета не будет поля “Период действия”?
Обратная связь:
1. В данном блоке практически вся информация для меня была новой, зарплатой вплотную раньше не занимался.
2. Трудные темы – настройка планов видов расчетов, регистров расчетов, алгоритмы получения базы. Затруднения преодолевались многократным просмотром видеоуроков и практикой.
3. Все темы достаточно подробно раскрыты.
В случае, если период действия для записи регистра расчета неопределен, система при расчете базы ориентируется на период регистрации.
Задание выполнено, хоть и с опозданием.
Созданы перечисления “Способ расчета” и “Категория расчета”. В ПВР созданы соответствующие реквизиты.
Реализовал новые виды расчета. (Получились не все). В целом тема понята мною слабовато, буду повторять.
Материал полностью новый и достаточно сложный для меня.
Для успешного усвоения потребуется повторение и неоднократная проработка многих моментов.
Задание выполнено. Хоть и увидел что выложено решение, но не смотрел его, т.к. уже было почти все сделано. Поэтому пишу отчет.
Категории расчетов были добавлены еще ранее. Добавил СпособыРасчета (дополнительно порылся в ЗУП КОРП на предмет “а как же там”): ПоМесячнойТарифнойСтавкеПоДням, ПоСреднемуЗаработкуДляОтпуска, Процентом, ФиксированнойСуммой, НулеваяСумма, ФиксированнойСуммойПоДням, ПроцентомРуководителюОтдела.
В общем модуле РасчетЗП создал универсальные процедуры расчета. Проверил их работу. В запросе сначала забыл наложить параметры на данные графика, но посмотрев выгрузку результата запроса все понял и исправил.
Обеспечил поддержку новых видов расчета. Проверил по бумажке – сошлось :)
Для надбавки руководителю ввел доп. параметр в структуре с параметрами, используемыми для сборки запроса.Использую измерение Подразделение и доп.левым соединением получаются данные базы по измерениям Сотрудник, Подразделение. В База берется их разница. Занес премии нач-ка и сотрудника. Надбавка взяла процент только с премии сотрудника, как и требовалось. Категория у надбавки руководителю – вторая. У ежемес. премии – первая.
Отчет сделан.
По блоку:
1. Уже писал что блок для меня новый. После освоения понял как это работает и как можно использовать.
2. Затруднений не было. Назад практически не возвращался, т.е. повторно почти не прослушивал уроки блока.
3. Затрудняюсь ответить.
Задание выполнил.
С отчетом по начислениям никаких проблем.
С универсальностью сложнее, но в целом понятно как должно все работать.
Не сделал премию руководителю, причем вроде понятно, как ее считать, но сложно ее “воткнуть” в тот код который уже есть)))
Для меня этот блок хоть самый сложный, но очень интересный.
Недаром он вынесен в самый конец курса!
В целом понятно, как решать рассчетные задачи, вроде понимаю, как работают механизмы и объекты системы, но пока нет уверенности, смогу ли сам решить конкретную задачу…
в общем, в “каникулы” ))), которые у нас вроде как намечаются между Базовым и Продвинутым курсами надо будет позакреплять этот блок…
а когда будет выложено финальное задание? или я просмотрел его?
Финальное задание появиться завтра.
Задание выполнено.
Резюме.
1. Способ расчет и категории расчета задал через соответствующие перечисления. Значения перечисления категорий ограничил третьим уровнем зависимости. С модификацией алгоритмов проблем не возникло; учел, что после каждого прохода цикла по категориям расчета нужно делать запись регистра расчета.
2. Премия ежемесячная и по итогам года расчитывается как и премия квартальная. Задал для них единый способ расчета – Премия. Внес их в доп. начисления. Так как по условиям задачи они рассчитываются ” от всех начислений” в базу внес все, кроме прогула.
3. Компенсация обеда. Осн. начисление, способ расчета – Компенсация, базы нет.
4. Надбавка руководителю. Самый сложный вид расчета. Доп. начисление, способ расчета – Надбавка, база – почти все, кроме прогула. Расчет базы надбавки рассчитывается в запросе как разность баз двух вложенных запросов. Каждый – копия запроса вычисления базы из пред. задания, только отличаются параметры измерений. В первом – “Подразделение”, во втором “Сотрудник, Подразделение”.
4. Отчет сделан.
Ответы.
1. Курс прочитан очень хорошо. Появилась какая-то вальяжная уверенность, что расчетные задания – это легко. Хочется верить, что это впечатления не обманчиво.
2. Затруднений не возникло.
3. Хотелось бы подробнее узнать о параметре вирт. таблицы “Разрезы”. А также почему в тип. конфигурациях отказались от доп.начислений.
Заметил ошибку резюме д.з. База для надбавки – только “премия ежемесячная”.
Задание выполнила за исключением расчета надбавки руководителю, не поняла почему запрос именно по этому виду расчета возвращается пустой. Остальное в задании затруднений не вызвало.
Блок для меня совершенно новый, поэтому сложный.
Задание почти сделано. Добавлено перечисление СпособыРасчета со значениями Процентом, ПоОтработанномуВремени, ПоНачислениюОтдела, Отпуск, Невыход, ФиксСуммаДень. Во все планы видов расчета добавлен реквизит Процентом, ПоОтработанномуВремени, ПоНачислениюОтдела, Отпуск, Невыход, ФиксСуммаДень. Алгоритм расчета в конфигурации заменен на универсальный из видео. После отладки документы проводятся, основные и дополнительные начисления рассчитываются. Единственную сложность вызвала надбавка руководителю. Без создания еще одного плана вида расчетов и указания условия неравенства сотрудника в выборке из физической таблицы начислений в функции ПолучитьДанныеДляРасчета() никак не получилось сделать универсальный алгоритм. Буду ждать решения. Реализация отчетов на СКД сложности не вызвала.
Задание выполнено.
1. После блока сложилось общее понимание механизмов – но уверенности что я смогу с ними работать без курса под рукой нет ни малейшей.
2. Универсальные алгоритмы. Решается только многократным просмотром уроков
3. Зарудняюсь ответить, поскольку весь блок вызвал вопросы.
Задание выполнил, но не полностью.
Оптимизировал алгоритм проведения документа Начисление ЗП. Вынес в общий модуль расчет. Основывался на уроках 4 блока, так что многое позаимствовал, но попробовал сам все написать. Понимание того, как это нужно организовывать сложилось. Но не решил задачу с надбавкой руководителю, так как тема Расчетных регистров для меня полностью новая и в надбавке есть нюансы, которые требуют видимо чуть отклонится в построении общего запроса запроса только для этого вида расчета, можно это решить, но пока не универсальным алгоритмом, хотелось бы увидеть универсальное решение. Буду ждать Вашего решения, чтобы и это потом усвоить.
Отчет создал в СКД, проблем с ним не было, да и в уроках наглядно и понятно объясняется.
1. Блок для меня новый. Многое пришлось по нескольку раз прогонять, чтобы усвоить.
Способы расчета:
-по отработанному времени
-по среднему заработку
-процентом.
А также
– по отработанному времени фиксированной суммой – для компенсации за обеды
– процентом по подразделению без текущего работника – для надбавки руководителю.
Основные начисления все относятся к первичной категории.
Дополнительные начисления: премия годовая и квартальная – первичная категория, премия ежемесячная – первого уровня, надбавка руководителю – второго уровня.
Компенсация за обеды – основные начисления, настройки аналогичны окладу, кроме способа расчета (по отработанному времени суммой), требуется настройка параметров для расчета и формулы расчета.
Премия по итогам года – дополнительные начисления, процентом, доработка расчета не требуется.
Премия ежемесячная – дополнительные начисления, процентом, рассчитывается после первичных начислений за месяц, доработка расчета не требуется.
Надбавка руководителю отдела – дополнительные начисления, процентом, база – премия ежемесячная по подразделению минус база самого работника. Дополнительный параметр “ИзмерениеПоПодразделению”, к запросу по дополнительным измерениям добавляем таблицы базы с отбором по одному измерению “Подразделение”, и составное поле (БазаПодразделения-БазаРаботника), вводим отдельный способ расчета.
1. Что нового я узнал в третьем блоке или в чем поменялись взгляды после изучения
материала? Очень сложная для понимания тема, требует больше времени, чтобы разобраться до конца.
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть? Проектирование планов видов расчетов -сложнее всего правильно определить правильные параметры начислений. Получение данных из регистров расчетов.
3. Какую тему, имеющую отношение к текущему блоку, вы бы хотели подробнее
раскрыть в мастер-группе? Хотелось бы поподробнее об использовании механизма расчетов в других задачах, кроме расчета зарплаты.
Обратная связь:
4-й блок для меня абсолютно новый. Раньше никогда расчетными задачами не занимался. Возникли затруднения с пониманием получения базы и графиков. Т.е. данных виртуальных таблиц регистра расчета. Мне кажется, что в уроках все рассказано, и для полного понимания надо еще несколько раз пересмотреть ключевые моменты, чтобы информация отложилась.
Задание выполнено.
Все сделано по шаблонам уроков. Трудностей не возникло. После внесения способов расчета и категорий, расчет поменялся и пришлось найти ошибки своего алгоритма. Новым оказался вид расчета надбавка руководителю, но и про него рассказывается в уроках. Отчет по начислениям это совсем просто.
Честно говоря, информация как-то еще не осела в голове. Если со способами расчета все более менее понятно, то категории вызывают некоторое непонимание. Кажется, что такие вещи надо на уровне платформы реализовывать, а не в программе.
Задание выполнено(почти), но возникли вопросы Как правильно “красиво” устанавливать базовый период для расчета по среднему за период
Обратная связь
По блоку , в целом;
1 Получил “прояснение” в части периодических расчетов. Все последовательно и системно
2 Сложность вызвала классификация по Видам Расчета , Попробовал вывести собственный алгоритм определения от конца: Сначала определяю какие данные нужны получить для расчета, затем соответствие опциями регистра для его конфигурации и “появлению” этих данных. После этого “наполнилось” содержанием терминология опций. Остался открытым вопрос как определить оптимальное количество регистров. Мне кажется достаточно двух для любых случаев.
>Как правильно «красиво» устанавливать базовый период для расчета по среднему за период
Можно отталкиваться от периода действия записи регистра расчета.
А также задавать для вида расчета количество месяцев, для которых нужно рассчитать базу.
>Мне кажется достаточно двух для любых случаев.
Да, можно обходиться двумя регистрами.
Задание выполнено. Создано перечисление СпособыРасчета, значение которого добавлено в реквизиты планов видов расчета. Туда же добавлен реквизит Приоритет для определения приоритета вычислений. Основные расчетные процедуры вынесены в общий модуль Расчеты. Все премии расчитываются по способу расчета ПроцентомОтБазы. Данные для расчета формируются в виде структуры в функции общего модуля:
<code>
Функция ПолучитьДанныеДляРасчета(Запись)
СпособРасчета = Запись.ВидРасчета.СпособРасчета;
ВидРасчета = Запись.ВидРасчета;
СтруктураДанных = Новый Структура;
Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда
//Получение данных графика
Запрос = Новый Запрос(“ВЫБРАТЬ
| ДанныеГрафика.ЗначениеФактическийПериодДействия КАК ГрафикФакт,
| ДанныеГрафика.ЗначениеПериодДействия КАК ГрафикНорма
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГрафика(
| Регистратор = &Регистратор
| И НомерСтроки = &НомерСтроки) КАК ДанныеГрафика”);
Запрос.УстановитьПараметр(“Регистратор”, Запись.Регистратор);
Запрос.УстановитьПараметр(“НомерСтроки”, Запись.НомерСтроки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтруктураДанных.Вставить(“ОтработаноВремени”, Выборка.ГрафикФакт);
СтруктураДанных.Вставить(“НормаВремени”, Выборка.ГрафикНорма);
Иначе
СтруктураДанных.Вставить(“ОтработаноВремени”, 0);
СтруктураДанных.Вставить(“НормаВремени”, 0);
КонецЕсли;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда
Если ВидРасчета=ПланыВидовРасчета.ДополнительныеНачисления.НайтиПоНаименованию(“Надбавка руководителю”) Тогда
ВидРасчетаБаз=ПланыВидовРасчета.ДополнительныеНачисления.НайтиПоНаименованию(“Премия ежемесячная”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ДополнительныеНачисленияРегл.Результат, 0)) КАК Результат
|ИЗ
| РегистрРасчета.ДополнительныеНачисленияРегл КАК ДополнительныеНачисленияРегл
|ГДЕ
| ДополнительныеНачисленияРегл.Подразделение = &Подразделение
| И ДополнительныеНачисленияРегл.ВидРасчета = &ВидРасчета
| И ДополнительныеНачисленияРегл.БазовыйПериодНачало >= &БазовыйПериодНачало
| И ДополнительныеНачисленияРегл.БазовыйПериодНачало <= &БазовыйПериодНачало
| И ДополнительныеНачисленияРегл.Сотрудник <> &Сотрудник”;
Запрос.УстановитьПараметр(“БазовыйПериодКонец”, Запись.БазовыйПериодКонец);
Запрос.УстановитьПараметр(“БазовыйПериодНачало”, Запись.БазовыйПериодНачало);
Запрос.УстановитьПараметр(“Подразделение”, Запись.Подразделение);
Запрос.УстановитьПараметр(“Сотрудник”, Запись.Сотрудник);
Запрос.УстановитьПараметр(“ВидРасчета”, ВидРасчетаБаз);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураДанных.Вставить(“База”, Выборка.Результат);
КонецЦикла;
Иначе
ПолучитьБазуДоп(СтруктураДанных, Запись);
КонецЕсли;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПоСреднемуЗаГод Тогда
ГрафикРаботы = Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”);
ДатаКон = Запись.ПериодДействия – 1;
ДатаНач = ДобавитьМесяц(ДатаКон, (-1)*12);
ДатаНачОтп = Запись.ПериодДействияНачало;
ДатаКонОтп = Запись.ПериодДействияКонец;
ДлинаСуток = 86400; // в секундах
ДлительностьОтпуска = Окр((КонецДня(ДатаКонОтп) – НачалоДня(ДатаНачОтп)) / ДлинаСуток);
ПолучитьБазуОсн(СтруктураДанных, Запись);
СтруктураДанных.Вставить(“ОтработаноВремени”, ДлительностьОтпуска);
//Получение числа рабочих дней в году по шестидневке
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(ГрафикиРаботы.Значение) КАК ГрафикНорма
|ИЗ
| РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|ГДЕ
| ГрафикиРаботы.ТипГрафика = &ТипГрафика
| И ГрафикиРаботы.Дата МЕЖДУ &ДатаНач И &ДатаКон”;
Запрос.УстановитьПараметр(“ДатаКон”, ДатаКон);
Запрос.УстановитьПараметр(“ДатаНач”, ДатаНач);
Запрос.УстановитьПараметр(“ТипГрафика”, ГрафикРаботы);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтруктураДанных.Вставить(“НормаВремени”, ВыборкаДетальныеЗаписи.ГрафикНорма);
КонецЦикла;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ФиксированнойСуммой Тогда
//Получение фактических данных графика
Запрос = Новый Запрос(“ВЫБРАТЬ
| ДанныеГрафика.ЗначениеФактическийПериодДействия КАК ГрафикФакт
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГрафика(
| Регистратор = &Регистратор
| И НомерСтроки = &НомерСтроки) КАК ДанныеГрафика”);
Запрос.УстановитьПараметр(“Регистратор”, Запись.Регистратор);
Запрос.УстановитьПараметр(“НомерСтроки”, Запись.НомерСтроки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтруктураДанных.Вставить(“ОтработаноВремени”, Выборка.ГрафикФакт);
Иначе
СтруктураДанных.Вставить(“ОтработаноВремени”, 0);
КонецЕсли;
КонецЕсли;
Возврат СтруктураДанных;
КонецФункции //ПолучитьДанныеДляРасчета
</code>
Каждая запись рассчитывается с использованием сформированной выше структуры в процедуре общего модуля
<code>
Процедура РассчитатьЗапись(Запись, ДанныеДляРасчета)
СпособРасчета = Запись.ВидРасчета.СпособРасчета;
Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда
Если Не ДанныеДляРасчета.НормаВремени=0 Тогда
Результат = Запись.Размер * ДанныеДляРасчета.ОтработаноВремени / ДанныеДляРасчета.НормаВремени;
Иначе
Результат = 0;
КонецЕсли;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда
Результат = Запись.Размер * ДанныеДляРасчета.База / 100;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ФиксированнойСуммой Тогда
Результат = Запись.Размер*ДанныеДляРасчета.ОтработаноВремени;
ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПоСреднемуЗаГод Тогда
Если Не ДанныеДляРасчета.НормаВремени=0 Тогда
Результат = ДанныеДляРасчета.База*ДанныеДляРасчета.ОтработаноВремени / ДанныеДляРасчета.НормаВремени;
Иначе
Результат = 0;
КонецЕсли;
КонецЕсли;
Если Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
Результат = 0;
КонецЕсли;
Запись.Результат = Результат * ?(Запись.Сторно, -1, 1);
КонецПроцедуры //Рассчитать запись
</code>
Отчет сформирован на СКД.
Обратная связь.
1)Пришло более глубокое понимание расчетных механизмов.
2)Наибольшие затруднения вызвали расчеты базы: много взаимосвязанных виртуальных таблиц затрднили понимание.
3)Где можно еще использовать расчетные механизмы платформы (кроме расчета зарплаты)?
3. На самом деле объекты расчета практически нигде не используются кроме задач ЗП.
В качестве редких примеров можно привести: Аренда помещений и Расчет квартплаты. В этих задачах может быть задействован механизм вытеснений.
Спасибо!
Задание выполнено. После выполнения предыдущего задания и просмотра главы курса по универсализации алгоритмов расчета особых сложностей с выполнением не возникло.
Все требуемые виды расчета описаны с помощью 5 способов: ПоДням, ПоСреднему, Процентом, ФиксСуммаВДень, ПремияРуководителюПодразделения.
При проведении сначала в запросе выбираются данные о присутствующих категориях и способах расччетов, после этого для каждой категории в цикле определяются параметры построения запроса, динамически строится сам запрос, выбирающий необходимые данные для расчета результатов, ну и для каждой записи исходя из способа расчета и данных в запросе рассчитывается результат. На каждом витке цикла по категориям происходит запись набора (в режиме ТолькоЗапись).
Чтобы рассчитать надбавку руководителя подразделения пришлось в запросе сделать дополнительное соединение с 2-мя вирт. таблицами с данными базы, с параметрами связи по реквизитам только по подразделению. Соответственно, база для этого расчета вычисляется как разница между ежемесячными премиями всего подразделения и ежемесячной премией самого сотрудника, для которого идет расчет.
Все указанные в этом задании виды расчета добавил в пользовательском режиме. Категории установил так: Премия ежемесячная – 1, Надбавка руководителю – 2, все остальные – 0 (в том числе и из прошлого задания). Проверил функционирование, все рассчитывается согласно требованиям.
Отчет создал без проблем, в запросе СКД объединяются 2 запроса, каждый к соответствующему регистру. Сам отчет строится по типу “Таблица”.
В данном блоке было очень много новой информации, спасало только то, что я когда-то плотно работал с компонентой расчет и типовой зарплатной конфигурацией в 7.7. Поэтому понятия расчетов, различия периодов действия и регистрации было и т.п. мне были знакомы. Но на платформе 8 с регистрами расчета еще работать не приходилось и 4-й блок сильно помог в освоении этого непростого механизма.
Ожидаю еще более глубокого изучения периодических расчетов в продвинутом курсе, а пока информации вполне достаточно.
Задание выполнено.
1. Создал перечисление СпособыРасчета с элементами ПоОтработанномуВремени, КомпенсацияЗаОбеды, Процентом, Отпуск, НадбавкаРуководителю. Добавил в оба ПВР реквизиты СпособРасчета и КатегорияРасчета. Модификацию алгоритмов произвел аналогично примеру, описанному в уроках.
2. Добавил новые виды расчетов. С Премией по итогам года и Компенсацией сложностей не возникло. Премию добавил в Дополнительные начисления, База: все начисления. Компенсацию в ОсновныеНачисления, вытесняется Отпуском и Прогулом. Произвел корректировки в настройках уже существующих видов расчетов.
Надбавку руководителю добавил в Дополнительные начисления. То что Ежемесячная премия должна иметь зависимость базы не от периода действия, а от периода регистрации заметил слишком поздно. Пришлось создавать еще один ПВР с зависимостью базы по периоду регистрации… добавлять еще один РР и дорабатывать алгоритмы.
Категория расчета для Надбавки руководителю принимает значение 1. Для организации алгоритма расчета по Надбавке руководителю пришлось добавить еще один запрос, который вычисляет базу по всему подразделению. А затем итоговая база получается как разность базы по подразделению и базы по сотруднику. Все попытки получить базу по подразделению, за исключением одного конкретного сотрудника, в одном запросе закончились неудачно.
3. Отчет создал. Особых сложностей не возникло.
Весь материал этого блока был новым. Наибольшее затруднение вызвал механизм расчета результата зависящего от базы. Мне кажется, что на этом моменте в уроках стоит более подробно заострить внимание. Я пересматривал этот кусок несколько раз, однако разобрался только выполнив домашнее задание, используя отладчик и метод научного тыка. В качестве дополнительного материала, хотелось бы рассмотреть применение регистров расчета, в областях, не связанных с расчетом зарплаты.
Задание выполнено, за исключением расчета надбавки руководителю. Не совсем понимаю, как именно это сделать.
Все остальное реализовано аналогично урокам с выносом всех процедур в общий модуль.
Отчет создан. По нему никаких проблем не возникло.
Обратная связь.
1. Блок полностью для меня новый.
2. Темы были все для меня сложные и учитывая недельный перерыв, пришлось все наверстывать в авральном режиме. Из-за этого до сих пор многие вещи делаю методом “тыка”. Придется еще раз пройти заново уроки блока.
3. Ну так как для меня все новое…… соответственно, любая дополнительная тема МГ для меня будет дополнительным плюсом в багаже знаний.
Задание готово.
Для указания способа расчета и категории расчета, добавил, во все планы видов расчета добавил реквизиты, «СпособРасчета» с типом перечисление «СпособРасчета» и, для указания приоритета расчета, реквизит «Категория расчета» с типом «Число». Заполнил реквизиты видов расчета в пользовательском режиме.
Процедуры расчета вынес в отдельный общий модуль на сервере. При проведении документа в модуле объекта в предопределенной процедуре «ОбработкаПроведения», формируем рабочий набор записей регистров. После записи рабочего набора вызываем процедуру общего модуля для расчета записей регистра расчета. В экспортной процедуре общего модуля с помощью запроса выбираем различные категории расчета в порядке возрастания и в цикле вызываю другую процедуру для расчета уже по категориям. Реализовал универсальную процедуру расчета аналогичную, показанной, в уроках, но всё таки немного по другому алгоритму , это связанно с тем что появился вид расчета “Премия руководителю” у которого база берется по всем сотрудникам и для получения базы учитывается только одно измерение “Подразделение”.
Немного не понятно , в задании сказано что нужно реализовать поддержку вида расчета “Премия по итогам года” процентом от всех начислений сделанных за прошлый год, и не указано по сотруднику или подразделению , так что я сделал что бы в базе расчета учитывались все начисления без учета подразделений и сотрудников.
Добавил отчет по начислениям, по месяцам в колонках, и строкам по подразделениям и сотрудникам , на пересечении строк и колонок указываются суммы начислений.
Обратная связь:
1.По расчету было все новое .
2.Небольшие затруднения возникли в основном с виртуальными таблицами по данным графика и получения базы, а так же работа с регистром расчета связанной с многократной записью в зависимости от количества приоритетов расчета.
3. На мой взгляд и по ощущениям на данном этапе ,материала достаточно.