8.х Как в СКД сделать такой запрос?

Тема в разделе "Система компоновки данных (СКД)", создана пользователем bajiepka, 11 апр 2016.

  1. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    322
    Симпатии:
    22
    Баллы:
    29
    Доброго времени суток!
    Ведётся учёт "бонусов" работникам от сумм реализованных услуг. У каждого работника есть коэффициент (0 - 100%), в размере которого ему идёт бонус от оказанной услуги. За месяц этот коэффициент может быть установлено сколько угодно раз в пределах дня, хоть 31.
    По простоте душевной решаю эту задачу в два шага. Запроса:
    Код:
    ВЫБРАТЬ
        Проценты.Период КАК Период,
        Проценты.ФизЛицо КАК Физлицо,
        Проценты.ПроцентЗП КАК ПроцентЗП,
        0 КАК ДельтаДней
    ПОМЕСТИТЬ ВТ_Проценты
    ИЗ
        РегистрСведений.ПроцентыЗПФизЛиц КАК Проценты
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Проценты.Период,
        Проценты.Физлицо,
        Проценты.ПроцентЗП,
        Проценты.ДельтаДней,
        0 КАК РазницаПериодов
    ИЗ
        ВТ_Проценты КАК Проценты
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЗарплатаОтУслугОстаткиИОбороты.Период КАК Дата,
        ЗарплатаОтУслугОстаткиИОбороты.Сотрудник КАК Сотрудник,
        ЗарплатаОтУслугОстаткиИОбороты.Услуга КАК Услуга,
        ЗарплатаОтУслугОстаткиИОбороты.Документ КАК Документ,
        ЗарплатаОтУслугОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток,
        ЗарплатаОтУслугОстаткиИОбороты.СуммаОборот КАК СуммаОборот,
        ЗарплатаОтУслугОстаткиИОбороты.СуммаПриход КАК СуммаПриход,
        ЗарплатаОтУслугОстаткиИОбороты.СуммаРасход КАК СуммаРасход,
        0 КАК Процент,
        0 КАК РазницаДней,
        0 КАК СуммаУслуги
    ИЗ
        РегистрНакопления.ЗарплатаОтУслуг.ОстаткиИОбороты(
                &НачалоПериода,
                &КонецПериода,
                День,
                ,
                Сотрудник В
                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
                        ВТ_Проценты.Физлицо
                    ИЗ
                        ВТ_Проценты)) КАК ЗарплатаОтУслугОстаткиИОбороты
    ГДЕ
        ВЫБОР
                КОГДА &УчитыватьЗакрытыеОстатки
                    ТОГДА ИСТИНА
                ИНАЧЕ ЗарплатаОтУслугОстаткиИОбороты.СуммаКонечныйОстаток > 0
            КОНЕЦ
    И затем программно. В запросе насколько я почитал в тырнете не вычисляется разность дат из двух таблиц, в моём случае [0] и [2], поэтому программно вычисляю разницу между датой оказания услуги и ближайшей установкой коэффициента и беру минимальное значение. Потом это минимальное значение умножаю на стоимость всей услуги и получаю по-суточную сумму бонусов по сотрудникам.

    Код:
    Результат = Запрос.ВыполнитьПакет();
        ТаблицаПроцентов  = Результат[1].Выгрузить();
        ТаблицаРеализаций = Результат[2].Выгрузить();
       
        Для Каждого СтрокаТаблицы Из ТаблицаРеализаций Цикл
            Варианты = ТаблицаПроцентов.НайтиСтроки(Новый Структура("ФизЛицо", СтрокаТаблицы.Сотрудник));
            Если Варианты.Количество() = 1 Тогда
                строкаТаблицы.Процент = Варианты[0].ПроцентЗП;
            ИначеЕсли Варианты.Количество() > 1 Тогда
                //...    очищаем все виды периодов, которые болье нашего
                СчетчикУдаления = 0;
                Для НомерЭлементаМассива = 0 ПО Варианты.Количество() - 1 Цикл
                    Если СтрокаТаблицы.Дата < Варианты[НомерЭлементаМассива - СчетчикУдаления].Период Тогда
                        Варианты.Удалить(НомерЭлементаМассива - СчетчикУдаления);
                        СчетчикУдаления = СчетчикУдаления + 1;
                    Иначе
                        Варианты[НомерЭлементаМассива - СчетчикУдаления].ДельтаДней = СтрокаТаблицы.Дата - Варианты[НомерЭлементаМассива - СчетчикУдаления].Период;
                    КонецЕсли;
                КонецЦикла;
                СчетчикУдаления = 0;
                строкаТаблицы.Процент = МинимальныйПромежуток(Варианты);
            КонецЕсли;
            строкаТаблицы.СуммаУслуги = (строкаТаблицы.СуммаОборот * строкаТаблицы.Процент) / 100;
        КонецЦикла;
    Подскажите пожалуйста, как это можно сделать в СКД? Может если у кого-то есть похожий пример реализации этого в виде СКДшного отчета, поделитесь пожалуйста...
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    bajiepka нравится это.
  3. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    322
    Симпатии:
    22
    Баллы:
    29
    спасибо, многоуважаемый Draco!

Поделиться этой страницей