1с удалить дубли из массива

Обновлено: 07.07.2024

Столкнулся с задачей удаления дублей строк в таблице значений, при этом важным критерием для меня является производительность, из-за большых размеров таблиц значений. Написал процедуру, возможно эта процедура кому-нибудь еще будет полезной.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

И какая получилась производительность? С какими вариантами сравнивали? Для Каждого Колонка Из БуфернаяТаблицаДанных.Колон и ки Цикл ivangrant; user645801_yyyuuu123q; SP2000; Zircool; Vorobyov; + 5 – Ответить Нужно пару слов про идею и алгоритм написать, а не только текст процедуры. Чем Ваш вариант лучше того, что я сейчас сяду и напишу за 10 минут на коленке? Алгоритм писателя на 1С 77. Проще всего:
ВЫБРАТЬ * ПОМЕСТИТЬ ВременнаяТаблица ИЗ &Таблица КАК ВременнаяТаблица;
ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ ВременнаяТаблица ivangrant; alsegor; 2711640; Bublik2011; Kserken; Азбука Морзе; higs; + 7 – Ответить (4) CagoBHuK, нужно иметь в виду, что добавится передача/возврат данных на SQL. (6) В данном случае речь шла о таблице значений, которую на клиенте Вы никак не сможете получить. Использование метода "Скопировать" доступно только для универсальных коллекций значений, которые не могут существовать на клиенте. Иными словами сам код обработки предполагает серверный вызов. (8) CagoBHuK, я и не спорю относительно серверного (сервера 1С) вызова, добавится вызов именно SQL сервера. (9) Вы считаете, что он будет длиться дольше, чем представленный алгоритм пересчета?

(4) CagoBHuK, это при условии что все поля строк одинаковые.

Если, например, в таблице 4 колонки и дубли удалять надо только по 3 колонкам, то вариант стар как мир и даже описан в синтакс-помощнике (осторожно, код в стиле "капитан очевидность"):

Предложу свой вариант, немного улучшенный (12) больше универсальности, про быстродействие так же не могу сказать, тесты не проводил:

Можно использовать и запрос, спорить не буду. Таблицу нужно будет подготовить - описать типы колонок, и также добавить колонку, по которой будет происходить суммирование.
Далее почти по тексту, только нужно будет выбирать не различные, а группировать по нужному списку колонок (строить запрос динимически), и добавить в запрос условие "Имеющие сумма(КолонкаСуммирования) = 1". (просто различные использовать нельзя из-за значений в других колонках таблицы). Далее эту сгруппированную временную таблицу нужно будет джойнить с первоначальной временной таблицей, в условиях связи прописывать равенство по выбранным полям (строить условие динамически), плюс нужно будет в случае если нужно не удалить все дублирующие строки, а оставить по одной из удаляемых тоже это предусмотреть.

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

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

Я бы еще подумал над добавлением индекса(ов) в таблицу значений (по которой выполняется поиск).

МассивДублей = Новый Массив;
МассивСотрудников = Новый Массив; // проверяемое на дубль значение

Для каждого Строка Из ТЗНачисления Цикл

Если Строка.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.СдельныйЗаработок Тогда // критерий сравнения на дубль, может быть любой

Если Элем = Неопределено Тогда // это первое вхождение проверяемого на дубль сотрудника

Иначе // а это - уже мы дубль встретили, по данному сотруднику и по данному критерию проверки на дубль


1С 8.3 Удаление дублирующих строк в Таблице значений


Данная функция принимает таблицу значений (с любой структурой), а возвращает обработанную таблицу с удаленными одинаковыми строками. В параметр КолонкиТЗ можно передать колонки (через запятую), по которым нужно выполнять проверку и удаление строк-дублей. Если параметр пустой, то метод сворачивает ТЗ по всем колонкам.

Функция УдалениеДублирующихСтрокТЗ ( ТЗ , КолонкиТЗ = "" ) Экспорт

Если ПустаяСтрока ( КолонкиТЗ ) Тогда // свертка ТЗ по всем колонкам

Для Каждого ТЗКолонка Из ТЗ . Колонки Цикл
КолонкиТЗ = КолонкиТЗ + ?( ПустаяСтрока ( КолонкиТЗ ), "" , "," ) + ТЗКолонка . Имя ;
КонецЦикла;
КопияТЗ = ТЗ . Скопировать ();
КопияТЗ . Свернуть ( КолонкиТЗ );

КолонкиЗапроса = "ТЗ." + СтрЗаменить ( КолонкиТЗ , "," , ",ТЗ." );

Запрос = Новый Запрос ;
Запрос . Текст = "ВЫБРАТЬ
| " + КолонкиЗапроса + "
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + СтрЗаменить ( КолонкиЗапроса , "ТЗ." , "ВТ_ТЗ." ) + "
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
|" ;

Запрос . УстановитьПараметр ( "ТЗ" , ТЗ );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда
ТаблицаЗапроса = РезультатЗапроса . Выгрузить ();

КопияТЗ = ТЗ . СкопироватьКолонки ();
Для Каждого СтрокаТЗ Из ТаблицаЗапроса Цикл
ОтборСтруктура = Новый Структура ( КолонкиТЗ );
ЗаполнитьЗначенияСвойств ( ОтборСтруктура , СтрокаТЗ );

ОтборТЗ = ТЗ . НайтиСтроки ( ОтборСтруктура );
Для Каждого СтрокаОтбораТЗ Из ОтборТЗ Цикл

НоваяСтрокаТЗ = КопияТЗ . Добавить ();
ЗаполнитьЗначенияСвойств ( НоваяСтрокаТЗ , СтрокаОтбораТЗ );
Прервать;

КонецЦикла;
КонецЦикла;
Иначе
КопияТЗ = ТЗ ;
КонецЕсли;

ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "красный" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "фиолетовый" ;

УдалениеДублирующихСтрокТЗ ( ТЗ , "Животное,Цвет" );



ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

УдалениеДублирующихСтрокТЗ ( ТЗ , "Животное,Цвет" );



ТЗ = Новый ТаблицаЗначений ;

// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ТЗ . Колонки . Добавить ( "Животное" , НовСтрока );
ТЗ . Колонки . Добавить ( "Размер" , НовСтрока );
ТЗ . Колонки . Добавить ( "Цвет" , НовСтрока );

// Добавляем строки в таблицу значений
Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "большой" ;
Стр . Цвет = "зеленый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить (); //дубль
Стр . Животное = "Слон" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "желтый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "здоровый" ;
Стр . Цвет = "розовый" ;

Стр = ТЗ . Добавить ();
Стр . Животное = "Тигр" ;
Стр . Размер = "маленький" ;
Стр . Цвет = "черный" ;

Стр = ТЗ . Добавить (); //дубль т.к. размер не учитывается
Стр . Животное = "Тигр" ;
Стр . Размер = "огромный" ;
Стр . Цвет = "черный" ;

Анна Викулина

При работе с программой 1С может так случиться, что пользователь по ошибке вносит одинаковые элементы в справочники программы. Это создает неудобства в работе и путаницу в данных. Чаще всего подобные накладки случаются со справочниками «Контрагенты» и «Номенклатура». Они достаточно объемные, поэтому в них могут и кроются такие недочеты.

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

Для поиска и удаления дублей, в программе 1С Бухгалтерия 8.3 предусмотрена одноименная обработка. Рассмотрим принцип ее работы.

Обработка поиск и удаление дублей

Открыть обработку можно в разделе меню «Администрирование» - «Обслуживание» перейдя по гиперссылке «Поиск и удаление дублей».

В открывшемся окне необходимо указать область поиска, заполнив поле «Искать в:».

Из предложенного списка выбираем нужную область поиска дублей. В нашем примере проверим сначала справочник «Контрагенты».

Перейдя по гиперссылке в поле «Сравнить», задаем правила поиска дублей для выбранного объекта. По умолчанию установлен поиск по наименованию – по схожим словам. Но пользователь может написать разные наименования, например, полное и сокращенное – ИП или Индивидуальный предприниматель, полные данные контрагента (физического лица) – фамилию, имя, отчество, или указать только инициалы.

В этом случае можно сопоставить элементы по каким-то другим реквизитам. Для справочника «Контрагенты» – это ИНН, КПП, для справочника «Номенклатура» – Артикул и т.п.

После того как условия поиска заданы, нажимаем кнопку «Найти дубли». Программа автоматически составит список из повторяющихся элементов. Выделив элемент в правом окне, видим, что слева отобразилась информация, где он был использован. Рядом с элементом указано количество объектов, где он задействован.

Элемент с наибольшим количеством записей программа автоматически определяет как оригинал, выделив его синей стрелочкой. Если какой-то из объектов мы обрабатывать не будем, галочку с него надо снять. Или если мы хотим изменить объект, на который будут перенесены все данные с другого объекта при его удалении, то отметим его, нажав кнопку «Отметить как оригинал».

После нажатия кнопки «Удалить дубли» программа перенесет все объекты, где был задействован элемент-двойник, на отмеченный объект-оригинал, тем самым объединив их.

Мы можем закрыть обработку или, нажав кнопку «Новый поиск», повторить поиск дулей в других местах программы.

Для примера найдем дубли элементов в справочнике «Номенклатура», проведя сравнение по артикулу и наименованию.

Рис.8 Поиск и удаление дублей в списках номенклатуры

Рис.8 Поиск и удаление дублей в списках номенклатуры

Аналогично предыдущему описанию ищем и удаляем дубли.

Посмотрим, что же происходит с ними в справочнике. Зайдем в справочник «Контрагенты» (раздел меню «Справочники» - «Покупки и продажи»). Дубль-двойник помечен на удаление. Помимо этого мы видим, что контрагент был внесен дважды, но с разным наименованием. Внимательный пользователь бы заметил, что ИНН у элемента двойника выделен красным цветом. В программе имеется контроль совпадений контрагентов по ИНН.

Перейдя в справочник «Номенклатура» (раздел меню «Справочники» - «Покупки и продажа»), выполним поиск по наименованию, т.к. зрительно похожее название почему-то не отображалось. Что мы видим? У одного из элементов справочника перед названием стоит пробел – именно поэтому пользователь не может увидеть этот элемент в списке, просматривая его в алфавитном порядке. Все символы идут обычно в начале списка. Не найдя этот элемент, пользователь создал новый. Такая ситуация встречается довольно часто.

Так, используя штатный функционал программы, можно очистить справочники от таких элементов-двойников. После установки пометки удаления на них, удаление производится обычным способом, через «Удаление помеченных объектов» в разделе меню «Администрирование» - «Сервис». При больших объемах данных периодически можно проверять справочники во избежание путаницы в учете и захламления информационной базы ненужными элементами.

Часто бывает так, что пользователь, работая с программой 1С может внести ряд одинаковых элементов в справочник. Это создает ряд неудобств для работы, а главное путаницу в данных. Самые частые проблемы с дублями встречаются в справочниках «Контрагенты» и «Номенклатура». Связано это с их большим объемом.

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

Для того чтобы искать и удалять дубли в программе 1С Бухгалтерия есть одноимённая обработка. Давайте рассмотрим, как она работает.

Удаление, поиск и обработка дублирующихся элементов

Для того, чтобы открыть обработку, вам нужно перейти в раздел «Администрирование», затем выбрать «Обслуживание» и перейти по ссылке «Поиск и удаление дублей».


Перед вами откроется окно, где нужно будет указать область поиска. Указывается она заполнением поля «Искать в:»


В появившемся списке вам нужно выбрать область, в которой будете искать дубли. Мы выбираем справочник «Контрагенты».


Теперь нужно перейти по ссылке в раздел «Сравнить» и задать правило для поиска дублей конкретному объекту. По умолчанию стоит поиск по имени или схожим словам. Вы можете написать другие наименования: ИП, данные контрагента, инициалы и тому подобное.

Удобнее всего искать дубли через другие реквизиты, нежели имя. Например, для справочника «Контрагенты» чаще всего используют ИНН и КПП, а для «Номенклатуры» используют артикул.


Как только вы задали все условия поиска вам нужно нажать кнопку «Найти дубли». Программа начнет составлять список из всех повторяющихся элементов. Вам нужно будет выбрать элемент в правом окне, чтобы увидеть информацию о том, где он использован и число объектов, где данный элемент задействован.


Тот элемент, который имеет наибольшее число записей, отмечается как оригинальный и выделяется синей стрелочкой. Если какие-то объекты вы не планируете обрабатывать, то снимите с него галочку. Если вы хотите изменить объект при удалении, то нажмите на кнопку «Отметить, как оригинал».


Как только вы нажмете кнопку «Удалить дубли», то программа сразу перенесет все объекты, где были задействованы двойники на оригинал. Таким образом документы с «двойниками» будут объединены с оригинальным документом.


Теперь вы можете закрыть обработку или начать поиск дублирующих документов в другом месте. Для этого нужно нажать кнопку «Новый поиск».

Давайте теперь найдем дубли элементов, которые находятся в справочнике «Номенклатура». Будем сравнивать в данном случае их по наименованию и артикулу.


Как и в прошлый раз нам нужно найти и удалить дубли.


Теперь давайте посмотрим, что с дублями произошло в справочнике. Для этого выберете «Меню – Справочники – Покупки и продажи». Вы можете заметить, что дубль был помечен на удаление. Кроме того, можно заметить, что ИНН у «двойников» выделен ярко красным. Дело в том, что программа имеет контроль совпадений по ИНН.


Теперь нужно перейти в «Номенклатуру» для этого выбирайте «Меню – Справочники – Покупки и продажа» и выполнить поиск по названию, так как зрительно похожие название не отображаются. Если присмотреться внимательно, то можно заметить, что у одного из элементов перед названием стоит пробел. Из-за этого пользователь не может найти его в списке и создал новый элемент. Причем эта ситуация встречается довольно часто.


Теперь вы знаете, что, используя лишь штатные функции программы, можно привести базы данных в порядок и очистить их от «двойников». После того, как вы пометите их на удаление, то удалить их можно обычным способом используя раздел «Удаление помеченных объектов» (он находится в Меню – Администрирование – Сервис). Периодически проверяйте свои справочники чтобы избежать захламления и путаницы с ненужными элементами в информационной базе.

Читайте также: