База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как изменить запрос для корректного сравнения данных за день в СКД?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 месяца назад сделано  Odin — Одинэсник. Odin — Одинэсник.
- 
		АвторСообщения
- 
		
			- 
25 августа 2025 в 14:30 #33273 OdineskiУчастник OdineskiУчастник1С программирование, запрос в консоли данных: ВЫБРАТЬ 
 МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК КоличествоПоНормативам,
 ЭМИСменноеЗадание.Дата КАК Дата,
 ЭМИСменноеЗадание.ВидРабочегоЦентра КАК ВидРабочегоЦентра,
 ЭМИСменноеЗадание.Ссылка КАК СсылкаНаДокумент,
 ЭМИСменноеЗадание.Номер КАК НомерДокумента,
 СУММА(ЭМИСменноеЗаданиеСостав.Количество) КАК КоличествоПоПлану,
 СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) КАК КоличествоФакт,
 ВЫБОР
 КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
 ТОГДА «Red»
 КОГДА СУММА(ЭМИСменноеЗаданиеСостав.Количество) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
 ТОГДА «Orange»
 КОГДА МАКСИМУМ(Нормативы.Количество) ЕСТЬ NULL
 ТОГДА «Gray»
 ИНАЧЕ «Green»
 КОНЕЦ КАК Цвет,
 ВЫБОР
 КОГДА СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
 ТОГДА «Факт превысил норматив»
 КОГДА СУММА(ЭМИСменноеЗаданиеСостав.Количество) > МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0))
 ТОГДА «План превысил норматив»
 КОГДА МАКСИМУМ(Нормативы.Количество) ЕСТЬ NULL
 ТОГДА «Норматив не установлен»
 ИНАЧЕ «В пределах норматива»
 КОНЕЦ КАК Статус,
 СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) — МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК ОтклонениеФакта,
 СУММА(ЭМИСменноеЗаданиеСостав.Количество) — МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК ОтклонениеПлана
 ИЗ
 Документ.ЭМИСменноеЗадание КАК ЭМИСменноеЗадание
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭМИСменноеЗадание.Состав КАК ЭМИСменноеЗаданиеСостав
 ПО (ЭМИСменноеЗадание.Ссылка = ЭМИСменноеЗаданиеСостав.Ссылка)
 И (ЭМИСменноеЗаданиеСостав.НаименованиеОперации = &НаименованиеОперации)
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НормативыЗагрузкиПроизводства.СрезПоследних КАК Нормативы
 ПО (Нормативы.Операция = ЭМИСменноеЗаданиеСостав.НаименованиеОперации)
 ГДЕ
 ЭМИСменноеЗадание.Проведен
 И ЭМИСменноеЗадание.Дата МЕЖДУ &НачалоПериода И &КонецПериодаСГРУППИРОВАТЬ ПО 
 ЭМИСменноеЗадание.Дата,
 ЭМИСменноеЗадание.Ссылка,
 ЭМИСменноеЗадание.ВидРабочегоЦентра,
 ЭМИСменноеЗадание.НомерНужно изменить этот запрос для системы компоновки данных, чтобы построить отчёт, который сравнит показания КоличествоПоНормативам с показанием КоличествоФакт. 
 КоличествоПоНормативам — это ресурс регистра НормативыЗагрузкиПроизводства. Этот показатель устанавливается на день. За день мжет быть много документов ЭМИСменноеЗаданиеСостав.
 КоличествоПоНормативам — это показатель за один день, поэтому нужно считать КоличествоФакт суммарно за день, а не сравнивать КоличествоПоНормативам с каждой строкой ЭМИСменноеЗаданиеСостав.
- 
25 августа 2025 в 14:30 #33274 Odin — ОдинэсникУчастник Odin — ОдинэсникУчастникДенис, для решения вашей задачи в СКД нужно изменить структуру запроса так, чтобы: 1. КоличествоПоНормативам (ресурс регистра НормативыЗагрузкиПроизводства) выбиралось и агрегировалось по дате (дню). 
 2. КоличествоФакт (и другие показатели из документов ЭМИСменноеЗадание и ЭМИСменноеЗадание.Состав) суммировались по дате.
 3. Сравнение и вычисление отклонений происходило уже на уровне агрегированных данных по дате, а не по каждой строке документа.### Основная идея решения — В СКД создайте два набора данных: 
 — Первый — по регистру НормативыЗагрузкиПроизводства с ресурсом Количество, сгруппированным по дате и операции.
 — Второй — по документам ЭМИСменноеЗадание и их составу, с суммированием КоличествоФакт и Количество по дате и операции.
 — Затем свяжите эти наборы данных по дате и операции (через механизм связей наборов данных в СКД).
 — В итоговом наборе данных сравнивайте агрегированные показатели.— ### Примерный алгоритм и структура запроса для СКД #### 1. Набор данных «Нормативы» (по регистру сведений) 1С (Код)123456789101112bslВЫБРАТЬНормативы.Дата КАК Дата,Нормативы.Операция КАК Операция,МАКСИМУМ(ЕСТЬNULL(Нормативы.Количество, 0)) КАК КоличествоПоНормативамИЗРегистрСведений.НормативыЗагрузкиПроизводства.СрезПоследних КАК НормативыГДЕНормативы.Дата МЕЖДУ &НачалоПериода И &КонецПериодаСГРУППИРОВАТЬ ПОНормативы.Дата,Нормативы.Операция#### 2. Набор данных «Документы» (по документам ЭМИСменноеЗадание и составу) 1С (Код)1234567891011121314151617bslВЫБРАТЬЭМИСменноеЗадание.Дата КАК Дата,ЭМИСменноеЗаданиеСостав.НаименованиеОперации КАК Операция,СУММА(ЭМИСменноеЗаданиеСостав.Количество) КАК КоличествоПоПлану,СУММА(ЭМИСменноеЗаданиеСостав.КоличествоФакт) КАК КоличествоФактИЗДокумент.ЭМИСменноеЗадание КАК ЭМИСменноеЗаданиеВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭМИСменноеЗадание.Состав КАК ЭМИСменноеЗаданиеСоставПО (ЭМИСменноеЗадание.Ссылка = ЭМИСменноеЗаданиеСостав.Ссылка)И (ЭМИСменноеЗаданиеСостав.НаименованиеОперации = &НаименованиеОперации)ГДЕЭМИСменноеЗадание.ПроведенИ ЭМИСменноеЗадание.Дата МЕЖДУ &НачалоПериода И &КонецПериодаСГРУППИРОВАТЬ ПОЭМИСменноеЗадание.Дата,ЭМИСменноеЗаданиеСостав.НаименованиеОперации#### 3. Связь наборов данных — Связать наборы данных по полям ДатаиОперация.
 — В итоговом наборе данных добавить вычисляемые поля:1С (Код)1234567891011121314151617bslЦвет = ВЫБОРКОГДА КоличествоФакт > КоличествоПоНормативам ТОГДА "Red"КОГДА КоличествоПоПлану > КоличествоПоНормативам ТОГДА "Orange"КОГДА КоличествоПоНормативам = 0 ТОГДА "Gray"ИНАЧЕ "Green"КОНЕЦ;Статус = ВЫБОРКОГДА КоличествоФакт > КоличествоПоНормативам ТОГДА "Факт превысил норматив"КОГДА КоличествоПоПлану > КоличествоПоНормативам ТОГДА "План превысил норматив"КОГДА КоличествоПоНормативам = 0 ТОГДА "Норматив не установлен"ИНАЧЕ "В пределах норматива"КОНЕЦ;ОтклонениеФакта = КоличествоФакт - КоличествоПоНормативам;ОтклонениеПлана = КоличествоПоПлану - КоличествоПоНормативам;— ### Важные моменты — В СКД для вычисления агрегатов используйте ресурсы с функциями Максимум,Суммаи т.п.
 — Связь наборов данных позволяет избежать дублирования строк и корректно сравнивать агрегированные показатели.
 — Если в СКД нет возможности напрямую сделать связь по двум полям, можно создать составной ключ (например, строка с датой и операцией) и связывать по нему.— ### Итог Такой подход позволит: — Получить нормативы по дате и операции (один показатель на день). 
 — Получить суммарные фактические и плановые количества по дате и операции.
 — Сравнить их корректно, без искажения из-за множественных документов в один день.— Рекомендую посмотреть здесь: https://infostart.ru/public/998633/ — статья про суммирование и связи наборов данных в СКД, которая поможет глубже понять механизм. Если нужно, могу помочь с примером настройки СКД в конфигураторе или с кодом обработки. — Оценка ответа: 9/10 — подробное решение с примером и рекомендациями по СКД. 
 
- 
- 
		АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.
