Продвинутый курс. Занятие №17
Первое занятие 4-го блока продвинутого курса по программированию.
Необходимо изучить следующие главы текущего блока.
Глава 1. Настройки объектов расчета
Глава 2. Графики работы
Глава 3. Универсальные алгоритмы
Глава 4. Задача сторнирования
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.
Задание выполнено.
Перенес и адаптировал к поставленной задаче функционал базового курса. Учет КТУ бригады рабочих реализован непосредственно в документе “Выпуск продукции”. При проведении выпуска данные о начислениях заносятся в регистр накопления. Эти данные используются в документе “Начисление зарплаты” при расчете сдельной зарплаты.
Задание выполнила. Перезаполнила графики работы часами.Объекты конфигурации и основные алгоритмы взяла с уроков. Расчет по сдельной оплате реализовала так : в документ ВыпускПродукции в табличную часть Продукция добавила реквизит СтавкаОплаты, добавила новую табличную часть Исполнители(Сотрудник, КТУ). В проведении док-та НачисленияЗарплаты проверяю на вид расчета и для СдельнойОплаты расчитываю размер с помощью пакетного запроса. В нем обращаюсь к табличным частям документа ВыпускПродукции группируя и выбирая оттуда все необходимые данные.
Задание выполнено.
1. В осн. начисления добавлен Оклад и ОплатаПоБольничномуЛисту, в доп. начисления НадбавкаЗаВредность и СдельнаяОплата. Оклад вытесняется больничным и является базой для надбавки. Добавил в осн. и доп. начисления реквизит СпособРасчета – спр. СпособыРасчета.
2. Для расчета сдельной оплаты ввел новый документ “НачислениеСдельнойОплаты”, рекв – Подразделения, 2 табл. части: “ВыпущеннаяПродукция” с рекв. Номенклатура, Количество, Расценка и “Исполнители” с рекв. Испольнитель, КТУ. При проведении рассчитываются и делаются записи доп.начислений.
Запрос для заполнения регистра расчета:
<code> ВЫБРАТЬ
СУММА(НачислениеСдельнойОплатыИсполнители.КоэффициентТрудовогоУчастия) КАК КоэффициентТрудовогоУчастия
ПОМЕСТИТЬ ВТСуммарныйКТУ
ИЗ
Документ.НачислениеСдельнойОплаты.Исполнители КАК НачислениеСдельнойОплатыИсполнители
ГДЕ
НачислениеСдельнойОплатыИсполнители.Ссылка = &ТекДокумент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НачислениеСдельнойОплатыИсполнители.Исполнитель КАК Сотрудник,
СУММА(НачислениеСдельнойОплатыВыпущеннаяПродукция.Количество * НачислениеСдельнойОплатыВыпущеннаяПродукция.РасценкаЕдиницыПродукции * НачислениеСдельнойОплатыИсполнители.КоэффициентТрудовогоУчастия / ВТСуммарныйКТУ.КоэффициентТрудовогоУчастия) КАК СдельнаяОплата
ИЗ
Документ.НачислениеСдельнойОплаты.ВыпущеннаяПродукция КАК НачислениеСдельнойОплатыВыпущеннаяПродукция
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеСдельнойОплаты.Исполнители КАК НачислениеСдельнойОплатыИсполнители
ПО НачислениеСдельнойОплатыВыпущеннаяПродукция.Ссылка = НачислениеСдельнойОплатыИсполнители.Ссылка,
ВТСуммарныйКТУ КАК ВТСуммарныйКТУ
ГДЕ
НачислениеСдельнойОплатыВыпущеннаяПродукция.Ссылка = &ТекДокумент
СГРУППИРОВАТЬ ПО
НачислениеСдельнойОплатыИсполнители.Исполнитель</code>.
3. Остальные виды расчета рассчитываю документом НачислениеЗаработнойПлаты. В базовом курсе мы выполняли подобное задание, решение взял оттуда, только исправил формулы расчета, так как в задании они изменились.
Задание выполнила. Новое перечисление – “способы расчета”, реквизит в планах видов расчета – “способ расчета”. Создала документ “Сдельный наряд”, в форме которого рассчитывается сумма по наряду для каждого сотрудника из табличной части в зависимости от КТУ. Документ делает движения в оборотный регистр накопления “Сдельная выработка”. Процедуры расчета записей находятся в общем модуле. Сначала получаем структуру необходимых данных, затем в запросе данные для расчета, после чего выполняем сам расчет.
Лучше поздно, чем никогда..
Как и многие, перенес функционал из базового курса с небольшими корректировками. В РС ГрафикиРаботы изменил состав реквизита Дата(Дата+Время), в обработке заполнения графика установил признак Почасовой, изменил заполнение с учетом этого признака. С длиной рабочего дня не стал заморачиваться, пусть сотрудники работают по 24 часа в сутки. Настройка и проверка первых 3-х ВР сложностей не вызвала. Для сделки доработан док-т ВыпускПродукции, который формирует движения по новому оборотному регистру. Создал новый способ расчета – Фикс. суммой, доработка расчета доп.начислений минимальна. Также в док-те доработал заполнение тч данными по сдельной работе из нового регистра накопления.
Задание №17 выполнено.
Методика и основные алгоритмы взяты из решения заданий по расчету в базовом курсе, произведены небольшие корректировки (в основном удалено лишнее с целью упрощения кода). Созданы и настроены виды и регистры расчетов, а также перечисление СпособыРасчета.
Самое интересное – расчет сдельной оплаты. Для этого в документе выпуска продукции в табл. часть Товары добавил реквизит СтоимостьВыпуска, а также создал новую табл. часть КТУ (реквизиты Сотрудник, КТУ).
В процедуре расчета результата по набору записей регистра расчета анализируется наличие записей с видом расчета, для которых способ указан как “сдельная”. Если такие записи есть, то выполняется запрос, который создает несколько временных таблиц, используемых в дальнейшем при расчете отдельных записей. ВТ ДанныеКТУ содержит информацию о КТУ сотрудников в разрезе документов выпуска, ВТ ДанныеВыпуска содержит информацию об общем КТУ и стоимости выпуска для каждого документа. Соответствующий кусок кода:
<code>
Если Параметры.Сдельная Тогда
ЗапросВП = Новый Запрос(”
|ВЫБРАТЬ
| ВыпускПродукцииТовары.Ссылка КАК ДокВыпуска,
| СУММА(ВыпускПродукцииТовары.Количество * ВыпускПродукцииТовары.СтоимостьВыпуска) КАК Стоимость
|ПОМЕСТИТЬ СтоимостьВыпуска
|ИЗ
| Документ.ВыпускПродукции.Товары КАК ВыпускПродукцииТовары
|ГДЕ
| ВыпускПродукцииТовары.Ссылка.Дата >= &НачалоПериода
| И ВыпускПродукцииТовары.Ссылка.Дата <= &КонецПериода
|
|СГРУППИРОВАТЬ ПО
| ВыпускПродукцииТовары.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВыпускПродукцииКТУ.Ссылка КАК ДокВыпуска,
| ВыпускПродукцииКТУ.Сотрудник,
| ВыпускПродукцииКТУ.КТУ,
| ВыпускПродукцииКТУ.Ссылка.Подразделение
|ПОМЕСТИТЬ ДанныеКТУ
|ИЗ
| Документ.ВыпускПродукции.КТУ КАК ВыпускПродукцииКТУ
|ГДЕ
| ВыпускПродукцииКТУ.Ссылка.Дата >= &НачалоПериода
| И ВыпускПродукцииКТУ.Ссылка.Дата <= &КонецПериода
|
|ИНДЕКСИРОВАТЬ ПО
| ДокВыпуска
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СтоимостьВыпуска.ДокВыпуска КАК ДокВыпуска,
| МАКСИМУМ(СтоимостьВыпуска.Стоимость) КАК Стоимость,
| СУММА(ДанныеКТУ.КТУ) КАК ОбщийКТУ
|ПОМЕСТИТЬ ДанныеВыпуска
|ИЗ
| СтоимостьВыпуска КАК СтоимостьВыпуска
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеКТУ КАК ДанныеКТУ
| ПО СтоимостьВыпуска.ДокВыпуска = ДанныеКТУ.ДокВыпуска
|
|СГРУППИРОВАТЬ ПО
| СтоимостьВыпуска.ДокВыпуска
|
|ИНДЕКСИРОВАТЬ ПО
| ДокВыпуска”);
ЗапросВП.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ЗапросВП.УстановитьПараметр(“НачалоПериода”, ВыборкаКатегория.ПериодДействияНачало);
ЗапросВП.УстановитьПараметр(“КонецПериода”, ВыборкаКатегория.ПериодДействияКонец);
ЗапросВП.Выполнить();
КонецЕсли;
</code>
Здесь НачалоПериода и КонецПериода – это соответственно минимальное и максимальное значения среди всех записей набора (определяются чуть раньше тем же запросом, который разбивает записи по категориям).
Дальше выполняется выборка данных для категории, обход записей набора с вычислением результата по алгоритму, зависящему от способа расчета. Для сдельной оплаты расчет выполняется с помощью запроса к ранее подготовленным временным таблицам:
<code>
Если Выборка.СпособРасчета = Сдельная Тогда
ЗапросВП.Текст=”
|ВЫБРАТЬ
| СУММА(ВЫБОР
| КОГДА ДанныеВыпуска.ОбщийКТУ = 0
| ТОГДА 0
| ИНАЧЕ ДанныеКТУ.КТУ * ДанныеВыпуска.Стоимость / ДанныеВыпуска.ОбщийКТУ
| КОНЕЦ) КАК СуммаОплаты
|ИЗ
| ДанныеКТУ КАК ДанныеКТУ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеВыпуска КАК ДанныеВыпуска
| ПО ДанныеКТУ.ДокВыпуска = ДанныеВыпуска.ДокВыпуска
|ГДЕ
| ДанныеКТУ.Сотрудник = &Сотрудник
| И ДанныеКТУ.Подразделение = &Подразделение”;
ЗапросВП.УстановитьПараметр(“Сотрудник”,Выборка.Сотрудник);
ЗапросВП.УстановитьПараметр(“Подразделение”,Выборка.Подразделение);
Результат = 0;
ВыборкаСдельная = ЗапросВП.Выполнить().Выбрать();
Если ВыборкаСдельная.Следующий() Тогда
Результат = ВыборкаСдельная.СуммаОплаты;
КонецЕсли;
</code>
Механизмы расчета зарплаты по способам расчета и категориям взяты из домашних заданий базового курса. Для учета отработанных часов была модифицирована обработка заполнения графика (алгоритм заполнения взят из соответствующих уроков продвинутого курса). Первые 3 вида расчета практически не потребовали доработки конфигурации базового курса. Сдельная оплата реализована следующим способом. Для справочника “Номенклатура” добавлен числовой реквизит “РасценкаВыпуска”, в документ “Выпуск” добавлена табличная часть, в строке которой указываются: сотрудник, КТУ. Кроме того, создан вспомогательный оборотный регистр накопления, измерения “Сотрудник”, “Подразделение”, ресурс “Сумма”. При проведении выпуска производится расчет сдельной оплаты для каждого исполнителя, данные заносятся в регистр накопления. В документе “Начисление зарплаты” вводится запись со способом расчета “Сдельная оплата”. Результат расчета для таких записей – оборот из регистра накопления за период, равный базовому периоду записи (по определенному сотруднику и подразделению).
Готово! В принципе, особых затруднений не возникло. Правда, пришлось заглянуть в базовый курс, чтобы освежить память. :) Плюс уроки продвинутого курса.
Планы видов расчета настроены.
КТУ заполняются в документе “ВыпускПродукции”. Была мыль вынести это в РС, чтобы не вводить каждый раз. Но в этом случае не будет возможности это менять часто, а ведь КТУ может и поменяться :) )
Ооооо! Придумал….. Дефолтные значения хранить в РС, но давать возможность их корректировать в документе.
Немного подправил обработку заполнения графиков. Добавил возможность указывать количество часов в рабочем дне. Данная возможность позволит более гибко настраивать графики. Например, ввести график, где 4-хчасовой рабочий день.
План видов расчета:
Основные начисления – ОкладПоЧасам, СдельнаяОплата, ОплатаПоБольничномуЛисту (вытесняет – ОкладПоЧасам) .
Дополнительные начисления – НадбавкаЗаВредность (база – СдельнаяОплата).
СпособыРасчета: ПоОтработанномуВремени, СдельнаяОплата, ОплатаБЛ, Процентом.
Для расчета количества рабочих часов добавим графики работы с детализацией до часа.
Для расчета сдельной оплаты добавим оборотный регистр накопления НачисленияПоВыпуску (измерение Сотрудник, ресурс Сумма), в документ ВыпускПродукции – табличную часть Исполнители (реквизиты Сотрудник, КТУ). Расценки получаем из регистра сведений Расценки (измерение Номенклатура, ресурс Сумма). При проведении
документа рассчитываем общую сумму начислений и заполняем регистр распределенными по сотрудникам суммами с учетом КТУ.
В документе НачислениеЗаработнойПлаты заполняем движения по регистрам ОсновныеНачисления и ДополнительныеНачисления (для оплаты по больничному листу график получаем из реквизита ПланаВидовРасчета.ОсновныеНачисления.ТипГрафика), вызываем процедуры расчета.
Дополняем универсальные алгоритмы расчета параметром НачисленияПоВыпуску и запросом к регистру:
выходное поле – | ,ЕСТЬNULL(НачисленияПоВыпускуОбороты.СуммаОборот,0) КАК СуммаНачислено”;
соединение –
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НачисленияПоВыпуску.Обороты(&НачалоПериода, &КонецПериода, , ) КАК
НачисленияПоВыпускуОбороты
| ПО (ОсновныеНачисления.Сотрудник = НачисленияПоВыпускуОбороты.Сотрудник
| И ОсновныеНачисления.ВидРасчета.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчета.СдельнаяОплата))”;
Расчеты выполняем по формулам:
Если Выборка.Способ = Перечисления.СпособыРасчета.ПоОтработанномуВремени ИЛИ Выборка.Способ =
Перечисления.СпособыРасчета.ОплатаБЛ Тогда
Если Выборка.План=0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нет данных графика”;
Сообщение.Сообщить();
Отказ = Истина;
Иначе
КоэфБЛ = ?(Выборка.Способ = Перечисления.СпособыРасчета.ОплатаБЛ, 1/3, 1);
Результат = Выборка.Факт*Выборка.Размер*КоэфБЛ;
КонецЕсли;
ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.СдельнаяОплата Тогда
Результат = Выборка.СуммаНачислено;
ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.Процентом Тогда
Результат = Выборка.Размер*Выборка.База/100;
КонецЕсли;
Довольно сложно правильно настроить план видов расчета. Не смогла определить, должна ли оплата по больничному вытеснять сдельную оплату, думаю, что нет.
Здравствуйте!
Получилось так, что у меня украли сумку, в которой был диски с продвинутым курсом (я заказывал базовый и продвинутый курс на CD).
Можете ли вы помочь восстановить видеоматериал? Очень жаль прерывать курс.
Я обращался в поддержку. Получил ответ 24.06.2011, что вопрос будет и в ближайшее время решен.
И больше ничего.
Добрый день, Юрий!
По Вашей проблеме сегодня должен быть ответ почтой. Если письма не будет, сообщите мне.
Здравствуйте, Евгений!
Спасибо за понимание. Хочется закончить курс. Ответ по электронной почте не пришел.
Связался с логистами.
Сделали заказ в типографию на изготовления нового комплекта для Вас, в течение недели ожидайте ответ от dostavka@nasf.ru.
Большое спасибо! Все накладные расходы я готов оплатить.
Этого не требуется :)
Успехов в обучении!
1. В планы видов расчета добавил реквизит Способ расчета типа перечисления, где и задал необходимые способы расчета.
2. Переделал обработку, по заполнению типов графика работы в часах.
3. Создал Виды расчета согласно ТЗ. Оклад, больничный, Надбавку. Оклад вытесняется Больничным и является базовым и ведущим для Больничного и Надбавки.
4. Алгоритм расчета построил так же как и в базовом курсе, то есть взял их за основу. Потому приводить алгоритмы не буду.
5. Для решения задачи сдельной оплаты, пришлось у сотрудников ввести новый реквизит КТУ(Коэффициента трудового участия). А вот далее я запнулся, буду ждать Вашего решения, так как мое меня завело в тупик, так как всегда нужно получить значение = Сумме начисленной/количество продукции и это умноженное на КТУ сотрудника. Вот как это выполнить удобнее для пользователя меня немного остановило.
1. В планы видов расчета добавил реквизит Способ расчета типа перечисления, где и задал необходимые способы расчета. 2. Переделал обработку, по заполнению типов графика работы в часах. 3. Создал Виды расчета согласно ТЗ. Оклад, больничный, Надбавку. Оклад вытесняется Больничным и является базовым и ведущим для Больничного и Надбавки. 4. Алгоритм расчета построил так же как и в базовом курсе, то есть взял их за основу. Потому приводить алгоритмы не буду. 5. Для решения задачи сдельной оплаты, пришлось у сотрудников ввести новый реквизит КТУ(Коэффициента трудового участия). А вот далее я запнулся, буду ждать Вашего решения, так как мое меня завело в тупик, так как всегда нужно получить значение = Сумме начисленной/количество продукции и это умноженное на КТУ сотрудника. Вот как это выполнить удобнее для пользователя меня немного остановило.