Базовый курс. Домашнее задание №14
Второе задание заключительного блока.
Для выполнения рекомендуется изучить следующие главы 4-го блока.
Глава 8. Регистры расчета.
Глава 9. Свойства записи регистра расчета.
Глава 10. Программная работа с регистром расчета.
Глава 11. Получение данных из регистров расчета.
Глава 12. Расчет ресурсов регистра расчета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Добрый день,
не могу получить размер базовых начислений запросом. Запрос отрабатывает, но выборка пустая. При этом у меня проведены документы Начисление ЗП.
Вот код:
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| База.Сотрудник,
| База.НачислениеБаза,
| База.ВидРасчета
|ИЗ
| РегистрРасчета.РегистрОсновныхНачислений.БазаРегистрОсновныхНачислений(&Измерения, &Измерения, &Разрезы, ) КАК База”;
Измерения = Новый Массив;
Измерения.Добавить(“Подразделение”);
Измерения.Добавить(“Сотрудник”);
Разрезы = Новый Массив;
Разрезы.Добавить(“ВидРасчета”);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Запрос.УстановитьПараметр(“Разрезы”, Разрезы);
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| База.Сотрудник,
| База.НачислениеБаза,
| База.ВидРасчета
|ИЗ
| РегистрРасчета.РегистрОсновныхНачислений.БазаРегистрОсновныхНачислений(&Измерения, &Измерения, &Разрезы, ) КАК База”;
Измерения = Новый Массив;
Измерения.Добавить(“Подразделение”);
Измерения.Добавить(“Сотрудник”);
Разрезы = Новый Массив;
Разрезы.Добавить(“ВидРасчета”);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Запрос.УстановитьПараметр(“Разрезы”, Разрезы);
==============
В чем может быть проблема?
На регистре всего 2 измерения: сотрудник и подразделение.
Насколько я понял, выполняя запросы к таблице
РегистрРасчета.РегистрОсновныхНачислений.БазаРегистрОсновныхНачислений
таблица пустая. почему она пустая не понимаю (я посмотрел запросом физическую таблицу РегистрРасчета.РегистрОсновныхНачислений – в ней все поля заполнены).
в чем дело не понимаю.
Кроме перечисленных проблем встречаются проблемы с типами данных.
Проверьте все измерения регистраторов расчета, убедитесь, что они имеют ссылочный тип данных.
Причины отсутствия данных по базе могут быть:
– Непопадание данных в базовый период;
– Несоответствие измерений текущего и базового периода.
– Неверная настройка вида расчета, обратите внимание на флаг “Период действия является базовым”. Скорее всего он должен быть снят.
Домашнее задание выполнил.
Дело оказалось в том, что я не указал, что у Расчета “Оклад” база может быть “Оклад”. Как только поставил галочку, так сразу запрос к виртуальной таблице “БазаРегистрОсновныхНачислений” стал возвращать данные (даже не пришлось перепроводить документы).
Ок! :)
Задание сделала, само задание оказалось не сложным, почти все рассмотрено в уроках и основы взяты оттуда, но есть вопросик.
Основные моменты выполнения:
В плановом наборе записей для отпуска и премии заполняю базовый период. Для премии запись в регистр ДополнительныеНачисления, для остальных в ОсновныеНачисления.
Для расчета результата видов расчетов Оклада и Отпуска формирую запрос к виртуальным таблицам регистра ОсновныеНачисления
Запрос.Текст = “ВЫБРАТЬ
| ОсновныеНачисленияДанныеГрафика.НомерСтроки,
| ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК План,
| ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
| ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База,
| ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ДнейПоБазе
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
Результаты вычисляю как
Если Запись.ВидРасчета = ОкладПоДням Тогда
Запись.Результат = Выборка.Факт*Запись.Размер/Выборка.План;
ИначеЕсли Запись.ВидРасчета = Прогул Тогда
Запись.Результат = 0;
ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
Запись.Результат = Выборка.База*Выборка.Факт/Выборка.ДнейПоБазе;
Для расчета премии запрос к таблицам регистра Дополнительные начисления
Запрос1.Текст = “ВЫБРАТЬ
| ДополнительныеНачисления.НомерСтроки,
| ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
|ИЗ
| РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
|ГДЕ
| ДополнительныеНачисления.Регистратор = &Ссылка”;
Результат вычисляю по формуле Запись.Результат = Выборка1.База*Запись.Размер/100;
А теперь собственно вопрос. В задании сказано что для отпуска надо брать рабочие дни базы по шестидневке, если у нас работник по ней работает, то все ок. Но допустим что работник работает по пятидневке, в виде расчет отпуск мы должны указать график пятидневка, иначе у нас неправильно посчитаются дни самого отпуска, а вот рабочие дни по базе я понимаю должны взяться по шестидневке? Наверно это надо делать отдельно каким то запросом, я легкого пути не придумала :) Буду смотреть типовое решение, может там вопрос проясниться.
Просмотрела ваше решение и поняла что имелось в виду все рабочие дни для отпуска определять по шестидневке. Просто сама долгое время работала с расчетом з/пл на крупном производственном предприятии(но это был другой язык программирования, еще до 1С) и с таким не сталкивалась :)
У нас учебная задача, поэтому она не всегда соответствует реальной практике :)
Задание выполнено. Затруднений не возникло.
Задание выполнено.
Помогли видеоматериалы.
Задание выполнено.
Согласен с Евгением, что самое маленькое, не значит самое легкое (я про задание).
В итоге сам не справился, подсмотрел решение. Но плагиат удался на славу, по крайней мере работает.
Здравствуйте:-) ДЗ № 14 выполнила.
Делала как в уроках.
В документе НачислениеЗарплаты две табличные части – основные и дополнительные начисления соответственно.
Вид расчета Отпуск начала тихо недолюбливать…
Задание выполнил. Оказалось, всё не так и сложно. С расчётом ранее не работал, по-началу всё виделось непонятным, сложным, чем-то свойственным только 1с, а на самом деле не намного сложнее опер. и бух. учётов. Однако, приходилось пересматривать уроки и уже вход пошли ЖКК )))
Обработка проведения “Начисления ЗП” работает по такой схеме:
1. Очищаются движения документа по РР
2. Вводятся булевские переменные:
ЕстьНеОтпуск = Ложь;
ЕстьОтпуск = Ложь;
ЕстьПремия = Ложь;
<code>ЕстьНеОтпуск = Ложь;
ЕстьОтпуск = Ложь;
ЕстьПремия = Ложь;</code>
Обходится ТЧ “Начисления”, в зависимости от вида расчета добавляются движения в РР “Осн. нач.” и “Доп. нач.”
Я считал, что отпуск может зависеть от оклада в текущем периоде, поэтому сначала расчитывается оклад и пр. осн. начисления, потом отпуск, потом премии. Всё это делается отдельными процедурами.
При обходе табличной части выставляются вышеприведенные флаги. Если отпусков в ТЧ не было, то и запускать процедуру не нужно. Аналогично для премий.
Код схематично выглядит так:
<code>
Очищаются движения
…
Обход ТЧ
Установка флагов, формирование движений
Запись движений
…
Если ЕстьНеОтпуск Тогда
РассчитатьОсновныеНачисления(Отказ, Движения.ОсновныеНачисления); // Основные начисления без отпуска
Движения.ОсновныеНачисления.Записать(, Истина);
КонецЕсли;
Если ЕстьОтпуск Тогда
РассчитатьОсновныеНачисления(Отказ, Движения.ОсновныеНачисления, ПланыВидовРасчета.ОсновныеНачисления.Отпуск);
Движения.ОсновныеНачисления.Записать(, Истина);
КонецЕсли;
Если ЕстьПремия Тогда
РассчитатьДополнительныеНачисления(Отказ, Движения.ДополнительныеНачисления);
Движения.ДополнительныеНачисления.Записать(, Истина);
КонецЕсли;
</code>
Созданы процедуры:
РассчитатьОсновныеНачисления(Отказ, НаборЗаписей, ПВР = Неопределено)
РассчитатьДополнительныеНачисления(Отказ, НаборЗаписей)
Реализовывались аналогично урокам. Небольшое отличие – при реализации отпуска соединялись таблицы:
ОсновныеНачисления,
ОсновныеНачисленияБазаДополнительныеНачисления
ОсновныеНачисленияБазаОсновныеНачисления
и добавилась ещё: ОсновныеНачисленияДанныеГрафика
Задание выполнил.
Первое формирование движений реализовал с помощью конструктора, дописал заполнение базовых периодов начала и окончания для Отпуска и Премии.
Дальнейший расчет результатов реализовал как было описано в видеоуроках, склеивая левым соединением таблицу с данными графика и таблицы базы в случае основных начислений, и физическую таблицу и таблицы базы в случае дополнительных начислений.
Забыл про свойство ЗначениеБазовыйПериод для вычисления планового значения графика за предыдущие 12 месяцев ((. Сначала высчитал из регистра, потом посмотрел комментарии других участников курса и сделал как надо.
Задание выполнила.
В модуле документа “Начисление зарплаты” конструктором движений создала движения по регистрам основные и дополнительные начисления с Результатом = 0. Записала их.
Затем с помощью запроса вычисляю Результат.
В случае основных начислений в запросе связываю виртуальные таблицы ОсновныеНачисленияДанныеГрафика с обеими таблицами баз для основных начислений, т.к. база для начисления отпускных – это начисления всех типов.
В случае дополнительных начислений связываю две виртуальные таблицы баз для дополнительного начисления.
Затем, перебирая все записи соответствующих наборов записей по номеру стоки нахожу нужные данные в выборке и вычисляю результат таким образом:
Если ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда
Строка.Результат = ?(Выборка.ПланДней=0,0,Строка.Размер*Выборка.ФактДней/Выборка.ПланДней);
ИначеЕсли ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
Строка.Результат = ?(Выборка.БазаДней=0,0,Выборка.База*Выборка.ФактДней/Выборка.БазаДней);
ИначеЕсли ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
Строка.Результат = 0;
КонецЕсли;
Если ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная Тогда
Строка.Результат = Выборка.База*Строка.Размер/100;
КонецЕсли;
Затем записываю набор движений без пересчета фактического периода действия.
Задание выполнил.
В общем-то полученных знаний вполне себе достаточно для решения подобных задач. Было интересно параллельно ковырять типовой ЗУП, много познавательного :) Раньше занимался в основном прикладными вопросами, а теперь прям руки чешутся че-нить такого-эдакого накодить :))
Это уже определенный результат :)
Задание выполнил. Расчет выполнил как в уроках. Создал в документе две табличные части Основные начисления и Дополнительные начисления. Базовый период для Отпуска и Премии брал из реквизитов документа.
Задание выполнил.
Модуль объекта документа «Начисление заработной платы» :
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
Премия = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
ПремияБазовыйПериодКонец = НачалоКвартала(ПериодРегистрации) – 1;
ПремияБазовыйПериодНачало = НачалоКвартала(ПремияБазовыйПериодКонец);
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Если (ВидРасчета = Премия) Тогда
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.БазовыйПериодНачало = ПремияБазовыйПериодНачало;
Движение.БазовыйПериодКонец = ПремияБазовыйПериодКонец;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Иначе
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончания;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
Если (ВидРасчета = Отпуск) Тогда
КонецПредыдущегоМесяца = НачалоМесяца(ТекСтрокаНачисления.ДатаНачала) – 1;
Движение.БазовыйПериодНачало = КонецМесяца(ДобавитьМесяц(КонецПредыдущегоМесяца, -12)) + 1;
Движение.БазовыйПериодКонец = КонецПредыдущегоМесяца;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Движения.ОсновныеНачисления.Записать();
Движения.ДополнительныеНачисления.Записать();
РассчитатьНачисления(Отказ);
КонецПроцедуры
Процедура РассчитатьНачисления(Отказ)
Оклад = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
Премия = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ОсновныеНачисленияДанныеГрафика.НомерСтроки,
| ОсновныеНачисленияДанныеГрафика.ВидРасчета,
| ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК План,
| ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
| ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК БазовыйПериод,
| ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База,
| “”Основные начисления”” КАК ВидРегистра
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
| ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ДополнительныеНачисления.НомерСтроки,
| ДополнительныеНачисления.ВидРасчета,
| NULL,
| NULL,
| NULL,
| ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0),
| “”Дополнительные начисления””
|ИЗ
| РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Поиск = Новый Структура(“НомерСтроки, ВидРегистра”);
Поиск.ВидРегистра = “Основные начисления”;
Для каждого Запись Из Движения.ОсновныеНачисления Цикл
ВыборкаДетальныеЗаписи.Сбросить();
Поиск.НомерСтроки = Запись.НомерСтроки;
Если ВыборкаДетальныеЗаписи.НайтиСледующий(Поиск) Тогда
Если (Запись.ВидРасчета = Оклад) И (ВыборкаДетальныеЗаписи.План <> 0) Тогда
Запись.Результат = ВыборкаДетальныеЗаписи.Факт * Запись.Размер / ВыборкаДетальныеЗаписи.План * ?(Запись.Сторно, -1, 1);
ИначеЕсли (Запись.ВидРасчета = Отпуск) Тогда
Запись.Результат = ВыборкаДетальныеЗаписи.Факт * ВыборкаДетальныеЗаписи.База / ВыборкаДетальныеЗаписи.БазовыйПериод * ?(Запись.Сторно, -1, 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Движения.ОсновныеНачисления.Записать(, Истина);
Поиск.ВидРегистра = “Дополнительные начисления”;
Для каждого Запись Из Движения.ДополнительныеНачисления Цикл
ВыборкаДетальныеЗаписи.Сбросить();
Поиск.НомерСтроки = Запись.НомерСтроки;
Если ВыборкаДетальныеЗаписи.НайтиСледующий(Поиск) Тогда
Если (Запись.ВидРасчета = Премия) Тогда
Запись.Результат = ВыборкаДетальныеЗаписи.База * Запись.Размер / 100 * ?(Запись.Сторно, -1, 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Движения.ДополнительныеНачисления.Записать(, Истина);
КонецПроцедуры
</code>
Задание выполнил, а больше повторил все как в примере.
Из личного : В док. НичислениеЗП разделил ОсновныеНачисления и ДополнительныеНачисления по разным ТЧ. Произвел запись наборов в регистры расчета и записал регистры. Для Отпуска указал тип графика Шестидневка.
Затем вызываются две процедуры РасчетОсновныхНачислений и РасчетДополнительныхНачислений.
В процедуре РасчетОсновныхНачислений Запрос к таблице Основные начисления, а в процедуре РасчетДополнительныхНачислений запрос к табл. ДополнительныеНачисления. С запросами самостоятельно разобраться не смог, сел в галошу и сделал все как в решений преподавателя.
Задание выполнил. Пару моментов пришлось подсмотреть в решении.
Домашнее задание №14 выполнено.
У регистров расчета ОсновныеНачисления и ДополнительныеНачисления установлено свойство “Базовый период”.
При записи движений в методе “ОбработкаПроведения” устанавливаем дату начала и окончания базового периода для видов расчета “Отпуск” и “ПремияКвартальная”:
Если Движение.ВидРасчета = Отпуск Тогда
Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-12));
Движение.БазовыйПериодКонец = НачалоДня(КонецМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-1)));
ИначеЕсли Движение.ВидРасчета = ПремияКвартальная Тогда
Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(ПериодРегистрации,-3));
Движение.БазовыйПериодКонец = НачалоДня(КонецМесяца(ДобавитьМесяц(ПериодРегистрации,-1)));
КонецЕсли;
Далее в процедуре “РассчитатьОсновныеНачисления” запросом выбираем данные о плановом и фактическом рабочем времени и получаем размер базы и количество дней базы. После этого рассчитываем результат для видов расчета “Оклад” и “Отпуск”.
В процедуре “РассчитатьДопполнительныеНачисления” при помощи запроса получаем данные базы и размера для вида расчета “ПремияКвартальная” и рассчитываем результат по данному виду расчета.
Результат расчета тестового набора данных (апрель 2010): оклад = 3125 руб., отпуск = 1724,74 руб., премия квартальная = 3000 руб.
Задание выполнил но не до конца. Застрял с начислением отпуска по шестидневному графику. Если использую один вид графика для всех начислений то все работает на ура. Данные по базовому периоду получаю через виртуальную таблицу ДанныеГрафика – ЗначениеБазовыйПериод. Потом заполнил данные в регистре сведений на шестидневку. И вот с этого момента виртуальная таблица начинает мне возвращать за базовый период сумму по графику пятидневка и шестидневка. Я думал что при установке графика в регистре сведений у меня начинается автоматическое соединение с регистром Графики по типу графика и если у меня запись использует тип шестидневка то и база должна возвращаться по шестидневке. Не подскажете где у меня может быть ошибка? Можно конечно просто прочитать из регистра сведений данные и тупо сложить, но это как то не правильно я считаю. Даже создал простой за прос <code>
ВЫБРАТЬ
ОсновныеНачисленияДанныеГрафика.НомерСтроки,
ОсновныеНачисленияДанныеГрафика.БазовыйПериодНачало,
ОсновныеНачисленияДанныеГрафика.БазовыйПериодКонец,
ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод
ИЗ
РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика</code> отрабатывает неверно. Взял БазовыйПериодНачало=01.01.11 и БазовыйПериодКонец=09.01.11 он возвращает ЗначениеБазовыйПериод=12. Хотя должен вернуть по шестидневке 7 дней. Если удаляю запси в регистре сведений по шестидневке, то по пятидневке возвращает как и требуется 5 дней. Заранее спасибо за ответ
>Не подскажете где у меня может быть ошибка?
По вашему описанию причины могут быть следующие:
– в записи регистра не заполняется тип графика (в соответствующем реквизите)
– в настройках регистра расчета для реквизита ТипГрафика не указана связь с графиком.
Проверьте.
Если я пытаюсь сохранить конфигурацию без указанной в РегистреРасчета связи с графиком (регистр сведений ГрафикРаботы) и установленном флаге действия у меня даже база не сохраняется. Регистр сведений у меня имеет вид: Измерения ГрафикРаботы (СправочникСсылка.ГрафикРаботы), Дата(тип Датаа), ресур Значение. Все эти поля присутствуют в связи регистра расчета. Стоят флажки Период действия и Базовый период в регистре. Данные в регистре точно есть. Сделал специально просто запись данного регисра по ВидуРасчету – ОкладПоДням – график стоит. График у меня является реквизитом регистра расчета. Выполняю запрос <code>
ВЫБРАТЬ
ОсновныеНачисленияДанныеГрафика.НомерСтроки,
ОсновныеНачисленияДанныеГрафика.ТипГрафика,
ОсновныеНачисленияДанныеГрафика.ВидРасчета,
ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод
ИЗ
РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика</code> он у меня возвращает и вид расчета (Отпуск) и график (шестидневка), но задвоенные по графикам значение базового периода. Такое ощущение не происходит соединение с регистром сведений по измерению График работы. Но ведь это виртуальная таблица, я же там вроде ничего делать не должен. Может я запрос как то неправильно составляю?
>Если я пытаюсь сохранить конфигурацию без указанной в РегистреРасчета связи с графиком
Я имел ввиду проверить настройки реквизита ТипГрафика регистра расчета. В нем указана связь с измерением ГрафикРаботы регистра сведений?
Если да, то присылайте базу в мастер-группу, посмотрим.
СПАСИБО!!! Вот все перепробовал, а в свойства реквизита регистра расчета не заходил. Просто настроил вначале а потом пробовал что-то и удалил, заново выбрал а реквизит не установил. И ведь даже не посмотрел. Спасибо еще раз. Все задание выполнил.Только связь указал запрос сразу начал правильные цифры выдавать.
Ок :)
Сделала ДЗ! Пришлось помучаться с отпуском – из-за шестидневки, оказалось, просто не заполнила РегистрСведений за 2009 :)
Итак:
1. В документе НачислениеЗП в процедуре ОбработкаПроведения сначала делаю запись в РР ОсновныеНачисления, ДополнительныеНачисления, при этом для вида расчета Отпуск заполняю поля БазовыйПериодНачала и БазовыйПериодОкончания. Даты расчитываю
ДатаКон = НачалоДня(КонецМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-1)));
ДатаНач = НачалоМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-12));
Движение.БазовыйПериодНачало = ДатаНач;
Движение.БазовыйПериодКонец = ДатаКон;
И у вида расчетов Премия , также заполняю эти же поля, только уже кварталом:
ДатаКон = НачалоДня(КонецМесяца(ДобавитьМесяц(ПериодРегистрации,-1)));
ДатаНач = НачалоМесяца(ДобавитьМесяц(ПериодРегистрации,-3));
Движение.БазовыйПериодНачало = ДатаНач;
Движение.БазовыйПериодКонец = ДатаКон;
После чего записываю движения Движения.Записать();
и вызываю процедуры по расчету
РассчитатьНачисления(Отказ);
РассчитатьДопНачисления(Отказ);
2. Запросом нахожу необходимые величины : фактически отработаные дни, план, и базу для отпуска и оклада, запрос привожу ниже:
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ОсновныеНачисленияДанныеГрафика.НомерСтроки,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК План,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,
| ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК База,
| ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК БазаДней
|ИЗ
| РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
| ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
| ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияДанныеГрафика.НомерСтроки
|ГДЕ
| ОсновныеНачисления.Регистратор = &Ссылка”;
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Измерения.Добавить(“Подразделение”);
Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Далее как в уроках было показано, перебираю набор записей регистра расчетов ОсновныеНачисления и вычисляю необходимые виды расчета :
– оклад = 3181,82
Если Выборка.План = 0 Тогда
Запись.Результат = 0;
Иначе
Запись.Результат = Выборка.факт* Запись.Размер/Выборка.План *?(Запись.Сторно,-1,1);
– отпуск = 1725.24
Если Выборка.БазаДней = 0 Тогда
Запись.Результат = 0;
Иначе
Запись.Результат = Выборка.База/Выборка.БазаДней*Выборка.Факт;
КонецЕсли;
3. Далее в отдельной процедуре запросом только уже по таблицам регистра расчетов “ДополнительныеНачисления” нахожу премию, сделано аналогично, как показано в уроках, текст запроса привожу ниже:
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ДополнительныеНачисления.НомерСтроки,
| ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК База,
| ДополнительныеНачисления.Размер
|ИЗ
| РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
| &Измерения,
| &Измерения,
| ,
| Регистратор = &Ссылка
| И ВидРасчета = &премия) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
| &Измерения,
| &Измерения,
| ,
| Регистратор = &Ссылка
| И ВидРасчета = &премия) КАК ДополнительныеНачисленияБазаОсновныеНачисления
| ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
|ГДЕ
| ДополнительныеНачисления.Регистратор = &Ссылка”;
Измерения = Новый Массив;
Измерения.Добавить(“Сотрудник”);
Измерения.Добавить(“Подразделение”);
Премия = ПланыВидовРасчета.ДополнительныеНачисления.Премия;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“премия”, премия);
Запрос.УстановитьПараметр(“Измерения”, Измерения);
Задание выполнил
Не совсем понял как получить количество рабочих за 12 предыдущих месяцев из данных регистра расчета с существующими записями, поэтому количество рабочих дне взял непосредственно из регистра сведений.
Задание тяжкое, т.к. “расчет штука сложная :) “, но при помощи уроков, вроде справился.
>Не совсем понял как получить количество рабочих за 12 предыдущих месяцев
Можно обратиться к виртуальной таблице данных графика и взять поле ЗначениеБазовыйПериод.
Евгений, в тексте задание очепятка, или правда можно прогулять отпуск :):
Апрель a. Иванов, оклад 10 000 руб.
b. С 5-го по 15-е апреля прогул
c. С 5-го по 25-е апреля отпуск
d. Премия квартальная, 10%
>или правда можно прогулять отпуск :)
Нужно долго тренироваться, чтобы прогулять свой отпуск :)
Здесь нужно решить какой вид расчета является вытесняющим.
Полагаю, что отпуск должен вытеснять прогул.
Ааа, вот оно как.
Задание выполнил, вроде ничего сложного и оригинального (ну может кроме поиска для совмещения строк табличной части с выборкой из запроса), но затянулось всё в эпопею….
Небольшое дополнение: ну при выполнении с учётом курсов пришлось перенести премию квартальную в дополнительные но это так – мелочи. И ещё : из ДЗ не понятно для расчёта отпуска необхожимо делить на плановое число дней за период по графику или на фактическое? Сделал для планового, но и переделать для фактического не должно составить особых затруднений.
И ещё, имхо, перед началом ДЗ главы 11 и 12 тоже нужно просмотреть/изучить.
> не понятно для расчёта отпуска необхожимо делить на плановое число дней за период по графику или на фактическое
Делить нужно на плановое число дней.
Фактическое число получить просто так не получится, необходимо будет модифицировать структуру регистра.
> ещё, имхо, перед началом ДЗ главы 11 и 12 тоже нужно просмотреть/изучить.
Ок.
Связи не было. Поставил – не помогло… Выслать на 1sedu@nasf.ru ?
>Связи не было. Поставил – не помогло
Странно, должно было помочь.
Присылайте на mg.spec8ru @ gmail.com
Завёл в основной базе те-же объекты ручками (чуть попроще сделал – пока без доп. начислений и график в регистре сведений забил ручками)… графики стали считаться. Или я где-то ошибся или…! Ну короче пора догонять остальных с ДЗ… Искать ошибку в той базе совсем не обязательно – я её как-то обошёл.
Видимо данные где-то не совпадали, в регистрах сведений или расчета..
Какае-то ересь с 1С творится: не рассчитавается ни план, нифакт по графику! В регистр записано всё, (период действия есть, график есть), в регистре сведений “Графики работы” всё заполнено (0 и 1 ). В регистре расчёта ссылки на регистр сведений, на его реквизит значение и реквизит дата есть.
Что план, что факт возвращает пустое значение что при запросе, что при обращении к РегистрыРасчета.ОсновныеНачисления.ПолучитьДанныеГрафика()
т.е. результат возвращается но что план, что факт – пусто. Где ещё можно поискать?
Можно еще посмотреть на тип графика.
Полагаю, в регистре расчета есть такой реквизит. Связан ли он с регистром сведений?
Заполняется ли в движениях тип графика?
Также можно еще проверить типы данных. В полях регистра сведений и регистра расчета.
>Можно еще посмотреть на тип графика.
Регистр сведений? Непериодический, измерения: типграфика(ссылка на справочник) и дата (дата), ресурс – значение (число 1.0)
>Полагаю, в регистре расчета есть такой реквизит. Связан ли он с регистром сведений?
В регистре расчёта занчения реквизит: график – графики работ, значение графика – значение, дата графика – дата, период действия – +(в смысле галочка есть).
>Заполняется ли в движениях тип графика?
Регистр сведений? Да заполнен обработкой по обоим графикам.
> Также можно еще проверить типы данных. В полях регистра сведений и регистра расчета.
У регистра расчёта: измерения сотрудник (ссылка на справочник), подразделение (тоже ссылка на соотв. справочник); ресурс – число 15.2; реквизиты: тип графика (ссылка на справочник типов графиков) , размер (число 15.2).
второй день понять не могу где ошибся, дело в том, что всё остальное успешно работает!
следующий код: Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
| ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК Период,
| ОсновныеНачисленияДанныеГрафика.Размер КАК Размер,
| ОсновныеНачисленияДанныеГрафика.ТипГрафика КАК ТипГр,
| ОсновныеНачисленияДанныеГрафика.Результат КАК Результат
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ДанныеГрафика КАК ОсновныеНачисленияДанныеГрафика
|ГДЕ
| ОсновныеНачисленияДанныеГрафика.Регистратор = &Регистратор
| И ОсновныеНачисленияДанныеГрафика.ТипГрафика = &ТипГрафика”;
Запрос.УстановитьПараметр(“Регистратор”, Объект);
Запрос.УстановитьПараметр(“ТипГрафика”, Справочники.ТипыГрафиков.НайтиПоНаименованию(“Пятидневка”));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(“1 Факт=”+ВыборкаДетальныеЗаписи.Факт);
Сообщить(“1 Период=”+ВыборкаДетальныеЗаписи.Период);
Сообщить(“1 размер=”+ВыборкаДетальныеЗаписи.размер);
Сообщить(“1 ТипГр=”+ВыборкаДетальныеЗаписи.Типгр);
Сообщить(“1 результат=”+ВыборкаДетальныеЗаписи.результат);
КонецЦикла;
на экран выдаёт следующее:
[URL=http://www.radikal.ru][IMG]http://s002.radikal.ru/i200/1101/99/5986dd1441dc.jpg[/IMG][/URL]
>В регистре расчёта занчения реквизит: график – графики работ
Связан ли реквизит регистра расчета с регистром сведений.
В свойствах реквизита регистра найдите «Связь с графиком». Заполнена?
Если да, то присылайте базу на ящик мастер-группы.
Задание выполнено.
В документе НачислениеЗП две ТЧ – ОсновныеНачисления и ДополнительныеНачисления.
Доработал обработчик проведения документа НачислениеЗП, сгенерированный конструктором движений.
В цикле по ТЧ основных начислений выполняю проверку:
Если ТекСтрокаОсновныеНачисления.ВидРасчета = Отпуск Тогда
Движение.ТипГрафика = Справочники.ТипыГрафиков.Шестидневка и
устанавливаю базовый период за предыдущий год от даты НачалоМесяца(ПериодРегистрации).
Для премии устанавливаю базовый период за предыдущий квартал, для других видов расчетов базовый период не заполняется.
После записи коллекции движений выполняется процедура РассчитатьОсновныеНачисления(), где запросом по условию Регистратор
по ФТ ОснНач и ВТ ОснНачДанныеГрафика, ОснНачБазаОснНач,ОснНачБазаДопНач выбираются поля НомерСтроки, сумма РезультатБаза как База по обеим базам, БазовыйПериод, ФПД как Факт, ПериодДействия как План из ДанныхГрафика. Фт связывается левым соединением со всеми ВТ по номеру строки.
Оклад – Результат = Выборка.Факт*Запись.Размер/Выборка.План. В апреле – 3181.82.
Отпуск – Результат = Выборка.База*Выборка.Факт/Выборка.БазовыйПериод. В апреле – 1725.24.
После расчета выполняется Движения.ОсновныеНачисления.Записать(,Истина).
Далее аналогичные действия, но без учета данных графика, выполняются для таблиц дополнительных начислений.
КвартПремия – Результат = Выборка.База*Запись.Размер/100. В апреле – 3000.
Задание выполнено.
В документ внес изменения – разделил основные и дополнительные начисления по разным табличным частям. Раньше была одна с составным полем ВидРасчета, но обрабатывать её было неудобно.
В обработке проведения записал наборы в регистры расчетов и записал их. Для видов расчетов Отпуск и ПремияКвартальная указал базовый период.
После этого вызываются две процедуры, РассчитатьОсновныеНачисления() и РассчитатьДополнительныеНачисления. Соответственно запросов у меня два.
Запрос к таблице ОсновныеНачисления, к ней по полю “Номер строки” левым соединением добавляются записи из ВТ ДанныеГрафика (план по рабочим дням, факт по рабочим дням, дни по базовому периоду), БазаОсновныеНачисления (суммы по окладам и отпускам попавшим в базовый период) и БазаДополнительныеНачисления (суммы по премиям начисленным в базовом периоде). Для всех виртуальных таблиц указаны фильтры по регистратору. Для ВТ БазаОсновныеНачисления и БазаДополнительныеНачисления дополнительно указаны фильтры по виду расчетов и заданы измерения.
Результат запроса помещается в выборку. Далее цикл “для каждого” по записям из набора РР, в выборке через метод Выборка.НайтиСледующий(НомерСтроки) ищется строка, используя данные которой результат рассчитывается для каждого вида расчетов по своей формуле.
Расчет дополнительных начислений выполняется аналогично, конечно в запросе нет обращения к ВТ ДанныеГрафика.
У меня возник вопрос: во всех расчетах я использовал график шестидневки и отпуск рассчитался корректно. Но если использовать во всех расчетах за три месяца пятидневку, то для отпуска дни по базе равны 0 (я явно указал в параметре тип графика “шестидневка”). Почему? Что неправильно делаю?
Формула расчета отпуска интересная, либо я её не понял. У меня данные (суммы окладов) только за три месяца, а рабочие дни берутся за год. В итоге отпуск получается мизерный :)
>Но если использовать во всех расчетах за три месяца пятидневку, то для отпуска дни по базе равны 0
Такое возможно, по ряду причин:
1. Не заполнен в регистре указанный тип графика
2. Неверно заполняется (не заполняется вообще) тип графика в записи регистра расчета.
Если все ок, присылайте базу на ящик МГ, посмотрим.
>Формула расчета отпуска интересная, либо я её не понял.
Формулу правильно поняли. Это мечта любого директора :)
>>Неверно заполняется (не заполняется вообще) тип графика в записи регистра расчета.
Евгений, Вы правы, я неправильно указывал в документе тип графика для отпуска. Ставил пятидневку на автомате, как и для других видов расчетов. Сейчас в начислении зарплаты для отпуска указал шестидневку и все рассчиталось.
Тяжело заниматься на праздниках :)
Главное докапаться до истины :)
Все работу выполнил в процедуре «Обработка проведения» документа «Начисление заработной платы», для записи рабочих наборов сначала воспользовался конструктором движений, затем откорректировал вручную все записи добавлял в одном цикле по табличной части, если вид расчета «Премия», то запись добавлялась в РР «Дополнительные начисления» и не затрагивались реквизиты записи связанные с периодом действия. Для видов расчета «Премия» и «Отпуск» базовый период записывался, для премии как начало, окончания предыдущего квартала, для отпуска конец предыдущего месяца – 12 месяцев, конец предыдущего месяца.
Записи для расчета получал одним запросом, Запрос включал объединения двух запросов первый из которых обращался к ФТ РР «Основные начисления», второй – к ФТ РР «Дополнительные начисления». К ФТ левым соединением по номеру строки присоединялись ВТ с данными графика и базы, поскольку во втором запросе нет данных графика (РР не зависит от периода действия), то там вместо полей с данными по графику проставлялись нули. В выходных полях запроса помимо обычных данных по номеру строки, плана и факту графика и данных базы выводил также значение базового периода, который нужен для расчета отпуска.
Кроме того поскольку движения осуществляются по двум наборам записей РР, то для поиска номера строки уже недостаточно, поэтому в выходные поля запроса добавил еще одно вычисляемое поле строка которая для каждого запроса из объединения содержала его имя. Поиск я проводил уже по номеру строки и имени РР.
Расчет отпуска реализован не совсем правильно, поскольку если, например, нет данных базы за предыдущие 12 месяцев, но календарь заполнен, то количество рабочих дней для расчета отпуска будет определяться за все 12 месяцев, хотя сотрудник из них, например, реально отработал только три и база начислений будет определяться только за эти три месяца и поэтому при расчете отпускных сотрудник получит меньше чем должен был бы. То есть для правильного расчета отпуска необходимо базовый период для расчета отпуска определять хотя бы с учетом даты его приема на работу. Но поскольку в задании об этом ничего не сказано, решил не усложнять задачу.
>Но поскольку в задании об этом ничего не сказано, решил не усложнять задачу.
Более того, в задании сказано, что для расчета дней нужно ориентироваться именно на рабочие дни.
Поэтому усложнять задачу действительно не требуется.
По-моему для выполнения этого задания дополнительно понадобятся главы 11 и 12.
Спасибо, поправили.