1с таблица значений удалить дубликаты
Пытаюсь удалить дублирующие строки в ТЗ (у меня дублирующая строка в данных идет следующей после нужной) : Если Билет1=Билет2 Тогда ТЗ.УдалитьСтроку; Если ТЗ.НомерСтроки <> 0 Тогда z=z+1; Перейти
начало; Не все нужные строки остаются. Может есть другое решение ?
когда мне надо удалить дублерин из ТЗ, я обычно ее тупо сворачиваю и не трачу время на изобретение велосипедов
Сворачивать ТЗ нельзя: 23 поля, пропадет соответствие "Дата вылета-Номер кассы-Пункт Посадки-. -и.т.д"
Делай цикл Для по номеру строк с конца таблицы через ПолучитьСтрокуПоНомеру, а не через ПолучитьСтроку. Удаляй тоже по номеру.
Твоя темя была про удаление строк в документе вчера? Поищи ее - там написал на полстраница текста. для кого интересно?
To <Епрст3>: Как ты себе представляешь, когда сверну все поля ? В поле "Цена Авиабилета" почти через строку идут одинаковые цены: 9600 3400 9600 Не, говорю же, сворачивать нельзя .
кстати, автор, только дятлы для удаления больше, чем одной строки из ТЗ, запускают цикл в прямом направлении, тогда как нормальный программыст идет по строкам в обратном порядке.
To <КонецЦикла> : Читал внимательно все твое, но тем методом часть нужных строк удаляет. Поэтому поднял Новую Тему - может что-то есть проще ?
Какую часть? Может там и ошибка, думай Заполнить надо колонку "Удалить" единицей везде где надо, потом выгрузить нужный блок. если ТЗ большая - работает особенно эффективно
Если поле TICKETNUMB первой строки = полю TICKETNUMB второй строки, вторую строку мне надо УДАЛИТЬ
ДатаВылета|НомерКассы|ПунктПосадки|Сумма 01.01.2007 1 Лондон 200 10.01.2007 1 Америка 200 11.01.2007 1 Васюки 200 01.01.2007 1 Лондон 999 01.01.2007 1 Лондон 200 01.01.2007 1 Лондон 200 ТЗ.Свернуть("ДатаВылета,НомерКассы,ПунктПосадки,Сумма",""); 01.01.2007 1 Лондон 200 10.01.2007 1 Америка 200 11.01.2007 1 Васюки 200 01.01.2007 1 Лондон 999
Спасибо большое ВСЕМ участвующим ! Просто стаж мой в 1С - 2 месяца, а уже за транс-атлантические перелеты взялся :))
"если между ними есть строка с другим TICKETNUMB?" МЕжду 2-мя дублями нет строк - это две соседние строки !
скажи название авиакомпании, чтобы в случае чего в нее не обратиться?
Ну так начем отсановимся, В СМЫСЛЕ ДУБЛЕЙ ? Как лучше-то ?
Ну да, это же и есть дубли . или тебе нужно удалить по какому то признаку, например, при равенстве значений в одной/нескольких колонке ?
кстати, проблему можно решить не только, удалив ненужные записи, а еще и - перекидав НУЖНЫЕ записи в другую ТЗ. Это будет работать быстрее, если ненужных записей больше, чем нужных
есть еще одно "кстати" - успешно работает такая конструкция:
МНЕ НУЖНО УДАЛИТЬ СЛЕДУЮЩУЮ СТРОКУ, ЕСЛИ ЗНАЧЕНИЕ В ПОЛЕ TICKETNUMB У СЛЕДУЮЩЕЙ СТРОКИ ТО ЖЕ, ЧТО И У ПРЕДЫДУЩЕЙ
кроме того, по-моему надо было думать головой при написании алгоритма заполнения таблицы
алгоритм заполнения таблицы - получаю данные из *.xls
ну, братец! Вот тут и надо было думать. При помощи ADODBConnection из листика Excel можно вынуть данные SQL запросом. Со всеми вытекающими. Среди всех вытекающих есть такое предложение, как DISTINCT, GROUP BY и еще много разных других
Епрст3, твой код щас вставил - по-моему - как в аптеке !
Мдя. нехватило терпения запустить что вчера писалось? :0
если без сортировки, то по мере обхода таблицы заполнять список значений и проверять входит значение в список или нет, если уже входит - удалять строку
Вот дятлы.. Одно действие - Свернуть. Тут уже правда было - но зачем лишнего вагон делать?
To <vpetrov> и другим, в чьем лексиконе либимое слово "Дятел": чем глупее человек, тем более он неприязнен к начинающим. Куда выложить подлинник файла EXCEL, чтобы раз и навсегда заткнуть желающих ТЗ.Свернуть; ?? Посмотрите содержимое *.xls - и охладитесь .
0023 01.08.2006 МОВ СТВ МИ 1227 02.08.2006 Б 3484201160909 Б РУБ 7300,00000 ПРОНИНА ЕКАТЕРИНА Г-Н П ПС 4507555442 1020,00000 0,00000 8320,00000 Б Б ССОД СОФИ 0012 01.08.2006 МОВ МРВ МИ 1235 01.08.2006 Э 3484201013189 ЛЬА РУБ 3200,00000 ОСАДЧИЙ СЕРГЕЙ 25ИЮН64 Г П ПСП 513366073 1020,00000 0,00000 4220,00000 Э Л ССОД СОФИ 0023 01.08.2006 МОВ СТВ МИ 1227 01.08.2006 Э 3484201160906 КЬА РУБ 4900,00000 ТКАЧЕНКО ЛИЛИЯ Г-Н П ПС 0000000000 1020,00000 0,00000 5920,00000 Э Е ССОД СОФИ
Столкнулся с задачей удаления дублей строк в таблице значений, при этом важным критерием для меня является производительность, из-за большых размеров таблиц значений. Написал процедуру, возможно эта процедура кому-нибудь еще будет полезной.
Специальные предложения
ВЫБРАТЬ * ПОМЕСТИТЬ ВременнаяТаблица ИЗ &Таблица КАК ВременнаяТаблица;
ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ ВременнаяТаблица ivangrant; alsegor; 2711640; Bublik2011; Kserken; Азбука Морзе; higs; + 7 – Ответить (4) CagoBHuK, нужно иметь в виду, что добавится передача/возврат данных на SQL. (6) В данном случае речь шла о таблице значений, которую на клиенте Вы никак не сможете получить. Использование метода "Скопировать" доступно только для универсальных коллекций значений, которые не могут существовать на клиенте. Иными словами сам код обработки предполагает серверный вызов. (8) CagoBHuK, я и не спорю относительно серверного (сервера 1С) вызова, добавится вызов именно SQL сервера. (9) Вы считаете, что он будет длиться дольше, чем представленный алгоритм пересчета?
(4) CagoBHuK, это при условии что все поля строк одинаковые.
Если, например, в таблице 4 колонки и дубли удалять надо только по 3 колонкам, то вариант стар как мир и даже описан в синтакс-помощнике (осторожно, код в стиле "капитан очевидность"):
Предложу свой вариант, немного улучшенный (12) больше универсальности, про быстродействие так же не могу сказать, тесты не проводил:
Можно использовать и запрос, спорить не буду. Таблицу нужно будет подготовить - описать типы колонок, и также добавить колонку, по которой будет происходить суммирование.
Далее почти по тексту, только нужно будет выбирать не различные, а группировать по нужному списку колонок (строить запрос динимически), и добавить в запрос условие "Имеющие сумма(КолонкаСуммирования) = 1". (просто различные использовать нельзя из-за значений в других колонках таблицы). Далее эту сгруппированную временную таблицу нужно будет джойнить с первоначальной временной таблицей, в условиях связи прописывать равенство по выбранным полям (строить условие динамически), плюс нужно будет в случае если нужно не удалить все дублирующие строки, а оставить по одной из удаляемых тоже это предусмотреть.
Хотел еще сказать, что этот способ расчитан, на большое количество строк в таблице, и малое количество строк с дублями, для других случаев можно это делать быстрее другим способом.
Вариант написанный на коленке возможно будет эффективнее, если предоставится возможность, хотел бы на него посмотреть и возможно использовать с Вашего разрешения.
Я бы еще подумал над добавлением индекса(ов) в таблицу значений (по которой выполняется поиск).МассивДублей = Новый Массив;
МассивСотрудников = Новый Массив; // проверяемое на дубль значение
Для каждого Строка Из ТЗНачисления Цикл
Если Строка.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.СдельныйЗаработок Тогда // критерий сравнения на дубль, может быть любой
Если Элем = Неопределено Тогда // это первое вхождение проверяемого на дубль сотрудника
Иначе // а это - уже мы дубль встретили, по данному сотруднику и по данному критерию проверки на дубль
При работе с программой 1С может так случиться, что пользователь по ошибке вносит одинаковые элементы в справочники программы. Это создает неудобства в работе и путаницу в данных. Чаще всего подобные накладки случаются со справочниками «Контрагенты» и «Номенклатура». Они достаточно объемные, поэтому в них могут и кроются такие недочеты.
В результате пересортицы пользователь может в одном документе выбрать один элемент, например, контрагента, а в другом – другой элемент справочника. Такая ситуация может возникнуть, когда в базе работают несколько пользователей: не найдя нужный, заводится новый, создавая тем самым дубли.
Для поиска и удаления дублей, в программе 1С Бухгалтерия 8.3 предусмотрена одноименная обработка. Рассмотрим принцип ее работы.
Обработка поиск и удаление дублей
Открыть обработку можно в разделе меню «Администрирование» - «Обслуживание» перейдя по гиперссылке «Поиск и удаление дублей».
В открывшемся окне необходимо указать область поиска, заполнив поле «Искать в:».
Из предложенного списка выбираем нужную область поиска дублей. В нашем примере проверим сначала справочник «Контрагенты».
Перейдя по гиперссылке в поле «Сравнить», задаем правила поиска дублей для выбранного объекта. По умолчанию установлен поиск по наименованию – по схожим словам. Но пользователь может написать разные наименования, например, полное и сокращенное – ИП или Индивидуальный предприниматель, полные данные контрагента (физического лица) – фамилию, имя, отчество, или указать только инициалы.
В этом случае можно сопоставить элементы по каким-то другим реквизитам. Для справочника «Контрагенты» – это ИНН, КПП, для справочника «Номенклатура» – Артикул и т.п.
После того как условия поиска заданы, нажимаем кнопку «Найти дубли». Программа автоматически составит список из повторяющихся элементов. Выделив элемент в правом окне, видим, что слева отобразилась информация, где он был использован. Рядом с элементом указано количество объектов, где он задействован.
Элемент с наибольшим количеством записей программа автоматически определяет как оригинал, выделив его синей стрелочкой. Если какой-то из объектов мы обрабатывать не будем, галочку с него надо снять. Или если мы хотим изменить объект, на который будут перенесены все данные с другого объекта при его удалении, то отметим его, нажав кнопку «Отметить как оригинал».
После нажатия кнопки «Удалить дубли» программа перенесет все объекты, где был задействован элемент-двойник, на отмеченный объект-оригинал, тем самым объединив их.
Мы можем закрыть обработку или, нажав кнопку «Новый поиск», повторить поиск дулей в других местах программы.
Для примера найдем дубли элементов в справочнике «Номенклатура», проведя сравнение по артикулу и наименованию.
Аналогично предыдущему описанию ищем и удаляем дубли.
Посмотрим, что же происходит с ними в справочнике. Зайдем в справочник «Контрагенты» (раздел меню «Справочники» - «Покупки и продажи»). Дубль-двойник помечен на удаление. Помимо этого мы видим, что контрагент был внесен дважды, но с разным наименованием. Внимательный пользователь бы заметил, что ИНН у элемента двойника выделен красным цветом. В программе имеется контроль совпадений контрагентов по ИНН.
Перейдя в справочник «Номенклатура» (раздел меню «Справочники» - «Покупки и продажа»), выполним поиск по наименованию, т.к. зрительно похожее название почему-то не отображалось. Что мы видим? У одного из элементов справочника перед названием стоит пробел – именно поэтому пользователь не может увидеть этот элемент в списке, просматривая его в алфавитном порядке. Все символы идут обычно в начале списка. Не найдя этот элемент, пользователь создал новый. Такая ситуация встречается довольно часто.
Так, используя штатный функционал программы, можно очистить справочники от таких элементов-двойников. После установки пометки удаления на них, удаление производится обычным способом, через «Удаление помеченных объектов» в разделе меню «Администрирование» - «Сервис». При больших объемах данных периодически можно проверять справочники во избежание путаницы в учете и захламления информационной базы ненужными элементами.
Дата публикации 13.11.2019
Использован релиз 3.0.73
Обработка "Поиск и удаление дублей" используется для поиска в информационной базе ошибочно введенных дублирующих друг друга элементов и ссылок на них, автоматической замены всех ссылок на дубли ссылками на выбранный "правильный" элемент и установки на дубли пометки на удаление.
- Раздел: Администрирование – Обслуживание.
- В блоке "Корректировка данных" перейдите по ссылке "Поиск и удаление дублей".
- Установите правила поиска дублей и запустите поиск:
- В поле "Искать" выберите область поиска (справочник, вид документа и др.) (рис. 1).
- В поле "Отбирать" задайте условия, по которым будут отбираться элементы для поиска дублей – по кнопке "Выбрать" (в поле справа) откройте форму "Правила отбора", добавьте правила (кнопка "Добавить новый элемент") и укажите для каждого правила элемент отбора, вид сравнения и значение.
- По ссылке в поле "Сравнивать" установите правила поиска дублей – отметьте флажками реквизиты, при совпадении которых элементы будут считаться дублями (рис. 2). Совпадение может быть полным (правило "Совпадает") или неполным (правило "Совпадает по похожим словам" (не для всех реквизитов)).
- Запустите поиск дублей по кнопке "Найти дубли".
- После выполнения поиска в левое окно формы будут выведены элементы, имеющие дубли, в правое окно – объекты, которые имеют ссылки на найденные элементы с дублями (рис. 3). Элемент с наибольшим количеством ссылок на него автоматически признается основным (оригинальным) и помечается значком (рис. 3).
- По кнопке "Отметить как оригинал" можно изменить основной (оригинальный) элемент (рис. 4).
- По кнопке "Удалить дубли" на основной (оригинальный) элемент будут перенесены все ссылки из объектов информационной базы, а дубли будут помечены на удаление.
- Удаление помеченных объектов выполняется обработкой "Удаление помеченных объектов" (раздел: Администрирование).
Читайте также: