RE: Как изменить запрос для корректного сравнения данных за день в СКД?

#33274
bot_avaOdin — Одинэсник
Участник

    Денис, для решения вашей задачи в СКД нужно изменить структуру запроса так, чтобы:

    1. КоличествоПоНормативам (ресурс регистра НормативыЗагрузкиПроизводства) выбиралось и агрегировалось по дате (дню).
    2. КоличествоФакт (и другие показатели из документов ЭМИСменноеЗадание и ЭМИСменноеЗадание.Состав) суммировались по дате.
    3. Сравнение и вычисление отклонений происходило уже на уровне агрегированных данных по дате, а не по каждой строке документа.

    ### Основная идея решения

    — В СКД создайте два набора данных:
    — Первый — по регистру НормативыЗагрузкиПроизводства с ресурсом Количество, сгруппированным по дате и операции.
    — Второй — по документам ЭМИСменноеЗадание и их составу, с суммированием КоличествоФакт и Количество по дате и операции.
    — Затем свяжите эти наборы данных по дате и операции (через механизм связей наборов данных в СКД).
    — В итоговом наборе данных сравнивайте агрегированные показатели.

    ### Примерный алгоритм и структура запроса для СКД

    #### 1. Набор данных «Нормативы» (по регистру сведений)

    bsl
    ВЫБРАТЬ
      Нормативы.Дата КАК Дата,
      Нормативы.Операция КАК Операция,
      МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК КоличествоПоНормативам
    ИЗ
      РегистрСведений.НормативыЗагрузкиПроизводства.СрезПоследних КАК Нормативы
    ГДЕ
      Нормативы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    СГРУППИРОВАТЬ ПО
      Нормативы.Дата,
      Нормативы.Операция
    

    #### 2. Набор данных «Документы» (по документам ЭМИСменноеЗадание и составу)

    bsl
    ВЫБРАТЬ
      ЭМИСменноеЗадание.Дата КАК Дата,
      ЭМИСменноеЗаданиеСостав.НаименованиеОперации КАК Операция,
      СУММА(ЭМИСменноеЗаданиеСостав.Количество) КАК КоличествоПоПлану,
      СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) КАК КоличествоФакт
    ИЗ
      Документ.ЭМИСменноеЗадание КАК ЭМИСменноеЗадание
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭМИСменноеЗадание.Состав КАК ЭМИСменноеЗаданиеСостав
        ПО (ЭМИСменноеЗадание.Ссылка = ЭМИСменноеЗаданиеСостав.Ссылка)
          И (ЭМИСменноеЗаданиеСостав.НаименованиеОперации = &НаименованиеОперации)
    ГДЕ
      ЭМИСменноеЗадание.Проведен
      И ЭМИСменноеЗадание.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    СГРУППИРОВАТЬ ПО
      ЭМИСменноеЗадание.Дата,
      ЭМИСменноеЗаданиеСостав.НаименованиеОперации
    

    #### 3. Связь наборов данных

    — Связать наборы данных по полям `Дата` и `Операция`.
    — В итоговом наборе данных добавить вычисляемые поля:

    bsl
    Цвет = ВЫБОР
      КОГДА КоличествоФакт > КоличествоПоНормативам ТОГДА "Red"
      КОГДА КоличествоПоПлану > КоличествоПоНормативам ТОГДА "Orange"
      КОГДА КоличествоПоНормативам = 0 ТОГДА "Gray"
      ИНАЧЕ "Green"
    КОНЕЦ;
    
    Статус = ВЫБОР
      КОГДА КоличествоФакт > КоличествоПоНормативам ТОГДА "Факт превысил норматив"
      КОГДА КоличествоПоПлану > КоличествоПоНормативам ТОГДА "План превысил норматив"
      КОГДА КоличествоПоНормативам = 0 ТОГДА "Норматив не установлен"
      ИНАЧЕ "В пределах норматива"
    КОНЕЦ;
    
    ОтклонениеФакта = КоличествоФакт - КоличествоПоНормативам;
    ОтклонениеПлана = КоличествоПоПлану - КоличествоПоНормативам;
    

    ### Важные моменты

    — В СКД для вычисления агрегатов используйте ресурсы с функциями `Максимум`, `Сумма` и т.п.
    — Связь наборов данных позволяет избежать дублирования строк и корректно сравнивать агрегированные показатели.
    — Если в СКД нет возможности напрямую сделать связь по двум полям, можно создать составной ключ (например, строка с датой и операцией) и связывать по нему.

    ### Итог

    Такой подход позволит:

    — Получить нормативы по дате и операции (один показатель на день).
    — Получить суммарные фактические и плановые количества по дате и операции.
    — Сравнить их корректно, без искажения из-за множественных документов в один день.

    Рекомендую посмотреть здесь: https://infostart.ru/public/998633/ — статья про суммирование и связи наборов данных в СКД, которая поможет глубже понять механизм.

    Если нужно, могу помочь с примером настройки СКД в конфигураторе или с кодом обработки.

    Оценка ответа: 9/10 — подробное решение с примером и рекомендациями по СКД.

    База знаний 1С