Разработка и Конфигурация · 10 мин
Как удалить дубли в табличной части 1С
Как найти и удалить дубли строк в табличной части документа 1С: обработка запросом, циклом, через Свернуть(). Примеры кода, проверка результата и типичные ошибки.
Дубли строк в табличной части документа — частая проблема: одна и та же номенклатура добавлена дважды, товар продублировался при загрузке из Excel или обмена с другой системой, пользователь случайно нажал «Добавить» лишний раз. Такие повторы искажают количество и суммы в документе, приводят к ошибкам при проведении и расхождениям в отчётах.
Удалить дубли можно несколькими способами: вручную через интерфейс, штатными средствами типовых конфигураций, программно — через запрос, цикл по строкам или метод Свернуть() таблицы значений. Выбор зависит от объёма данных, того, нужна ли разовая чистка или постоянная защита от повторов, и от того, есть ли у вас доступ к конфигуратору.
Важно сразу определить, что считать дублем. Иногда совпадения по номенклатуре достаточно, а иногда строки различаются характеристикой, серией или складом — и тогда это не дубли, а легитимные разные позиции. Ошибочное удаление «не тех» строк испортит документ, поэтому критерий дубля нужно зафиксировать до начала чистки.
Что считать дублем и как найти повторы
Дубль — это строка табличной части, полностью или по заданному набору колонок совпадающая с другой строкой. Критерий определяется прикладной логикой: для документа реализации чаще всего дубль — это совпадение по номенклатуре и характеристике, для заказа с учётом серий — по номенклатуре, характеристике и серии.
Если строки отличаются складом, ценой или ставкой НДС, механическое удаление одной из них может быть ошибкой. Например, один товар отгружается с двух складов — это две осмысленные строки. Поэтому сначала проанализируйте: посмотрите, какие колонки реально различаются у повторяющихся позиций.
Быстро найти повторы в интерфейсе можно сортировкой: щёлкните по заголовку колонки «Номенклатура» — одинаковые позиции встанут рядом. Для больших таблиц удобнее вывести табличную часть в табличный документ или использовать консоль запросов с группировкой и подсчётом количества строк.
Можно удалять любую из копий, итоги не изменятся
Проверьте характеристику, серию, склад и цену перед удалением
Строки могут быть осмысленными, объединять нельзя
Проверьте обмен, загрузку из Excel или права пользователей
Ручное удаление дублей через интерфейс
Для небольшого числа повторов достаточно ручной чистки. Откройте документ, отсортируйте табличную часть по номенклатуре, найдите повторяющиеся строки и удалите лишние клавишей Delete или кнопкой «Удалить» в меню табличной части. После удаления проверьте итоговые количество и сумму документа.
При ручном удалении решите, что делать с количеством: если товар продублирован случайно, просто удалите строку; если это одна позиция, разбитая на две строки, возможно, нужно не удалить, а сложить количество в одну строку. Иначе документ потеряет часть товара.
Штатные средства типовых конфигураций
Во многих типовых конфигурациях (Управление торговлей, ERP, Комплексная автоматизация) в табличных частях товарных документов есть встроенные механизмы работы со строками: групповое изменение, заполнение по отбору, а в некоторых формах — автоматическое объединение одинаковых позиций при подборе. Проверьте меню «Ещё» табличной части и команду «Изменить» — там может быть групповая обработка строк.
Также в типовых решениях есть универсальная обработка «Групповое изменение реквизитов», но она работает с реквизитами объектов, а не удаляет строки табличных частей. Для массовой чистки табличных частей обычно используют программные способы или внешние обработки.
Программное удаление дублей через цикл
Классический способ — перебрать строки табличной части и удалить те, для которых уже встречалась строка с таким же набором ключевых полей. Удобно использовать соответствие как «реестр» встреченных комбинаций.
Критерии = Новый Соответствие;
Индекс = Объект.Товары.Количество() - 1;
Пока Индекс >= 0 Цикл
Строка = Объект.Товары[Индекс];
Ключ = Строка(Строка.Номенклатура) + "|" + Строка(Строка.Характеристика);
Если Критерии[Ключ] = Неопределено Тогда
Критерии.Вставить(Ключ, Истина);
Иначе
Объект.Товары.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Обход идёт с конца таблицы, чтобы удаление строк не сбивало индексацию. В ключ включайте только те колонки, которые определяют дубль: если добавить цену, строки с разной ценой сохранятся; если убрать характеристику — схлопнутся разные модификации товара.
Удаление дублей с суммированием количества
Если дубли нужно не просто удалить, а объединить с суммированием количества и суммы, логика меняется: при нахождении повтора значения прибавляются к первой строке, а текущая удаляется. Для этого в соответствии храните не признак, а ссылку на первую строку с таким ключом.
Удаление дублей через Свернуть() и запрос
Если табличную часть нужно полностью свернуть по набору колонок с суммированием числовых, удобен метод Свернуть() таблицы значений:
ТЗ = Объект.Товары.Выгрузить();
ТЗ.Свернуть("Номенклатура, Характеристика, Цена", "Количество, Сумма");
Объект.Товары.Загрузить(ТЗ);
У способа есть ограничение: все колонки, не указанные ни в измерениях, ни в суммируемых ресурсах, будут потеряны (например, ставка НДС, если её не включить в первый параметр). Поэтому перечисляйте в первом параметре все значимые несуммируемые колонки.
Альтернатива — запрос с группировкой по табличной части конкретного документа. Он удобен, когда нужно сначала только найти дубли, не меняя данные:
ВЫБРАТЬ
Товары.Номенклатура,
КОЛИЧЕСТВО(Товары.НомерСтроки) КАК ЧислоСтрок
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Товары.НомерСтроки) > 1
Сравнение способов
Подходит для нескольких строк и разовой чистки; не масштабируется на сотни документов
Гибкий контроль критерия дубля и логики объединения; требует доступа к коду или внешней обработки
Быстрый код для полной свёртки с суммированием; теряет колонки, не указанные в параметрах
Лучший вариант для поиска и анализа дублей без изменения данных
Проверка результата и типичные ошибки
После чистки проверьте документ: итоговые количество и сумма должны соответствовать ожиданиям, документ должен проводиться без ошибок, а связанные отчёты (по остаткам, по продажам) — показывать корректные данные. Если чистка выполнялась обработкой по многим документам, выборочно откройте несколько и сверьте вручную.
Как проверить результат
Запрос с группировкой не возвращает строк
Дубли остались — проверьте критерий, возможно, строки отличаются скрытым полем
Количество и сумма соответствуют первичным документам
Сумма уменьшилась — удалили строки вместо объединения
Документ проводится без сообщений об ошибках
Ошибки проведения — например, нарушена связь со скидками или НДС
Как предотвратить появление дублей
Разовая чистка не решает проблему, если дубли появляются систематически. Найдите источник: загрузка из Excel без проверки повторов, обмен с сайтом или другой базой, ручной ввод без контроля. Чаще всего виновата загрузка — добавьте в неё проверку: перед добавлением строки искать существующую с таким же ключом и суммировать количество.
Программная защита на уровне конфигурации — проверка в обработчике ПередЗаписью или ОбработкаПроверкиЗаполнения документа: при обнаружении дублей отказывать в записи с понятным сообщением пользователю. Это жёсткий, но надёжный барьер против повторов.
Как выбрать действие
Что важно запомнить
Сначала определите критерий дубля и сделайте копию данных. Для поиска используйте запрос с группировкой, для удаления — цикл с конца таблицы или Свернуть(), для объединения — суммирование в первую строку. После чистки проверьте итоги и проведение, а при повторяющихся дублях устраняйте источник и добавляйте контроль при записи.
Частые вопросы
Можно ли удалить дубли без доступа к конфигуратору?
Да. Ручное удаление и штатные команды табличной части доступны обычному пользователю. Для программной чистки без изменения конфигурации подойдёт внешняя обработка, запускаемая через «Файл — Открыть», если у вас есть права на интерактивное открытие внешних обработок.
Что делать, если строки отличаются только ценой?
Это не однозначный дубль. Решите по смыслу документа: если цена должна быть единой, оставьте одну строку с корректной ценой и суммарным количеством; если разные цены легитимны (например, разные партии), строки трогать нельзя.
Почему после Свернуть() пропала ставка НДС?
Метод Свернуть() сохраняет только колонки, указанные в параметрах: группировочные и суммируемые. Все остальные колонки удаляются. Добавьте ставку НДС и другие нужные поля в первый параметр метода.
Как удалить дубли сразу во многих документах?
Нужна обработка: запросом выберите документы, у которых в табличной части есть повторы, затем в цикле открывайте каждый объект, чистите табличную часть и записывайте. Работайте в транзакции или с протоколом, чтобы при ошибке понять, на каком документе остановились, и обязательно протестируйте на копии базы.
Опасно ли чистить дубли в уже проведённых документах?
Да, есть риски: изменятся движения по регистрам, могут разойтись данные со связанными документами (счетами-фактурами, корректировками) и с уже сданной отчётностью. Безопасный порядок: копия базы, чистка, перепроведение, сверка отчётов, и только потом повтор в рабочей базе.
Как запретить пользователям вводить одинаковые строки?
Добавьте в модуль объекта документа проверку в обработчике ОбработкаПроверкиЗаполнения: при нахождении двух строк с одинаковым ключом выводите сообщение и устанавливайте Отказ = Истина. Пользователь не сможет провести документ, пока не устранит повтор.