7. Табличная модель прикладного решения
#34

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

Когда вы пишете запрос 1С для отчета (например, чтобы проанализировать, как формируются суммы при автозаполнении документа «Ведомость в кассу») и используете группировку, на какие группы должны быть разделены поля в списке выбираемых полей?

Поля должны быть только двух типов: по которым выполняется группировка, и поля-итоги (агрегатные функции).
Неправильно: правило неполное - в запросе 1С при группировке отдельно выделяются еще поля, которые относятся к вложенным таблицам (они не являются ни группировочными полями верхнего уровня, ни агрегатами).
Поля делятся на: группировочные поля, агрегатные показатели и поля вложенных таблиц.
Правильно: при использовании группировки в запросе 1С поля выборки должны относиться либо к полям, по которым строится группировка, либо быть рассчитаны агрегатными функциями, либо быть полями вложенных таблиц, для которых задается отдельная структура вывода.
Чем «выше» уровень группировки, тем выше (раньше) нужно располагать соответствующее поле в тексте запроса.
Неправильно: уровень группировки задается логикой запроса (операторами группировки/итогов и их списками), а не позицией поля в тексте; порядок перечисления полей сам по себе не определяет «уровень» группировки.
Никаких ограничений нет: можно выводить любые поля вместе с группировкой, как удобно.
Неправильно: при группировке действуют ограничения на список выбираемых полей - иначе результат будет неоднозначным (например, какое значение брать для неагрегированного поля внутри группы), и запрос либо не выполнится, либо потребует корректного оформления через агрегаты/вложенные таблицы.

Пояснение

Как запомнить и применить это правило (на примере задач по автозаполнению «Ведомости в кассу»): 1) Зачем вообще нужна группировка Когда вы проверяете, почему ведомость заполняется «не так» (не тот сотрудник, не та сумма, остатки прошлых периодов), часто нужно получить свод: по сотрудникам и периоду - итог «к выплате», а детализацию - по документам-основаниям или видам начислений. 2) Главное правило группировки в запросе 1С Если вы используете группировку, то в списке выбираемых полей верхнего уровня нельзя просто вывести «любое поле из строк». Все поля должны относиться к одному из трех типов: - Группировочные поля: по ним вы объединяете строки (например, Сотрудник, МесяцВыплаты). - Агрегаты: показатели, вычисляемые по группе (СУММА, КОЛИЧЕСТВО, МАКСИМУМ и т.п.). - Поля вложенных таблиц: когда вы хотите одновременно получить «шапку по группе» и «табличку-детализацию» внутри каждой группы (например, внутри сотрудника показать перечень документов-оснований и суммы по ним). 3) Практический пример логики Допустим, вы хотите увидеть по каждому сотруднику общий остаток к выплате и детализацию, из каких документов он складывается. - На верхнем уровне выбираете: Сотрудник (группировка) и СуммаОстатка (агрегат СУММА). - Детализацию по документам выводите как вложенную таблицу (в ней уже свои поля: ДокументОснование, СуммаСтроки и т.п.). Так вы не нарушите правила: «ДокументОснование» не должен появляться на верхнем уровне без агрегирования, но спокойно живет внутри вложенной таблицы. 4) Частые ошибки, которые ловит это правило - Попытка вывести в группировке «Документ», «Подразделение», «Комментарий» и т.п. без агрегирования - запрос становится неоднозначным. - Попытка «обойти» правило перестановкой полей местами - не работает, потому что важна не позиция, а принадлежность поля к одной из допустимых категорий. 5) Как это помогает именно по «Ведомости в кассу» Сводные запросы с группировкой помогают быстро увидеть: - кто попал/не попал в подбор; - где сумма уменьшается из-за уже оформленных выплат; - откуда тянутся остатки прошлых периодов; а вложенная детализация - показать документы и строки, которые сформировали итоговую сумму.