Продвинутый курс. Занятие №17

Первое занятие 4-го блока продвинутого курса по программированию.

Необходимо изучить следующие главы текущего блока.
Глава 1. Настройки объектов расчета
Глава 2. Графики работы
Глава 3. Универсальные алгоритмы
Глава 4. Задача сторнирования

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.

комментариев 16 на “Продвинутый курс. Занятие №17”

  1. Задание выполнено.

    Перенес и адаптировал к поставленной задаче функционал базового курса. Учет КТУ бригады рабочих реализован непосредственно в документе “Выпуск продукции”.  При проведении выпуска данные о начислениях заносятся в регистр накопления. Эти данные используются в документе “Начисление зарплаты” при расчете сдельной зарплаты.

  2. Задание выполнила. Перезаполнила графики работы часами.Объекты конфигурации и основные алгоритмы взяла с уроков. Расчет по сдельной оплате реализовала так : в документ ВыпускПродукции в табличную часть Продукция добавила реквизит СтавкаОплаты, добавила новую табличную часть Исполнители(Сотрудник, КТУ). В проведении док-та НачисленияЗарплаты проверяю на вид расчета и для СдельнойОплаты расчитываю размер с помощью пакетного запроса. В нем обращаюсь к табличным частям документа ВыпускПродукции группируя и выбирая оттуда все необходимые данные.

  3. respublica 21.07.2011 в 20:17

    Задание выполнено.
    1. В осн. начисления добавлен Оклад и ОплатаПоБольничномуЛисту, в доп. начисления НадбавкаЗаВредность и СдельнаяОплата. Оклад вытесняется больничным и является базой для надбавки. Добавил в осн. и доп. начисления реквизит СпособРасчета – спр. СпособыРасчета.
    2. Для расчета сдельной оплаты ввел новый документ “НачислениеСдельнойОплаты”, рекв – Подразделения, 2 табл. части: “ВыпущеннаяПродукция” с рекв. Номенклатура, Количество, Расценка и “Исполнители” с рекв. Испольнитель, КТУ. При проведении рассчитываются и делаются записи доп.начислений.
    Запрос для заполнения регистра расчета:
    <code> ВЫБРАТЬ
    СУММА(НачислениеСдельнойОплатыИсполнители.КоэффициентТрудовогоУчастия) КАК КоэффициентТрудовогоУчастия
    ПОМЕСТИТЬ ВТСуммарныйКТУ
    ИЗ
    Документ.НачислениеСдельнойОплаты.Исполнители КАК НачислениеСдельнойОплатыИсполнители
    ГДЕ
    НачислениеСдельнойОплатыИсполнители.Ссылка = &ТекДокумент
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    НачислениеСдельнойОплатыИсполнители.Исполнитель КАК Сотрудник,
    СУММА(НачислениеСдельнойОплатыВыпущеннаяПродукция.Количество * НачислениеСдельнойОплатыВыпущеннаяПродукция.РасценкаЕдиницыПродукции * НачислениеСдельнойОплатыИсполнители.КоэффициентТрудовогоУчастия / ВТСуммарныйКТУ.КоэффициентТрудовогоУчастия) КАК СдельнаяОплата
    ИЗ
    Документ.НачислениеСдельнойОплаты.ВыпущеннаяПродукция КАК НачислениеСдельнойОплатыВыпущеннаяПродукция
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеСдельнойОплаты.Исполнители КАК НачислениеСдельнойОплатыИсполнители
    ПО НачислениеСдельнойОплатыВыпущеннаяПродукция.Ссылка = НачислениеСдельнойОплатыИсполнители.Ссылка,
    ВТСуммарныйКТУ КАК ВТСуммарныйКТУ
    ГДЕ
    НачислениеСдельнойОплатыВыпущеннаяПродукция.Ссылка = &ТекДокумент

    СГРУППИРОВАТЬ ПО
    НачислениеСдельнойОплатыИсполнители.Исполнитель</code>.
    3. Остальные виды расчета рассчитываю документом НачислениеЗаработнойПлаты. В базовом курсе мы выполняли подобное задание, решение взял оттуда, только исправил формулы расчета, так как в задании они изменились.

  4. Задание выполнила. Новое перечисление – “способы расчета”, реквизит в планах видов расчета – “способ расчета”.  Создала документ “Сдельный наряд”, в форме которого рассчитывается сумма по наряду для каждого сотрудника из табличной части в зависимости от КТУ. Документ делает движения в оборотный регистр накопления “Сдельная выработка”. Процедуры расчета записей находятся в общем модуле. Сначала получаем структуру необходимых данных, затем в запросе данные для расчета, после чего выполняем сам расчет.

  5. Лучше поздно, чем никогда..
    Как и многие, перенес функционал из базового курса с небольшими корректировками. В РС ГрафикиРаботы изменил состав реквизита Дата(Дата+Время), в обработке заполнения графика установил признак Почасовой, изменил заполнение с учетом этого признака. С длиной рабочего дня не стал заморачиваться, пусть сотрудники работают по 24 часа в сутки. Настройка и проверка первых 3-х ВР сложностей не вызвала. Для сделки доработан док-т ВыпускПродукции, который формирует движения по новому оборотному регистру. Создал новый способ расчета – Фикс. суммой, доработка расчета доп.начислений минимальна. Также в док-те доработал заполнение тч данными по сдельной работе  из нового регистра накопления.

  6. Задание №17 выполнено.
    Методика и основные алгоритмы взяты из решения заданий по расчету в базовом курсе, произведены небольшие корректировки (в основном удалено лишнее с целью упрощения кода). Созданы и настроены виды и регистры расчетов, а также перечисление СпособыРасчета.
    Самое интересное – расчет сдельной оплаты. Для этого в документе выпуска продукции в табл. часть Товары добавил реквизит СтоимостьВыпуска, а также создал новую табл. часть КТУ (реквизиты Сотрудник, КТУ).
    В процедуре расчета результата по набору записей регистра расчета анализируется наличие записей с видом расчета, для которых способ указан как “сдельная”. Если такие записи есть, то выполняется запрос, который создает несколько временных таблиц, используемых в дальнейшем при расчете отдельных записей. ВТ ДанныеКТУ содержит информацию о КТУ сотрудников в разрезе документов выпуска, ВТ ДанныеВыпуска содержит информацию об общем КТУ и стоимости выпуска для каждого документа. Соответствующий кусок кода:
    <code>
    Если Параметры.Сдельная Тогда
    ЗапросВП = Новый Запрос(”
    |ВЫБРАТЬ
    |    ВыпускПродукцииТовары.Ссылка КАК ДокВыпуска,
    |    СУММА(ВыпускПродукцииТовары.Количество * ВыпускПродукцииТовары.СтоимостьВыпуска) КАК Стоимость
    |ПОМЕСТИТЬ СтоимостьВыпуска
    |ИЗ
    |    Документ.ВыпускПродукции.Товары КАК ВыпускПродукцииТовары
    |ГДЕ
    |    ВыпускПродукцииТовары.Ссылка.Дата >= &НачалоПериода
    |    И ВыпускПродукцииТовары.Ссылка.Дата <= &КонецПериода
    |
    |СГРУППИРОВАТЬ ПО
    |    ВыпускПродукцииТовары.Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВыпускПродукцииКТУ.Ссылка КАК ДокВыпуска,
    |    ВыпускПродукцииКТУ.Сотрудник,
    |    ВыпускПродукцииКТУ.КТУ,
    |    ВыпускПродукцииКТУ.Ссылка.Подразделение
    |ПОМЕСТИТЬ ДанныеКТУ
    |ИЗ
    |    Документ.ВыпускПродукции.КТУ КАК ВыпускПродукцииКТУ
    |ГДЕ
    |    ВыпускПродукцииКТУ.Ссылка.Дата >= &НачалоПериода
    |    И ВыпускПродукцииКТУ.Ссылка.Дата <= &КонецПериода
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    ДокВыпуска
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    СтоимостьВыпуска.ДокВыпуска КАК ДокВыпуска,
    |    МАКСИМУМ(СтоимостьВыпуска.Стоимость) КАК Стоимость,
    |    СУММА(ДанныеКТУ.КТУ) КАК ОбщийКТУ
    |ПОМЕСТИТЬ ДанныеВыпуска
    |ИЗ
    |    СтоимостьВыпуска КАК СтоимостьВыпуска
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеКТУ КАК ДанныеКТУ
    |        ПО СтоимостьВыпуска.ДокВыпуска = ДанныеКТУ.ДокВыпуска
    |
    |СГРУППИРОВАТЬ ПО
    |    СтоимостьВыпуска.ДокВыпуска
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    ДокВыпуска”);
    ЗапросВП.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    ЗапросВП.УстановитьПараметр(“НачалоПериода”, ВыборкаКатегория.ПериодДействияНачало);
    ЗапросВП.УстановитьПараметр(“КонецПериода”, ВыборкаКатегория.ПериодДействияКонец);
    ЗапросВП.Выполнить();
    КонецЕсли;

    </code>
    Здесь НачалоПериода и КонецПериода – это соответственно минимальное и максимальное значения среди всех записей набора (определяются чуть раньше тем же запросом, который разбивает записи по категориям).
    Дальше выполняется выборка данных для категории, обход записей набора с вычислением результата по алгоритму, зависящему от способа расчета. Для сдельной оплаты расчет выполняется с помощью запроса к ранее подготовленным временным таблицам:
    <code>
    Если Выборка.СпособРасчета = Сдельная Тогда

    ЗапросВП.Текст=”
    |ВЫБРАТЬ
    |    СУММА(ВЫБОР
    |            КОГДА ДанныеВыпуска.ОбщийКТУ = 0
    |                ТОГДА 0
    |            ИНАЧЕ ДанныеКТУ.КТУ * ДанныеВыпуска.Стоимость / ДанныеВыпуска.ОбщийКТУ
    |        КОНЕЦ) КАК СуммаОплаты
    |ИЗ
    |    ДанныеКТУ КАК ДанныеКТУ
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеВыпуска КАК ДанныеВыпуска
    |        ПО ДанныеКТУ.ДокВыпуска = ДанныеВыпуска.ДокВыпуска
    |ГДЕ
    |    ДанныеКТУ.Сотрудник = &Сотрудник
    |    И ДанныеКТУ.Подразделение = &Подразделение”;
    ЗапросВП.УстановитьПараметр(“Сотрудник”,Выборка.Сотрудник);
    ЗапросВП.УстановитьПараметр(“Подразделение”,Выборка.Подразделение);

    Результат = 0;
    ВыборкаСдельная = ЗапросВП.Выполнить().Выбрать();
    Если ВыборкаСдельная.Следующий() Тогда
    Результат = ВыборкаСдельная.СуммаОплаты;
    КонецЕсли;
    </code>

  7. Механизмы расчета зарплаты по способам расчета и категориям взяты из домашних заданий базового курса. Для учета отработанных часов была модифицирована обработка заполнения графика (алгоритм заполнения взят из соответствующих уроков продвинутого курса). Первые 3 вида расчета практически не потребовали доработки конфигурации базового курса. Сдельная оплата реализована следующим способом. Для справочника “Номенклатура” добавлен числовой реквизит “РасценкаВыпуска”, в документ “Выпуск” добавлена табличная часть, в строке которой указываются: сотрудник, КТУ. Кроме того, создан вспомогательный оборотный регистр накопления, измерения “Сотрудник”, “Подразделение”, ресурс “Сумма”. При проведении выпуска производится расчет сдельной оплаты для каждого исполнителя, данные заносятся в регистр накопления. В документе “Начисление зарплаты” вводится запись со способом расчета “Сдельная оплата”. Результат расчета для таких записей – оборот из регистра накопления за период, равный базовому периоду записи (по определенному сотруднику и подразделению).

  8. Готово! В принципе, особых затруднений не возникло. Правда, пришлось заглянуть в базовый курс, чтобы освежить память. :) Плюс уроки продвинутого курса.
    Планы видов расчета настроены.
    КТУ заполняются в документе “ВыпускПродукции”. Была мыль вынести это в РС, чтобы не вводить каждый раз. Но в этом случае не будет возможности это менять часто, а ведь КТУ может и поменяться  :)  )
    Ооооо! Придумал….. Дефолтные значения хранить в РС, но давать возможность их корректировать в документе.
    Немного подправил обработку заполнения графиков. Добавил возможность указывать количество часов в рабочем дне. Данная возможность позволит более гибко настраивать графики. Например, ввести график, где 4-хчасовой рабочий день.

  9. План видов расчета:
    Основные начисления – ОкладПоЧасам, СдельнаяОплата, ОплатаПоБольничномуЛисту (вытесняет – ОкладПоЧасам) .
    Дополнительные начисления – НадбавкаЗаВредность (база – СдельнаяОплата).
    СпособыРасчета: ПоОтработанномуВремени, СдельнаяОплата, ОплатаБЛ, Процентом.
    Для расчета количества рабочих часов добавим графики работы с детализацией до часа.
    Для расчета сдельной оплаты добавим оборотный регистр накопления НачисленияПоВыпуску (измерение Сотрудник, ресурс Сумма), в документ ВыпускПродукции – табличную часть Исполнители (реквизиты Сотрудник, КТУ). Расценки получаем из регистра сведений Расценки (измерение Номенклатура, ресурс Сумма). При проведении 
    документа рассчитываем общую сумму начислений и заполняем регистр распределенными по сотрудникам суммами с учетом КТУ.
    В документе НачислениеЗаработнойПлаты заполняем движения по регистрам ОсновныеНачисления и ДополнительныеНачисления (для оплаты по больничному листу график получаем из реквизита ПланаВидовРасчета.ОсновныеНачисления.ТипГрафика), вызываем процедуры расчета.
    Дополняем универсальные алгоритмы расчета параметром НачисленияПоВыпуску и запросом к регистру:
    выходное поле – | ,ЕСТЬNULL(НачисленияПоВыпускуОбороты.СуммаОборот,0) КАК СуммаНачислено”;
    соединение –
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НачисленияПоВыпуску.Обороты(&НачалоПериода, &КонецПериода, , ) КАК 
    НачисленияПоВыпускуОбороты
    | ПО (ОсновныеНачисления.Сотрудник = НачисленияПоВыпускуОбороты.Сотрудник
    | И ОсновныеНачисления.ВидРасчета.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчета.СдельнаяОплата))”;
    Расчеты выполняем по формулам:
    Если Выборка.Способ = Перечисления.СпособыРасчета.ПоОтработанномуВремени ИЛИ Выборка.Способ =
    Перечисления.СпособыРасчета.ОплатаБЛ Тогда
    Если Выборка.План=0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нет данных графика”;
    Сообщение.Сообщить();
    Отказ = Истина;
    Иначе
    КоэфБЛ = ?(Выборка.Способ = Перечисления.СпособыРасчета.ОплатаБЛ, 1/3, 1);
    Результат = Выборка.Факт*Выборка.Размер*КоэфБЛ;
    КонецЕсли;
    ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.СдельнаяОплата Тогда
    Результат = Выборка.СуммаНачислено;
    ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.Процентом Тогда
    Результат = Выборка.Размер*Выборка.База/100;
    КонецЕсли;
    Довольно сложно правильно настроить план видов расчета. Не смогла определить, должна ли оплата по больничному вытеснять сдельную оплату, думаю, что нет.

  10. Здравствуйте!
    Получилось так, что у меня украли сумку, в которой был диски с продвинутым курсом (я заказывал базовый и продвинутый курс на CD).
    Можете ли вы помочь восстановить видеоматериал? Очень жаль прерывать курс.

    Я обращался в поддержку. Получил ответ 24.06.2011, что вопрос будет и в ближайшее время решен.
    И больше ничего.
     

    • Добрый день, Юрий!

      По Вашей проблеме сегодня должен быть ответ почтой. Если письма не будет, сообщите мне.

      • Здравствуйте, Евгений!
         
        Спасибо за понимание. Хочется закончить курс. Ответ по электронной почте не пришел.

        • Связался с логистами.
          Сделали заказ в типографию на изготовления нового комплекта для Вас, в течение недели ожидайте ответ от dostavka@nasf.ru.

          • Большое спасибо! Все накладные расходы я готов оплатить.

            • Этого не требуется :)
              Успехов в обучении!

  11. Кононов Сергей 12.07.2011 в 10:00

    1. В планы видов расчета добавил реквизит Способ расчета типа перечисления, где и задал необходимые способы расчета.
    2. Переделал обработку, по заполнению типов графика работы в часах.
    3. Создал Виды расчета согласно ТЗ. Оклад, больничный, Надбавку. Оклад вытесняется Больничным и является базовым и ведущим для Больничного и Надбавки.
    4. Алгоритм расчета построил так же как и в базовом курсе, то есть взял их за основу. Потому приводить алгоритмы не буду.
    5. Для решения задачи сдельной оплаты, пришлось у сотрудников ввести новый реквизит КТУ(Коэффициента трудового участия). А вот далее я запнулся, буду ждать Вашего решения, так как мое меня завело в тупик, так как всегда нужно получить значение = Сумме начисленной/количество продукции и это умноженное на КТУ сотрудника. Вот как это выполнить удобнее для пользователя меня немного остановило.
    1. В планы видов расчета добавил реквизит Способ расчета типа перечисления, где и задал необходимые способы расчета. 2. Переделал обработку, по заполнению типов графика работы в часах. 3. Создал Виды расчета согласно ТЗ. Оклад, больничный, Надбавку. Оклад вытесняется Больничным и является базовым и ведущим для Больничного и Надбавки.  4. Алгоритм расчета построил так же как и в базовом курсе, то есть взял их за основу. Потому приводить алгоритмы не буду. 5. Для решения задачи сдельной оплаты, пришлось у сотрудников ввести новый реквизит КТУ(Коэффициента трудового участия). А вот далее я запнулся, буду ждать Вашего решения, так как мое меня завело в тупик, так как всегда нужно получить значение = Сумме начисленной/количество продукции и это умноженное на КТУ сотрудника. Вот как это выполнить удобнее для пользователя меня немного остановило.