[РЕШЕНО] Подскажите пожалуйста как правильно составить запрос в СКД

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

  1. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    Здравствуйте уважаемые форумчане!
    Осваиваю СКД. В 1С 8.3 БП 3.0 делаю отчет, в котором необходимо вывести зарплату сотрудника в зависимости от оказанных услуг (в %). % заработной платы содержится в регистре сведений. Данные об оказанных услугах в регистре накопления.

    Создал два набора данных:
    Код:
    ВЫБРАТЬ
        ЗарплатаОтУслугОбороты.Период КАК Период,
        ЗарплатаОтУслугОбороты.Сотрудник КАК Сотрудник,
        ЗарплатаОтУслугОбороты.Услуга КАК Услуга,
        СУММА(ЗарплатаОтУслугОбороты.СуммаОборот) КАК СуммаОборот,
        СУММА(ЗарплатаОтУслугОбороты.СуммаПриход) КАК СуммаПриход,
        СУММА(ЗарплатаОтУслугОбороты.СуммаРасход) КАК СуммаРасход
    {ВЫБРАТЬ
        Период,
        Сотрудник.*,
        Услуга.*,
        СуммаОборот.*,
        СуммаПриход.*,
        СуммаРасход.*}
    ИЗ
        РегистрНакопления.ЗарплатаОтУслуг.Обороты(, , День, ) КАК ЗарплатаОтУслугОбороты
    
    СГРУППИРОВАТЬ ПО
        ЗарплатаОтУслугОбороты.Сотрудник,
        ЗарплатаОтУслугОбороты.Период,
        ЗарплатаОтУслугОбороты.Услуга
    и
    Код:
    ВЫБРАТЬ
        ПроцентыЗПФизЛицСрезПоследних.Период КАК Период,
        ПроцентыЗПФизЛицСрезПоследних.ФизЛицо,
        ПроцентыЗПФизЛицСрезПоследних.ПроцентЗП
    ИЗ
        РегистрСведений.ПроцентыЗПФизЛиц.СрезПоследних КАК ПроцентыЗПФизЛицСрезПоследних
    
    СГРУППИРОВАТЬ ПО
        ПроцентыЗПФизЛицСрезПоследних.Период,
        ПроцентыЗПФизЛицСрезПоследних.ФизЛицо,
        ПроцентыЗПФизЛицСрезПоследних.ПроцентЗП
    Сделал связь наборов данных по периоду.
    В вычисляемых полях сделал новое поле Зарплата: ПроцентЗП/100*СуммаПриход

    Из параметров:
    &НачалоПериода (начало отчета: дата, начало этого месяца);
    &КонецПериода (конец отчета: дата, начало этого дня);

    При запуске всё выводится правильно, но не могу правильно выбирать % заработной платы. Пытался добавить параметр &Дата, который подставлял в выборку таблицы как: РегистрСведений.ПроцентыЗПФизЛиц.СрезПоследних(&Дата,). Думал, что таким образом смогу в отчете в пределе дат между НачалоПериода и КонецПериода выбирать по нему процент заработной платы по % из регистра сведений. К сожалению не нашел куда его и как подвязывать.

    Читал похожую статью на другом форуме, но там у автора аналогичный параметр &Дата ни к чему не привязан. Возможно туплю, но самостоятельно средставми СКД не знаю куда "тыкать". Подскажите, что не так делаю?

    Если это поможет - прикрепляю соответствующую схему очтета.

    Вложения:

  2. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    1й вопрос.
    Вы делаете это через два набора, поТому как на определнный период оборотов Вам надо получать определнный процент?

    2. Ну там сцепка идет по параметру и праметр этот в полях должен быть.

    Я на форуме уже писал ни раз и даже прикреплял пример. поищите. что то типа Остатки на каждый день и т.д
  3. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    1. Да. В регистре сведений может еженедельно меняться процент, поэтому нужно получать этот на каждый день.
    2. Да, в поле "Параметр" связи наборов я выставлял параметр Период. Его же я пробовал подставить в код (как-то так):
    Код:
    РегистрСведений.ПроцентыЗПФизЛиц.СрезПоследних(&Период,) КАК ПроцентыЗПФизЛицСрезПоследних
    Спасибо за подсказку, сейчас буду искать по форуму
  4. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
  5. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    Сделал в СКД подобные запросы.
    Код:
    ВЫБРАТЬ
        ДатыПериодов.ДатаПериода
    ИЗ
        (ВЫБРАТЬ
            КОНЕЦПЕРИОДА(ПроцентыЗПФизЛиц.Период, ДЕНЬ) КАК ДатаПериода
        ИЗ
            РегистрСведений.ПроцентыЗПФизЛиц КАК ПроцентыЗПФизЛиц) КАК ДатыПериодов
    
    Первый запрос выбирает мои два периода, когда был установлен соответствующий процент. Когда я по аналогии строю второй запрос и связываю его с первым по периоду, то у меня получается просто дублирование по этим двум периодам всего.
    Код:
    ВЫБРАТЬ
        ЗарплатаОтУслугОбороты.Период КАК Период,
        МАКСИМУМ(ЗарплатаОтУслугОбороты.РеальныйПериод) КАК РеальныйПериод,    
        ЗарплатаОтУслугОбороты.Сотрудник КАК Сотрудник,
        ЗарплатаОтУслугОбороты.СуммаОборот КАК СуммаОборот,
        ЗарплатаОтУслугОбороты.Условие КАК Условие,
        РегистрСведений.ПроцентЗП
    ИЗ
        (ВЫБРАТЬ
        КОНЕЦПЕРИОДА(&Период, ДЕНЬ) КАК Период,
        ЗарплатаОтУслуг.Период КАК РеальныйПериод,
        ЗарплатаОтУслуг.Сотрудник КАК Сотрудник,
        ВЫБОР    
            КОГДА ЗарплатаОтУслуг.Период > КОНЕЦПЕРИОДА(&Период, ДЕНЬ)
            ТОГДА 1
            ИНАЧЕ NULL
        КОНЕЦ КАК Условие,
        ЗарплатаОтУслуг.СуммаОборот КАК СуммаОборот
        ИЗ
        РегистрНакопления.ЗарплатаОтУслуг.Обороты(, , День, ) КАК ЗарплатаОтУслуг) КАК ЗарплатаОтУслугОбороты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыЗПФизЛиц КАК РегистрСведений
    ПО РегистрСведений.ФизЛицо = ЗарплатаОтУслугОбороты.Сотрудник
    СГРУППИРОВАТЬ ПО
        ЗарплатаОтУслугОбороты.Период,
        ЗарплатаОтУслугОбороты.Сотрудник,
        ЗарплатаОтУслугОбороты.СуммаОборот,
        ЗарплатаОтУслугОбороты.Условие,
        РегистрСведений.ПроцентЗП
    
    Ужас в том, что мне нужно показывать только те поля, которые находятся в интервале моих периодов, а не просто больше или равно. Но у меня может быть десять периодов установки %. Тогда получается нужно как-то выводить только те строки, даты которых находятся между периодов. А я не понимаю как в СКД привязаться к периодам. Как можно написать подобное условие???
  6. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Я вот не совсем понял зачем вы во втором запросе опять соединение делаете. Тот пример что я приводил сотсоит в том что в первом запросе в первом наборе - получаются даты (У Вас в вашем случае это будет дата оборота)
    Затем во втором наборе есть запрос который получает остаток на складе на определнную дату (в вашем случае это процент ставки)
    а потом идет соединение наборов через этот параметр дата. т.е дата из первого запроса подставляется как парметр во второй и на эту дату вытаскивается остаток.
    Так вот для вас по сути то же самоеЕсть оборот по датам, есть срез последниз на дату. Из первого дату передали во второй и получили процент.
  7. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    Получается много дублей. В базе у меня всего 2 записи и две установки процента. Но они разносятся на оба периода выборки и на оба процента. После запроса получается 8 строк. Сделал скриншот

    Вложения:

  8. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    Убрал второе соединение. Дублей меньше, но всё равно есть.
    В пермом запросе ничего не менял:
    Код:
    ВЫБРАТЬ
        ДатыПериодов.ДатаПериода
    ИЗ
        (ВЫБРАТЬ
            КОНЕЦПЕРИОДА(ПроцентыЗПФизЛиц.Период, ДЕНЬ) КАК ДатаПериода
        ИЗ
            РегистрСведений.ПроцентыЗПФизЛиц КАК ПроцентыЗПФизЛиц) КАК ДатыПериодов
    
    Во втором запросе убрал второе соединение:
    Код:
    ВЫБРАТЬ
        ЗарплатаОтУслугОбороты.Период КАК Период,
        ЗарплатаОтУслугОбороты.Сотрудник КАК Сотрудник,
        ЗарплатаОтУслугОбороты.СуммаОборот КАК СуммаОборот,
        РегистрСведений.ПроцентЗП,
        РегистрСведений.Период
    ИЗ
            РегистрНакопления.ЗарплатаОтУслуг.Обороты(, , День, ) КАК ЗарплатаОтУслугОбороты
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыЗПФизЛиц КАК РегистрСведений
            ПО (РегистрСведений.ФизЛицо = ЗарплатаОтУслугОбороты.Сотрудник)
    
    СГРУППИРОВАТЬ ПО
        ЗарплатаОтУслугОбороты.Период,
        ЗарплатаОтУслугОбороты.Сотрудник,
        ЗарплатаОтУслугОбороты.СуммаОборот,
        РегистрСведений.ПроцентЗП,
        РегистрСведений.Период
    Отбор всё равно не получается сделать

    Вложения:

  9. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Да как Вы не поймете Вам тут
    РегистрНакопления.ЗарплатаОтУслуг.Обороты(, , День, ) КАК ЗарплатаОтУслугОбороты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыЗПФизЛиц КАК РегистрСведений
    ПО (РегистрСведений.ФизЛицо = ЗарплатаОтУслугОбороты.Сотрудник)
    Вообще левое соединение не нужно
    его делает СКД когда собирает два набора
    bajiepka нравится это.
  10. TopicStarter Overlay
    bajiepka
    Offline

    bajiepka Опытный в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    329
    Симпатии:
    23
    Баллы:
    29
    Понял. Теперь всё заработало! Спасибо!
  11. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Да не за что.

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