Разработка и Конфигурация · 11 мин
Как убрать повторяющиеся строки в запросе 1С
Как убрать дубли строк в запросе 1С: оператор РАЗЛИЧНЫЕ, группировка, итоги и типовые ошибки. Примеры кода и проверка результата для разработчиков 1С.
Дубли строк в результате запроса 1С — одна из самых частых проблем при разработке отчётов и обработок. Они появляются, когда соединяются таблицы с разной детализацией (например, документы с табличными частями), когда в выборку попадают лишние измерения регистра или когда запрос обращается к виртуальной таблице с несколькими записями на один объект.
Платформа 1С предлагает несколько штатных способов устранить повторы: оператор РАЗЛИЧНЫЕ, группировку с агрегатными функциями, итоги по группировкам и фильтрацию уже на этапе соединения таблиц. Выбор зависит от того, что именно нужно получить: уникальный список значений, свёрнутые суммы или строго одну строку на объект.
Ниже разобраны все рабочие способы с примерами кода, условиями выбора и типичными ошибками, которые приводят к задвоению данных даже после «очистки» запроса.
Почему в результате запроса появляются дубли
Прежде чем убирать повторы, полезно понять их источник — от этого зависит правильный способ. Основных причин три.
Первая — соединение таблиц с разной детализацией. Если к документу присоединить его табличную часть, каждая строка табличной части даст отдельную строку результата, и реквизиты шапки будут повторяться. То же происходит при соединении справочника с регистром сведений, где на один элемент приходится несколько записей.
Вторая причина — выборка из виртуальных таблиц регистров. Например, таблица «ОстаткиИОбороты» может вернуть несколько строк на один товар, если в запрос включены лишние измерения или периодичность.
Третья — просто неуникальный набор полей в выборке: вы запрашиваете только склад, а в исходной таблице у склада десять строк с разными товарами. Здесь дубли — не ошибка, а следствие недостаточной детализации выбранных полей.
Проверьте секцию СОЕДИНЕНИЕ и её условие
Проверьте список полей выборки и параметры виртуальной таблицы
Проверьте условие соединения — возможно, оно отсутствует
Способ 1. Оператор РАЗЛИЧНЫЕ — убрать полностью идентичные строки
Самый простой инструмент — ключевое слово РАЗЛИЧНЫЕ, которое ставится сразу после ВЫБРАТЬ. Оно оставляет только уникальные комбинации всех выбранных полей: если две строки совпадают по каждому полю, останется одна.
ВЫБРАТЬ РАЗЛИЧНЫЕ
Склад КАК Склад
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ТоварыРеализации
ГДЕ
ТоварыРеализации.Ссылка.Дата >= &НачалоПериода
Важное ограничение: РАЗЛИЧНЫЕ сравнивает все поля выборки целиком. Если вы выбираете товар и количество, а количество в строках разное, — строки не схлопнутся, даже если товар один. Поэтому перед применением оператора уберите из выборки поля, которые не нужны для итогового результата.
Ещё одно следствие: РАЗЛИЧНЫЕ не выбирает, какую именно строку оставить, — он просто удаляет идентичные копии. Если строки различаются хотя бы одним полем, а вам нужна только одна из них (например, последняя по дате), этот способ не подходит — используйте группировку или срез последних.
Способ 2. Группировка с агрегатными функциями
Когда нужно не просто убрать повторы, а свернуть данные — просуммировать количество, посчитать число строк, взять максимальную дату — применяется конструкция СГРУППИРОВАТЬ ПО. Все поля без агрегатной функции перечисляются в группировке, остальные агрегируются.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(Товары.Количество) КАК Количество,
СУММА(Товары.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
Доступные агрегатные функции: СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ. Конструкция КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле) считает число уникальных значений — это удобно, например, для подсчёта количества разных контрагентов в продажах.
Группировка предпочтительнее РАЗЛИЧНЫЕ, когда строки различаются числовыми полями: она не теряет данные, а осмысленно сворачивает их. Но помните правило: поле либо входит в СГРУППИРОВАТЬ ПО, либо оборачивается агрегатной функцией — иначе запрос не выполнится.
Способ 3. Итоги и обход результата по группировкам
Третий вариант — оставить в запросе детальные строки, а уникальность получить через итоги. Секция ИТОГИ ПО создаёт в результате запроса иерархию: строки группировки и вложенные детальные записи.
ИТОГИ
СУММА(Количество)
ПО
Номенклатура
В коде результат обходится методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) — на верхнем уровне будут только уникальные значения поля группировки, а детали доступны вложенным обходом. Этот способ удобен для отчётов, где нужны и сводные цифры, и расшифровка.
Для СКД (системы компоновки данных) отдельные итоги в тексте запроса обычно не нужны: группировки настраиваются в структуре отчёта, и платформа сама сворачивает строки на уровне вывода. Дубли в СКД чаще лечатся исправлением самого запроса-источника, а не настройками отчёта.
Как убрать дубли при соединении таблиц
Если повторы вызваны соединением, правильнее устранить причину, а не накладывать РАЗЛИЧНЫЕ поверх раздутого результата. Типовые приёмы:
- Уточнить условие соединения. Соединяйте по всем ключевым полям, а не по одному. Соединение регистра сведений со справочником только по владельцу, когда ключ — «владелец + период», гарантированно даст дубли.
- Использовать срез последних. Для периодических регистров сведений берите виртуальную таблицу СрезПоследних с параметром на дату — тогда на каждый ключ придёт ровно одна запись.
- Свернуть правую таблицу до соединения. Вложенным запросом сгруппируйте табличную часть до нужного уровня детализации, а потом соединяйте с шапкой.
- Проверить тип соединения. ВНУТРЕННЕЕ соединение при неуникальном ключе умножает строки с обеих сторон.
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
СвернутыеТовары.СуммаТоваров КАК СуммаТоваров
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
Товары.Ссылка КАК Ссылка,
СУММА(Товары.Сумма) КАК СуммаТоваров
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
СГРУППИРОВАТЬ ПО
Товары.Ссылка
) КАК СвернутыеТовары
ПО Реализация.Ссылка = СвернутыеТовары.Ссылка
- 1Определите, какая таблица даёт кратность строк — временно уберите поля из второй таблицы и сравните результат
- 2Проверьте условие соединения: все ли ключевые поля в нём указаны
- 3Если правая таблица детальнее — сверните её вложенным запросом с группировкой
- 4Для периодических регистров сведений замените основную таблицу на СрезПоследних или СрезПервых
- 5Выполните запрос и убедитесь, что число строк совпадает с ожидаемым количеством объектов
Как выбрать способ и проверить результат
Выбор зависит от цели. Нужен уникальный список значений (например, перечень складов, встречающихся в документах) — достаточно РАЗЛИЧНЫЕ. Нужны свёрнутые показатели — группировка с СУММА или КОЛИЧЕСТВО. Нужны одновременно сводка и расшифровка — итоги с обходом по группировкам. Дубли от соединения — исправление условия соединения или срез последних.
Как выбрать действие
Проверка результата — обязательный шаг. Выполните запрос в консоли запросов и сравните количество строк с контрольным значением: числом документов за период, количеством элементов справочника. Для сумм сверьте итог с типовым отчётом конфигурации — если сумма после группировки изменилась, значит, дубли не убраны, а просуммированы.
Как проверить результат
Совпадает с числом уникальных объектов (документов, элементов)
Строк больше, чем объектов — дубли остались
Совпадают с типовым отчётом конфигурации
Суммы завышены — задвоение ушло в агрегат
Каждое значение ключа встречается один раз
Ключ повторяется — проверяйте соединения и измерения
Типичные ошибки и ограничения
Самая распространённая ошибка — маскировать дубли группировкой с СУММА. Если соединение умножило строки вдвое, сумма тоже удвоится, и отчёт покажет неверные деньги. Сначала устраняйте кратность соединения, потом агрегируйте.
Вторая ошибка — ожидать от РАЗЛИЧНЫЕ выбора «лучшей» строки. Оператор не гарантирует ни порядок, ни выбор конкретной записи из различающихся. Для «одной строки на объект по условию» нужны срез последних, МАКСИМУМ по дате с соединением или нумерация в коде.
Третья — применять РАЗЛИЧНЫЕ к выборке с полями неограниченной длины или ХранилищеЗначения: это может привести к ошибке выполнения запроса, так как такие поля нельзя сравнивать на равенство в этой конструкции.
Частые вопросы
Чем РАЗЛИЧНЫЕ отличается от СГРУППИРОВАТЬ ПО?
РАЗЛИЧНЫЕ удаляет полностью идентичные строки без агрегации. Группировка сворачивает строки по указанным полям и позволяет применять агрегатные функции к остальным. Если агрегаты не нужны, оба варианта дадут похожий результат, но РАЗЛИЧНЫЕ короче в записи.
Почему РАЗЛИЧНЫЕ не убирает дубли в моём запросе?
Строки, которые вы считаете дублями, отличаются хотя бы одним выбранным полем — например, количеством, суммой или невидимым служебным полем. Уберите из выборки лишние поля или перейдите на группировку.
Как оставить только одну строку на объект, например последнюю по дате?
Для регистров сведений используйте СрезПоследних. В произвольном запросе — сгруппируйте по объекту с МАКСИМУМ(Дата), затем соедините результат с исходной таблицей по объекту и этой дате.
Влияет ли РАЗЛИЧНЫЕ на производительность запроса?
Да, оператор требует сортировки или хеширования результата для поиска совпадений. На больших выборках это заметно. Если уникальность можно обеспечить правильным соединением или срезом последних — этот путь обычно быстрее.
Как убрать дубли в отчёте на СКД, не меняя запрос?
Надёжного способа нет: настройки СКД (группировки, отборы) не устраняют задвоение в источнике данных. Исправляйте текст запроса-источника — иначе итоги отчёта останутся неверными даже при «красивом» выводе.
Можно ли посчитать количество уникальных значений в запросе?
Да, конструкцией КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле) внутри группировки. Например, так считают число уникальных контрагентов или номенклатурных позиций в продажах за период.
Что важно запомнить
РАЗЛИЧНЫЕ убирает только полностью идентичные строки, группировка сворачивает данные с агрегацией, а дубли от соединений нужно лечить исправлением условия соединения или срезом последних. Всегда проверяйте результат по количеству строк и контрольным суммам — задвоение, ушедшее в СУММА, искажает отчётность.