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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как изменить запрос для корректного сравнения данных за день в СКД?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33273
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        1С программирование, запрос в консоли данных:

        ВЫБРАТЬ
        МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК КоличествоПоНормативам,
        ЭМИСменноеЗадание.Дата КАК Дата,
        ЭМИСменноеЗадание.ВидРабочегоЦентра КАК ВидРабочегоЦентра,
        ЭМИСменноеЗадание.Ссылка КАК СсылкаНаДокумент,
        ЭМИСменноеЗадание.Номер КАК НомерДокумента,
        СУММА(ЭМИСменноеЗаданиеСостав.Количество) КАК КоличествоПоПлану,
        СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) КАК КоличествоФакт,
        ВЫБОР
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
        ТОГДА «Red»
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.Количество) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
        ТОГДА «Orange»
        КОГДА МАКСИМУМ(Нормативы.Количество) ЕСТЬ NULL
        ТОГДА «Gray»
        ИНАЧЕ «Green»
        КОНЕЦ КАК Цвет,
        ВЫБОР
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
        ТОГДА «Факт превысил норматив»
        КОГДА СУММА(ЭМИСменноеЗаданиеСостав.Количество) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
        ТОГДА «План превысил норматив»
        КОГДА МАКСИМУМ(Нормативы.Количество) ЕСТЬ NULL
        ТОГДА «Норматив не установлен»
        ИНАЧЕ «В пределах норматива»
        КОНЕЦ КАК Статус,
        СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) — МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК ОтклонениеФакта,
        СУММА(ЭМИСменноеЗаданиеСостав.Количество) — МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК ОтклонениеПлана
        ИЗ
        Документ.ЭМИСменноеЗадание КАК ЭМИСменноеЗадание
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭМИСменноеЗадание.Состав КАК ЭМИСменноеЗаданиеСостав
        ПО (ЭМИСменноеЗадание.Ссылка = ЭМИСменноеЗаданиеСостав.Ссылка)
        И (ЭМИСменноеЗаданиеСостав.НаименованиеОперации = &НаименованиеОперации)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НормативыЗагрузкиПроизводства.СрезПоследних КАК Нормативы
        ПО (Нормативы.Операция = ЭМИСменноеЗаданиеСостав.НаименованиеОперации)
        ГДЕ
        ЭМИСменноеЗадание.Проведен
        И ЭМИСменноеЗадание.Дата МЕЖДУ &НачалоПериода И &КонецПериода

        СГРУППИРОВАТЬ ПО
        ЭМИСменноеЗадание.Дата,
        ЭМИСменноеЗадание.Ссылка,
        ЭМИСменноеЗадание.ВидРабочегоЦентра,
        ЭМИСменноеЗадание.Номер

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

      • #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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С