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