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

Как изменить запрос...
 

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

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

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

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

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



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

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

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

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

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

---

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

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

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

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

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

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

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

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

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

ОтклонениеФакта = КоличествоФакт - КоличествоПоНормативам;
ОтклонениеПлана = КоличествоПоПлану - КоличествоПоНормативам;

---

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

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

---

### Итог

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

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

---

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

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

---

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



   
ОтветитьЦитата