Работа с языком запросов в платформе 1С:Предприятие часто требует манипуляций с агрегированными данными. Однако нередки ситуации, когда разработчику необходимо получить детальные записи из уже сгруппированного результата или отменить автоматическую агрегацию, которую система применила к виртуальной таблице. Стандартный подход «развернуть» данные назад требует понимания внутреннего механизма выполнения запросов и использования специальных операторов.
В этой статье мы детально разберем методы, позволяющие убрать группировку в запросе. Мы рассмотрим как работу с ключевыми словами в операторах ВЫБРАТЬ, так и специфические конструкции для работы с итогами. Понимание этих нюансов критически важно для оптимизации производительности сложных отчетов и анализа данных на уровне отдельных документов.
Природа группировки в языке запросов 1С
Группировка в запросах 1С — это механизм объединения строк исходной таблицы на основе значений указанных полей. Когда вы указываете поле в секции Группировка (или используете агрегатные функции), движок запросов сворачивает множество записей в одну строку итога. Это стандартное поведение реляционных баз данных, которое позволяет быстро получать суммы, количества и средние значения.
Проблема возникает, когда вам нужно увидеть исходные данные, стоящие за этой суммой. Например, вы получили итог по контрагенту, но вам нужно увидеть список всех накладных, из которых сложилась эта сумма. Просто «выключить» группировку в уже выполненном запросе нельзя, так как исходные строки были отброшены на этапе агрегации. Необходимо изменить логику формирования выборки.
Важно различать явную группировку, которую вы прописали в коде, и неявную, возникающую при обращении к виртуальным таблицам итогов или остатков. В первом случае решение лежит в плоскости редактирования текста запроса. Во втором — требуется понимание параметров виртуальных таблиц и использование специальных операторов для «разворачивания» данных.
⚠️ Внимание: Попытка выбрать все поля из сгруппированного запроса без указания их в секции группировки приведет к ошибке выполнения. Система не сможет определить, какое значение из множества свернутых строк подставить в результирующую выборку.
Использование оператора УНИЧТОЖЕНИЕ ИТОГОВ
Для работы с виртуальными таблицами, которые по умолчанию возвращают свернутые данные (например, РегистрНакопления.Продажи.Остатки), в языке запросов 1С предусмотрен специальный оператор УНИЧТОЖЕНИЕ ИТОГОВ. Он позволяет преобразовать итоговую строку обратно в набор детальных записей регистра, из которых этот итог был сформирован.
Этот оператор применяется к результату предыдущего запроса или к виртуальной таблице. Синтаксически он размещается перед основным оператором ВЫБРАТЬ. При его использовании система игнорирует параметры периодичности и измерений, которые обычно вызывают группировку, и выгружает все записи регистра, участвовавшие в расчете остатка или оборота.
УНИЧТОЖЕНИЕ ИТОГОВ
ВЫБРАТЬ
ПродажиОстатки.Регистратор,
ПродажиОстатки.Номенклатура,
ПродажиОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.Продажи.Остатки(&Начало, &Конец) КАК ПродажиОстатки
Использование УНИЧТОЖЕНИЕ ИТОГОВ существенно влияет на производительность. Если обычный запрос остатков выполняется быстро благодаря предварительно рассчитанным итогам, то уничтожение итогов заставляет систему сканировать первичные записи регистра. Это может быть ресурсоемкой операцией на больших объемах данных.
Используйте оператор УНИЧТОЖЕНИЕ ИТОГОВ только тогда, когда вам действительно нужны первичные документы. Для простых проверок наличия товара лучше использовать стандартные остатки.
Работа с ключевыми словами РАЗЛИЧНЫЕ и ВСЕ
В стандартных запросах к обычным таблицам (справочники, документы) группировка часто возникает из-за использования агрегатных функций (СУММА, КОЛИЧЕСТВО) или явного указания секции Группировка. Чтобы получить детализацию, необходимо исключить эти элементы из запроса. Однако иногда требуется получить уникальные значения без полной детализации, но и без глубокой агрегации.
Ключевое слово РАЗЛИЧНЫЕ (или DISTINCT в некоторых контекстах) позволяет выбрать уникальные комбинации полей. Это не совсем отмена группировки, а скорее способ убрать дубликаты, которые могут возникать при соединениях таблиц. Если же вам нужно вернуть абсолютно все строки, включая дубли, убедитесь, что в запросе не используется РАЗЛИЧНЫЕ и нет агрегатных функций.
В некоторых версиях платформы и специфических задачах используется модификатор ВСЕ в контексте соединений или подзапросов, чтобы гарантировать получение полного набора данных без фильтрации или сворачивания. Однако основным методом «снятия» группировки остается удаление полей из секции Группировка и отказ от агрегатных функций в списке выбора.
- 🔍 Проверяйте секцию
Группировка: если она есть, удалите её, чтобы вернуть детальные записи. - 🔍 Убирайте агрегатные функции: замените
СУММА(Сумма)на простоСумма. - 🔍 Избегайте
РАЗЛИЧНЫЕ: если нужны все строки исходной таблицы, даже повторяющиеся.
Особенности работы с виртуальными таблицами
Виртуальные таблицы в 1С — это мощный инструмент, но их поведение по умолчанию направлено на агрегацию данных. Таблицы остатков, оборотов и срезов последних всегда возвращают данные в свернутом виде по измерениям регистра. Параметры, передаваемые в такую таблицу (например, период), определяют глубину группировки.
Чтобы получить детальные данные из виртуальной таблицы без использования оператора УНИЧТОЖЕНИЕ ИТОГОВ, иногда приходится обращаться к физической таблице регистра напрямую. Физическая таблица (например, РегистрНакопления.Продажи) хранит каждое движение документа отдельной строкой. Запрос к ней никогда не группирует данные автоматически, если вы сами этого не попросите.
Однако прямой запрос к физической таблице лишает вас преимуществ оптимизации, заложенных в механизм итогов. Поэтому выбор между виртуальной таблицей с уничтожением итогов и прямой выборкой из физической таблицы — это всегда компромисс между удобством синтаксиса и производительностью выполнения.
| Тип источника | Группировка по умолчанию | Производительность | Способ получения деталей |
|---|---|---|---|
| Виртуальная таблица остатков | Да (по измерениям) | Высокая | Оператор УНИЧТОЖЕНИЕ ИТОГОВ |
| Физическая таблица регистра | Нет | Зависит от индексов | Обычный запрос ВЫБРАТЬ |
| Виртуальная таблица среза последних | Да (по измерениям) | Высокая | Запрос к истории изменений |
| Обычная таблица документа | Нет | Средняя | Не требуется (данные детальные) |
⚠️ Внимание: При использовании виртуальных таблиц с параметрами периода убедитесь, что период охватывает все необходимые данные. Сужение периода может искусственно «обрезать» историю движений, которую вы пытаетесь восстановить.
Анализ плана выполнения запроса
Понять, как именно система обрабатывает ваш запрос и где происходит группировка, помогает анализ плана выполнения. В конфигураторе 1С при отладке запроса можно увидеть этапы обработки данных. Если вы видите оператор Группировка или Агрегация в плане, значит, данные сворачиваются именно на этом этапе.
Если ваша цель — убрать группировку, но запрос продолжает работать медленно или выдавать неверные результаты, проверьте наличие неявных группировок в подзапросах. Часто разработчики вкладывают один запрос в другой, и внутренний запрос уже возвращает сгруппированные данные, которые внешний запрос не может «развернуть».
Используйте консоль запросов для экспериментов. Попробуйте выполнить запрос к физической таблице и сравните количество строк с результатом запроса к виртуальной таблице. Разница в количестве строк покажет степень агрегации, примененной системой.
Что такое хеширование в плане выполнения?
Если в плане выполнения вы видите операцию "Хеширование", это часто означает, что система группирует данные в оперативной памяти. Это может быть признаком отсутствия подходящих индексов для сортировки и группировки на уровне СУБД.
Типичные ошибки при снятии группировки
Одна из самых частых ошибок — попытка выбрать поля, не входящие в измерения регистра, при использовании виртуальных таблиц. Например, при запросе остатков нельзя просто так выбрать поле «Комментарий» из документа-регистратора, если оно не является измерением или ресурсом, участвующим в расчете. Это вызовет ошибку или потребует дополнительного соединения.
Другая распространенная проблема — потеря контекста при использовании УНИЧТОЖЕНИЕ ИТОГОВ. Этот оператор возвращает все движения, сформировавшие остаток, но не всегда сохраняет порядок или контекст, ожидаемый пользователем. Может потребоваться дополнительная сортировка результата по дате или номеру документа.
Также стоит помнить о правах доступа. При переходе от агрегированных данных к детальным записям система проверки прав доступа (RLS) может начать фильтровать строки более строго. То, что было видно в виде общей суммы, может стать недоступным при попытке увидеть конкретные документы, если у пользователя нет прав на чтение этих объектов.
- ❌ Ошибка типов: попытка сложить строковые поля при снятии группировки.
- ❌ Потеря данных: фильтрация в секции
ГДЕприменяется до группировки, что может отсечь нужные детали. - ❌ Дубликаты: при соединении с таблицами документов без правильных ключей количество строк может вырасти экспоненциально.
Всегда проверяйте права доступа пользователя при переходе от итоговых данных к детальным записям. RLS может скрыть часть строк, делая анализ неполным.
Оптимизация и производительность
Отказ от группировки и выборка детальных записей всегда нагружают систему сильнее, чем работа с итогами. База данных должна прочитать и передать клиенту значительно больший объем информации. Поэтому критически важно использовать индексы по полям, участвующим в отборе и сортировке детальных записей.
Если объем данных слишком велик, рассмотрите возможность использования временных таблиц. Сначала отберите необходимые регистраторы или ключевые поля в таблицу значений, а затем делайте детальный запрос только по этому ограниченному набору. Это снизит нагрузку на сервер 1С и СУБД.
Помните, что интерфейс тоже имеет значение. Вывод тысяч строк детальных данных в форму может «заморозить» клиентское приложение. Используйте pagination (постраничный вывод) или ограничение количества записей (ПЕРВЫЕ N) для тестирования и предварительного просмотра.
⚠️ Внимание: Интерфейсы и возможности платформы 1С могут обновляться. Синтаксис операторов остается стабильным, но рекомендации по производительности и новые методы оптимизации могут появляться в новых версиях. Сверяйте информацию с официальными релиз-нотами при работе на свежих платформах.
☑️ Проверка запроса на детализацию
FAQ: Часто задаваемые вопросы
Можно ли убрать группировку в уже выполненном запросе без переписывания кода?
Нет, язык запросов 1С не поддерживает динамическое изменение структуры результата после выполнения. Если запрос вернул сгруппированные данные, исходные строки утрачены. Необходимо изменить текст запроса и выполнить его заново.
В чем разница между УНИЧТОЖЕНИЕ ИТОГОВ и запросом к физической таблице?
УНИЧТОЖЕНИЕ ИТОГОВ работает с механизмом итогов регистра, фильтруя только те движения, которые влияют на конкретный остаток. Запрос к физической таблице выбирает все записи подряд, что может быть избыточно, если вас интересуют только данные, формирующие остаток на конкретную дату.
Почему запрос с удаленной группировкой работает медленнее?
Потому что объем передаваемых данных увеличивается в разы. Вместо одной строки итога система вынуждена читать, обрабатывать и передавать сотни или тысячи строк первичных документов, что требует больше ресурсов процессора и дисковой подсистемы.
Как получить детали, если виртуальная таблица не поддерживает УНИЧТОЖЕНИЕ ИТОГОВ?
Некоторые виртуальные таблицы (например, срезы последних) не поддерживают этот оператор напрямую для всех сценариев. В таком случае необходимо выполнить дополнительный запрос к таблице изменений регистра или к таблице движений, отфильтровав записи по необходимым измерениям и периоду.