Базовый курс. Занятие №14
Второе занятие заключительного блока.
Необходимо изучить следующие главы.
Глава 9. Свойства записи регистра расчета.
Глава 10. Программная работа с регистром расчета.
Глава 11. Получение данных из регистров расчета.
Глава 12. Расчет ресурсов регистра расчета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Задание выполнил. Тема достаточно тяжелой оказалась, поэтому по несколько раз пересматривал лекции.
Выявился один неприятный факт: если запущен урок, то в 1С не работают горячие клавиши, а так же Ins, причем именно в 1С, в остальных программах работают нормально. Как только закрываю урок, работа клавиш восстанавливается.
По заданию:
Изначально создал 2 документа, чтоб не путаться с видами начислений. Поэтому основные начисления делаю в документе НачислениеЗП, дополнительные в документе ДополнительныеНачисления. Расчет выполняю в 2 этапа, как учат в лекциях.
У меня этот неприятный не воспроизводится.
Возможно с помощью Ins вы пытаетесь добавить объект метаданных и этого не происходит.
У меня тоже такое бывает, и это не связано с защищенным видео. Но закономерности выявить не могу..
Поздравляю Вас с финалом базового курса! :)
ДЗ выполнил. Блок ЗП совсем сложно дается. Постараюсь до начала продвинутого курса буду разбираться с этим материалом!
Принимаем!
Поздравляю с финалом базового курса!!
Этап 3 Провел семинар на тему «СКД некоторые фишки». Коллегам понравилось узнали немного нового. Определили тему следующего….буду готовиться.
Фото-отчет:
Поздравляю с успешным проведением семинара!
Также поздравляю с финалом базового курса!
Задание выполнил, хоть и уже после решения финального.
Немного запутался со “Сторно”.
Ушёл смотреть решения, Надеюсь завтра будет время сделать Д.З.№15.
P.S. А попутно вопрос, скачал 1.1.9.1. там появились пункты Д,З. очень хорошо (но пока они пустые), вот только не понятно зачем ставятся две базы (обновление и просмотр), либо я чего-то не так обновлять пытаюсь, просто поставил по новому, дабы заново указать только достаточно одну папку.
Спасибо за информацию.
Действительно в двух базах особого смысла нет. Оставил только ИБ с описаниями курса.
Тем не менее обновление можно быть полезным. Для чего оно нужно?
Во-первых, при просмотре уроков, система запоминает этот факт.
Во-вторых, вы можете делать для уроков собственные комментарии. Для этого предназначено поле “Описание (комментарий)”.
Если Вы не хотите, чтобы эта информация потерялась при установке новой версии, нужно будет выполнить обновление конфигурации (Сравнить объединить с конфигурацией из файла).
Задание выполнено. В этот раз не подглядывала в решение.
Отлично!
В документе НачислениеЗаработнойПлаты с помощью конструктора движений создал шаблон для заполнения рабочими записями регистры расчета. Доработал код созданный мастером. Далее записываю плановые данные при помощи функции Движения.Записать().
После этого делаю расчет ресурсов для наборов записей регистров расчета ОсновныеНачисления и ДополнительныеНачисления.
Сначала рассчитываю основные начисления. При этом использую в запросе таблицы РегистрРасчета.ОсновныеНачисления.ДанныеГрафика, РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления и РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления. За тем рассчитываю дополнительные при помощи таблиц РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления и РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления.
Запись рассчитанных ресурсов делаю при помощи функции набора записей регистра расчета Записать(, Истина);
Зашился на работе, думал чуть попозже доделаю. а особенно после того как узнал срок начала продвинутого, решил доделать думал будет сложно оказалось наоборот к концу легче. подглядывать не имею желания. сначала делаю, потом загружаю результат и сравниваю.
Расчет Зп реализовал в модуле документа “НачислениеЗаработнойПлаты” , решил долго не заморачиватся и сделал “побыстрее”. расчитал количество дней в месяце рабочих, расчитал среднюю стоимость дня в тек месяце, посчитал количество дней по окладу( исключая кол дней отпуска и прогулов если таковые имелись) затем добавляю кол дней отпускных рассчитанных за предыдущий период с рассчитанной ценой за день по предыдущему периоду) + сумма квартальной премии если есть.(лобовой метод)
Затем тоже самое с вытеснением повторил. сравнил и .. понял не зря таки, не зря курсы слушал (лобовым методом делал бы и раньше, теперь будем с пониманием делать), посмотрю решение и думаю вложусь и 15 и финал сделаю в срок. хоть и день рождения 2 апреля ))
Добиться определенного результата к дню рождения, это вдвойне приятно :)
С Днем Рождения, Коллега :)
Задание выполнено.
В документе НачислениеЗаработнойПлаты было построено две таблицы для начисления основных и дополнительных начислений по сотрудникам.
Определила обработку проведения:
1) записала движения без результата
2) обработала основные начисления
2)обработала дополнительные начисления
Нахождение суммы начислений по периоду вынесла в отдельную функцию, т.к. она используется и для нахождения результата отпска, и для квартальной премии.
Задание выполнено.
Все процедуры по расчету располагаются в модуле документа.
Сначала делается запись данных в регистр расчета, затем весь расчет.
Ресурсы основного и дополнительного регистров расчета считаются в отдельных процедурах. Для расчета данных в основном регистре используются данные из виртуальных таблиц «РегистрРасчета.ОсновныеНачисления.ДанныеГрафика» и «РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления», «РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления».
Для расчета данных дополнительного регистра используются данные виртуальных таблиц
«РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления», «РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления».
Расчет дополнительных начислений
<code>
Набор = Движения.ДополнительныеНачисления;
Если Набор.Количество() = 0 тогда
возврат;
КонецЕсли;
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Измерения.Добавить(“Подразделение”);
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ДополнительныеНачисления.НомерСтроки,
| ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
|ИЗ
| РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
|ГДЕ
| ДополнительныеНачисления.Регистратор = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Поиск = Новый Структура(“НомерСтроки”);
ПремияКв = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
Для каждого Запись из Набор цикл
Поиск.НомерСтроки = Запись.НомерСтроки;
Если Выборка.НайтиСледующий(Поиск) тогда
Если Запись.ВидРасчета = ПремияКв тогда
Запись.Результат = Выборка.База * Запись.Размер / 100 * ?(Запись.Сторно, -1, 1);
Иначе
ОТказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Неизвестный вид расчета ” + Запись.ВидРасчета;
Конецесли;
Иначе
КонецЕсли;
КонецЦикла;
Набор.Записать(, Истина);
</code>
По такому же принципу рассчитываются данные и основного регистра расчета.
Задание выполнил. Особых трудностей по теме расчетов не возникло.
Сначала добавил в конфигурацию два документа – для отпуска и для разовых начислений. Потом увидел, что в решениях все начисления выполняются в рамках одного документа. Мне показалось интересным реализовать алгоритм с ветвлениями по различным видам расчетов, тем более что реальных задачах, хоть и другие ВР, но все-таки их несколько различных в одной ТЧ. В итоге, с обработкой проведения проблем не возникло.
Трудности оказались в другом, правда несколько не по теме. Хотелось в ТЧ сделать недоступными те реквизиты, которые не имеют смысла (например, начало периода и конец периода для дополнительных начислений) – понятно, что через условное оформление. Однако установить отбор по типу значения ВР с первого раза не удалось, а на второй раз уже, к сожалению, нет времени. Ну, это, скорее к тому, что в будущем ещё придётся повозиться с поведением управляемых форм.
Можно и обойти эту проблему – как у одного из участников – организовать отдельные ТЧ для основных и дополнительных начислений. Дополнительный плюс такого решения – в режиме пользователя не придётся тратить время на выбор типа значения ВР.
>Однако установить отбор по типу значения ВР с первого раза не удалось
Еще один вариант решения задачи – создать служебный реквизит документа, который автоматически заполнять при выборе вида расчета.
А дальше от этого реквизита и настраивать условное оформление.
Да, именно что реквизит документа – тогда все работает. А вот если “добавить колонку реквизита” у ТЧ “Начисления” реквизита формы “Объект”, то, несмотря на то, что при настройке отбора условного оформления добавленная колонка предлагается к выбору наряду с остальными колонками – так не работает. Причем не работает, даже если разместить эту колонку на форме (впрочем, это уже неважно – ведь важно, что установлен флажок “Использовать всегда”).
Это странно, должно работать.
Может быть не указывали оформляемые поля?
Отправил в почту простой пример, где показано, что условное оформление работает по колонкам реквизита.
О! именно про это я и спрашивала в прошлый раз. Поробую реализовать.
Задание выполнила (с подглядкой в выложенное решение(()
Задание выполнено. Правда опаздал со сроками (в решение не смотрел). С выполнением сложностей не возникло, все хорошо разжевано в материалах курса. Расчет делается с помощью 2 этапов записи регистров расчета. Так в наших видах расчета нет зависимости по базе в одном периоде (отпуск за предыдущие 12 месяцев, премия за предыдущие 3 месяца), то проблем с порядком расчета не возникает. Данные графики и базы получаю 3 (по базе, график – основной, график – шестидневка для отпуска) запросами перед проходом по циклу набора записей, выгружаю их в таблицы, а в цикле ищу необходимые записи в таблицах. От одного запроса (по данным графика – шестидневка) можно избавиться если в таб. части начисления у отпуска сразу указать тип графика – шестидневка.
Задание выполнено.
Реализован расчет 4-х видов расчета, указанных в задании. Все данные для расчета вводятся в табличной части документа начисления зарплаты. После этого формируется рабочий набор записей с нулевым результатом. Сформированные движения выгружаются в таблицу значений, где сортируются в следующем порядке: оклад, отпуск, премия. Такая сортировка позволяет верно рассчитать зависимые друг от друга виды расчета. После этого для каждой строки в таблице значений выполняется расчет: формируется запрос в зависимости от вида расчета и используется соотвествующая формула расчета. После того как вся таблица значений рассчитана, она выгружается в наборы записей регистров расчета, осуществляется запись наборов в БД. Конечно, алгоритм далеко не самый оптимальный, в первую очередь, из-за выполнения запросов по графикам и базе в цикле для каждой строки таблицы значений. Посмотрим, какой алгоритм приведен в решении.
Задание выполнил.
Данные базы и графика получаю через виртуальные таблицы – так удобнее, чем используя объектную модель!
Задание не выполнил. Раздел периодических расчетов вызывает трудности.
Уже выложено решение. Так что можно сделать задание с подглядкой..
Задание выполнил. Кстати, посмотрел сейчас решение. Обрадовало, что примерно на 80% все совпадает. :))))
Так же делал проверку на вид расчета (через ТипЗнч()). Только вот базовый период я вычислял сам в обработке проведения.
Единственное, что вчера тупил долго…. Не понимал, почему у меня такое количество дней получается, пока не дошло, что 2 графика. :) Как только в регистр добавил реквизит – все пошло как надо.
Задание выполнено примерно так, как показано в видеоматериалах.
Запись в регистры расчета построена при помощи конструктора, доработана вручную.
Запросом к виртуальной таблице данных графика регистра основных начислений получаю значение графика для периода действия и для фактического периода действия.
Для каждой записи из набора записей регистра расчета получаю номер строки и по этому номеру соответствующую запись в выборке из результата запроса. Если в результате запроса есть запись с таким номером строки, рассчитывается результат записи регистра расчета.
Задание выполнено.
В форме документа определил две табличные части Основные и Дополнительные начисления.
Выбор данных осуществляется универсальной функцией общего модуля
Функция СформироватьЗапросПоТабличнойЧасти(ДокументОбъект, ИмяТабличнойЧасти) Экспорт
ТекстЗапроса = “”;
Для Каждого Реквизит Из ДокументОбъект.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл
ТекстЗапроса = ТекстЗапроса + “,
|Док.” + Реквизит.Имя;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Док.НомерСтроки ” + ТекстЗапроса + ”
| ИЗ
| Документ.” + ДокументОбъект.Метаданные().Имя + “.”+ СокрЛП(ИмяТабличнойЧасти) +
” КАК Док
| ГДЕ Док.Ссылка = &ДокументСсылка”;
Запрос.УстановитьПараметр(“ДокументСсылка” , ДокументОбъект.Ссылка);
Возврат Запрос.Выполнить();
КонецФункции // СформироватьЗапросПоТабличнойЧасти()
Для удобства разместил на форме документа кнопку Рассчитать, по которой все рассчитывается и записываетсся обратно в табличные части документа, а затем при необходимости документ можно проводить с рассчитанными данными.
&НаКлиенте
Процедура Рассчитать(Команда)
РассчитатьОсновныеНачисленияДокумента();
КонецПроцедуры
&НаСервере
Процедура РассчитатьОсновныеНачисленияДокумента()
Документ = РеквизитФормыВЗначение(“Объект”);
Документ.Записать(РежимЗаписиДокумента.Проведение);
Документ.РассчитатьОсновныеНачисления();
Документ.РассчитатьДополнительныеНачисления();
ЗначениеВРеквизитФормы(Документ, “Объект”);
КонецПроцедуры
&НаКлиенте
Процедура ОсновныеНачисленияСотрудникПриИзменении(Элемент)
ТД = Элементы.ОсновныеНачисления.ТекущиеДанные;
Сотр=ТД.Сотрудник;
ТД.ГрафикРаботы = ПолучитьГрафик(Сотр);
КонецПроцедуры
&НаСервере
Функция ПолучитьГрафик(Сотр)
Возврат Сотр.ПолучитьОбъект().ГрафикРаботы;
КонецФункции // ПолучитьГрафик()
&НаКлиенте
Процедура ДополнительныеНачисленияСотрудникПриИзменении(Элемент)
ТД = Элементы.ДополнительныеНачисления.ТекущиеДанные;
Сотр=ТД.Сотрудник;
ТД.ГрафикРаботы = ПолучитьГрафик(Сотр);
КонецПроцедуры
Расчеты выполняются построчно для каждой строки табличной части, например, для регистра Основные начисления:
Процедура РассчитатьОсновныеНачисления() Экспорт
//расчет записей выполняется в транзакции
НачатьТранзакцию();
//создается набор записей регистра расчета
НаборОсновныеНачисления = РегистрыРасчета.ОсновныеНачисленияРегл.СоздатьНаборЗаписей();
НаборОсновныеНачисления.Отбор.Регистратор.Значение = Ссылка;
ВыборкаОсновныеНачисления = ОбщиеФункцииСервер.СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, “ОсновныеНачисления”).Выбрать();
Пока ВыборкаОсновныеНачисления.Следующий() Цикл
ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления, НаборОсновныеНачисления);
КонецЦикла;
//Получаем дополнительные данные, позволяющие выполнить сторнирование записей прошлых периодов регистрации при вводе текущего набора записей
ТаблицаСторно = НаборОсновныеНачисления.ПолучитьДополнение();
Для Каждого СтрокаСторно из ТаблицаСторно Цикл
ДобавитьСтрокуСторноОсновныхНачислений(СтрокаСторно, НаборОсновныеНачисления, ОсновныеНачисления);
КонецЦикла;
//передача набора записей в процедуру общего модуля для расчета
Расчеты.РассчитатьЗаписиРегистраРасчета(“ОсновныеНачисленияРегл”, НаборОсновныеНачисления, ОсновныеНачисления);
//удаление движений по регистру
НаборОсновныеНачисления.Очистить();
НаборОсновныеНачисления.Записать();
ЗафиксироватьТранзакцию();
КонецПроцедуры // РассчитатьОсновныеНачисления
Базовые результаты вычисляются запросами.
Задание выполнено не без проблем. В основном при выполнии ориентировался на видеоматериалы и немного на решения других участников.
Выполнено. Зря я полез в 14 главу ДО выполнения задания. Полной универсальности не получилось – но расчет работает правильно.
Задание выполнено.
К документу НачислениеЗарплаты, созданному в предыдущем задании добавил еще один – РазовоеНачисление (шапка – ПериодРегистрации, ВидРасчета; табл. часть – Сотрудник, Подразделение, Размер, Сторно).
Проведение документов очень похоже на показанное в уроках. На первом этапе записывается рабочий набор записей. При этом для всех “основных” начислений устанавливаются границы периода действия, а для вида расчета отпуск также устанавливаются начало и конец базового периода, при этом учитывается, что сотрудник мог не отработать весь 12 предыдущих месяцев, в этом случае базовый период корректируется. Также для отпуска принудительно устанавливается тип графика “шестидневка”.
После первой записи набора записей выполняется запрос, в котором получаются данные о плановой и фактической длительности расчетов, а также база расчета для оклада (сумма и кол-во дней). Затем в цикле перебираем записи набора, позиционируемся на нужную строку в выборке и заполняем значение поля Результат.
Вторая запись набора в базу происходит в режиме “только запись”.
Движения в док-те РазовоеНачисление выполняется аналогично, для вида расчета ПремияКвартальная устанавливается базовый период, соответствующий кварталу, предшествующий тому кварталу, в котором производится расчет.
Тестовые данные вводил за 2011 год. Предполагается, что Иванов работал с января 2011 года в одном и том же подразделении по графику “пятидневка”.
С января по март все очевидно, в апреле было начислено следующее: Оклад = 2857.14 р., Отпуск = 7012.99 р., Премия = 3000 р., итого 12870,13 р.
Задание выполнил.
Задание выполнил в обработке проведения документа Начисление заработной платы.
1. Приведу код обработки проведения:
<cod>
Процедура ОбработкаПроведения(Отказ, Режим)
// регистр ОсновныеНачисления
Движения.ОсновныеНачисления.Записывать = Истина;
Движения.ДополнительныеНачисления.Записывать = Истина;
ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Если ТекСтрокаНачисления.ВидРасчета = ПремияКвартальная Тогда
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3);
Движение.БазовыйПериодКонец = НачалоДня(ПериодРегистрации)-1;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Продолжить;
КонецЕсли;
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.ПериодРегистрации = ПериодРегистрации;
Если ТекСтрокаНачисления.ВидРасчета = Отпуск Тогда
Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -12);
Движение.БазовыйПериодКонец = НачалоДня(ПериодРегистрации)-1;
КонецЕсли;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
КонецЦикла;
Движения.Записать();
РасчитатьОсновныеНачисления(Отказ);
РасчитатьДополнительныеНачисления(Отказ);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОсновныеНачисления Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина;
ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная; Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск; Для Каждого ТекСтрокаНачисления Из Начисления Цикл Если ТекСтрокаНачисления.ВидРасчета = ПремияКвартальная Тогда Движение = Движения.ДополнительныеНачисления.Добавить(); Движение.Сторно = ТекСтрокаНачисления.Сторно; Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета; Движение.ПериодРегистрации = ПериодРегистрации; Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3); Движение.БазовыйПериодКонец = НачалоДня(ПериодРегистрации)-1; Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаНачисления.Подразделение; Движение.Размер = ТекСтрокаНачисления.Размер; Продолжить; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = ТекСтрокаНачисления.Сторно; Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета; Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; Если ТекСтрокаНачисления.ВидРасчета = Отпуск Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -12); Движение.БазовыйПериодКонец = НачалоДня(ПериодРегистрации)-1; КонецЕсли; Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаНачисления.Подразделение; Движение.Размер = ТекСтрокаНачисления.Размер; Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика; КонецЦикла; Движения.Записать();
РасчитатьОсновныеНачисления(Отказ); РасчитатьДополнительныеНачисления(Отказ);
КонецПроцедуры
</cod>
Перед расчетом результатов, я записываю в регистр плановые значения и, чтобы сработали механизмы вытеснения.
Далее я выполняю расчет по основным начислениям это соотв. процедура:
<cod>
Процедура РасчитатьОсновныеНачисления(Отказ)
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ОсновныеНачисленияДанныеГрафика.НомерСтроки,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК План,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,
| ОсновныеНачисленияДанныеГрафика.Размер,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ПланБаза,
| ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК ПланРазмерБаза
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Измерения.Добавить(“Подразделение”);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = Движения.ОсновныеНачисления;
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить(“НомерСтроки”);
ОкладПоДням = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;
Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
Для Каждого Запись Из НаборЗаписей Цикл
СтруктураПоиска.НомерСтроки = Запись.НомерСтроки;
Если Не Выборка.НайтиСледующий(СтруктураПоиска) Тогда
Продолжить;
КонецЕсли;
Если Запись.ВидРасчета = Прогул Тогда
Факт = 0;
План = Выборка.План;
ИначеЕсли Запись.ВидРасчета = ОкладПоДням Тогда
Факт = Выборка.Размер*Выборка.Факт;
План = Выборка.План;
ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
Факт = Выборка.ПланРазмерБаза;
План = Выборка.ПланБаза;
КонецЕсли;
Если План <> 0 Тогда
Запись.Результат = Факт/План*?(Запись.Сторно, -1, 1);
Иначе
Сообщить(“Нет Данных графика”);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Движения.ОсновныеНачисления.Записать(, Истина);
КонецПроцедуры
</cod>
и уже после нее выполняю расчет по дополнительным начислениям:
<cod>
Процедура РасчитатьДополнительныеНачисления(Отказ)
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки,
| ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза
|ИЗ
| РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
| ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
| ПО ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Измерения.Добавить(“Подразделение”);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = Движения.ДополнительныеНачисления;
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить(“НомерСтроки”);
ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
Для Каждого Запись Из НаборЗаписей Цикл
СтруктураПоиска.НомерСтроки = Запись.НомерСтроки;
Если Не Выборка.НайтиСледующий(СтруктураПоиска) Тогда
Продолжить;
КонецЕсли;
Если Запись.ВидРасчета = ПремияКвартальная Тогда
Запись.Результат = Выборка.РезультатБаза*Запись.Размер/100*?(Запись.Сторно, -1, 1);
КонецЕсли;
КонецЦикла;
Движения.ДополнительныеНачисления.Записать(, Истина);
КонецПроцедуры
</cod>
Я так же работаю впервые с регистром расчетов. Возможно здесь в задании есть подвох, что вначале среди видов расчета основных начислений надо было выполнить расчет оклада и прогула, а потом только Отпуска, но я не стал это реализовывать.
Задание выполнил.
Однако, исключительно при помощи шпаргалки, в виде уроков и отладчика :). Никогда раньше не работал с начислениями ЗП. Фактически, понимание механизма работы с регистрами расчета пришло только после выполнения этого домашнего задания.
Задание выполнено.
Трудности были с расчетом базы. Много часов было потрачено на то, чтобы выяснить почему таблица с базой не содержит записей. Как выяснилось, данные я искал в таблице дополнительных начислений, а надо было в таблице основных :) Запутался с названиями и не обратил внимания на свою ошибку.
А в целом, задание не сложное.
Да, бывают досадные ошибки.
Еще одна распространенная – неверный тип данных у измерения одного из регистров накопления (обычно появляется в результате копирования)
При выполнении особых сложностей не было.
Задание 14 выполнил, возникла проблема с расчетом среднего заработка.. Базу за 12 месяцев получил и все… Буду ждать варианта решений, необходимо работать с оставшимися главами.
Задание выполнил.
Вытеснение прогула отпуском – работает.
Вытеснение оклада прогулом и отпуском – работает.
В документе НачислениеЗП добавил еще одну ТЧ с доп. начислениями. Решил что пока для тестов этого будет достаточно. При проведении для ВР Отпуск и ВР Премия прописываю базовые периоды (12 пред. мес. и пред. квартал соотв-но).
В обработчиках расчета начислений создал запросы к регистру расчетов.
Для основных начислений использую в запросе таблицы: ДанныеГрафика, БазаОсновныеНачисления, БазаДополнительныеНачисления с левым соединением по полю НомерСтроки.
Для дополнительных: ДополнительныеНачисления, БазаОсновныеНачисления, БазаДополнительныеНачисления с аналогичным соединением.
В таблицах для сложения баз использую isnull.
Также мне показалось удобным выносить в переменные значения выборки и ТЗ запроса (пример с Окладом):
<code>
Сторно = ?(Запись.Сторно,-1,1);
ПлановыеЧасы = Выборка.План;
ФактическиеЧасы = Выборка.Факт;
ОкладЗаМесяц = Запись.Размер;
Запись.Результат = ФактическиеЧасы*ОкладЗаМесяц/ПлановыеЧасы*Сторно;
</code>
Пример с отпуском:
<code>
Сторно = ?(Запись.Сторно,-1,1);
ПлановыеДни = Выборка.БП/8;
СуммаНачисленийЗаПред12Мес = Выборка.База;
Запись.Результат = СуммаНачисленийЗаПред12Мес/ПлановыеДни*Сторно;
</code>
Пример для премии:
<code>
Сторно = ?(Запись.Сторно,-1,1);
Процент = Запись.Размер/100;
СуммаНачисленийЗаПредКвартал= Выборка.База;
Запись.Результат = СуммаНачисленийЗаПредКвартал*Процент * Сторно;
</code>
Таким образом чтение формул становится “прозрачным”.
Расчет проверил на бумажке – сошлось :)
P.S.
Материал для меня абсолютно новый, т.к. с расчетом не приходилось работать в 8.2. Но вроде со всем разобрался.
Задание выполнил.
Код приводить не вижу смысла.
Трудностей особых не было, т.к. в уроках все достаточно хорошо всё описано, вот только для расчета отпуска, добавил в конфигурацию отдельный документ «Начисление отпуска», как мне кажется более верно, хотя могу ошибаться.
Евгений, а какая дата сдачи ДЗ?
У Вас указано изучить главы 9-12 а в графике 9-10…
21-22 марта
Глава 9. Свойства записи регистра расчета.
Глава 10. Программная работа с регистром расчета.
23 марта
Домашнее задание №14.
21-24 марта
Глава 9. Свойства записи регистра расчета.
Глава 10. Программная работа с регистром расчета.
Глава 11. Получение данных из регистров расчета.
Глава 12. Расчет ресурсов регистра расчета.
25 марта
Домашнее задание №14.
Сколько всего будет ДЗ до финального?
В графике закралась ошибка, поправил ее.
Всего будет 15 ДЗ, до 27 марта.