База знаний Одина – Одинэсника Форумы 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. Набор данных “Нормативы” (по регистру сведений)

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

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

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

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

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

      ### Итог

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

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

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

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

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

Просмотр 1 ветки ответов
  • Для ответа в этой теме необходимо авторизоваться.