Как удалить дублирующие строки в табличной части справочника в 1С?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

Проанализируем ситуацию, с которой часто сталкиваются пользователи и разработчики при работе с конфигурациями на базе 1С. При попытке массового изменения или даже простого пересохранения карточки номенклатуры (например, в конфигурации «Общепит» или «Бухгалтерия предприятия») система может выдавать ошибку: «Есть дублирование единицы измерения "шт", в строке 2!». Запись объекта при этом блокируется.

Эта проблема возникает из-за того, что в табличной части справочника (в данном случае это табличная часть ЕдиницыИзмерения) образовались дублирующиеся строки. Платформа проверяет уникальность этих строк перед сохранением, чтобы избежать конфликтов коэффициентов пересчета. Если элементов с такой ошибкой больше тысячи, ручное удаление, даже с помощью специальных редакторов объектов, займет огромное количество времени. Давайте разберем по шагам, как можно массово и быстро решить эту проблему.

Почему не поможет типовая обработка «Поиск и удаление дублей»?

Рассмотрим подробнее логику работы встроенных инструментов. Многие пользователи сразу вспоминают про стандартную обработку 1С по поиску и удалению дублей. Однако в данном случае она окажется бесполезной.

Дело в том, что типовая обработка предназначена для слияния дублирующихся ссылок (самих элементов справочников — например, двух одинаковых карточек товара). В нашем же случае задвоились именно строки внутри табличной части одного конкретного элемента, что можно наглядно увидеть через универсальные редакторы справочников. Типовой функционал поиска дублей не умеет анализировать и схлопывать строки внутри табличных частей. Нам потребуются другие подходы.

Решение 1: Удаление строк через произвольный алгоритм

Посмотрим на пример использования обработки «Групповое изменение реквизитов». Это мощный инструмент, который позволяет выполнять произвольный программный код для выбранных элементов. Для использования этого метода вам потребуются полные права администратора.

  1. Откройте обработку «Групповое изменение реквизитов».
  2. Выберите нужный справочник (Номенклатура) и настройте отбор, чтобы получить только проблемные элементы.
  3. Перейдите в «Дополнительные параметры» (кнопка внизу формы).
  4. Установите флажок «Режим разработчика» (или «Выполнять произвольный алгоритм»).
  5. В появившемся текстовом поле введите код алгоритма.

В контексте выполнения данного алгоритма обрабатываемый элемент доступен через переменную Объект. Напишем код, который обойдет все строки табличной части ЕдиницыИзмерения, найдет дубли и удалит их:


// Получаем табличную часть обрабатываемого объекта
ТабличнаяЧасть = Объект.ЕдиницыИзмерения; 
УникальныеЗначения = Новый Соответствие;
СтрокиКУдалению = Новый Массив;

// Проходим по всем строкам табличной части
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    // Проверяем, встречалась ли нам уже такая единица измерения
    Если УникальныеЗначения.Получить(СтрокаТЧ.ЕдиницаИзмерения) = Неопределено Тогда
        // Запоминаем первую встретившуюся единицу измерения
        УникальныеЗначения.Вставить(СтрокаТЧ.ЕдиницаИзмерения, Истина);
    Иначе
        // Если такая единица уже есть в соответствии, помечаем текущую строку на удаление
        СтрокиКУдалению.Добавить(СтрокаТЧ);
    КонецЕсли;
КонецЦикла;

// Удаляем все собранные дублирующие строки
Для Каждого СтрУдаления Из СтрокиКУдалению Цикл
    ТабличнаяЧасть.Удалить(СтрУдаления);
КонецЦикла;

При выполнении этого кода система оставит только первое вхождение единицы измерения (например, первые «шт»), а все последующие дублирующие строки удалит. После этого объект успешно запишется без ошибок.

Решение 2: Обход проверок при записи (отключение бизнес-логики)

Выясним, что делать, если ваша задача — не исправить сами единицы измерения, а просто массово изменить другой реквизит номенклатуры (например, ставку НДС), но ошибка наличия дублей не дает этого сделать. В таком случае мы можем заставить систему проигнорировать проверки.

Для этого в том же произвольном алгоритме групповой обработки достаточно написать всего одну строчку:

Объект.ОбменДанными.Загрузка = Истина;

Свойство Загрузка объекта ОбменДанными отключает выполнение стандартных проверок платформы и конфигурации перед записью (именно этот механизм используется при обмене данными между базами, чтобы предотвратить блокировку загрузки из-за неконсистентных данных). Объект сохранится вместе со старыми дублями в табличной части, но при этом ваши новые реквизиты будут успешно применены, а ошибка не появится.

Решение 3: Перезагрузка данных через табличный документ (Excel)

Разберем еще один метод, который не требует навыков программирования и использования произвольных алгоритмов. Мы можем очистить табличные части с помощью стандартной обработки «Загрузка данных из табличного документа» или более универсальных загрузчиков из Excel.

  1. Сформируйте отчет (например, через «Универсальный отчет») или используйте специальные обработки для экспорта справочников в Excel, чтобы вывести список проблемной номенклатуры и только одну, правильную единицу измерения для каждой позиции.
  2. Сохраните этот список в формате Excel или просто скопируйте в буфер обмена.
  3. Откройте обработку «Загрузка данных из табличного документа» в режиме загрузки в табличную часть.
  4. Вставьте ваши данные и обязательно установите в настройках флаг «Очищать табличную часть перед загрузкой».
  5. Запустите загрузку.

В результате программа автоматически сотрет все старые данные в табличной части (включая все дубли) и запишет туда «чистые» строки из вашей таблицы. Этот подход отлично работает, если структура единиц измерения простая и ее легко выгрузить в плоскую таблицу.

Таким образом, мы рассмотрели несколько эффективных инструментов для решения проблемы задвоения строк в табличных частях справочников. Выбор конкретного метода зависит от ваших прав в базе, навыков программирования и конечной цели обработки данных.

← На главную