Related Posts
Получение логина и пароля техподдержки 1С из базы
Класс для вывода отчета в Excel
Счет-фактура для УПП
Библиотека классов для создания внешней компоненты 1С на C#
Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
Прайс-лист с артикулом в отдельной колонке
И какая получилась производительность? С какими вариантами сравнивали?
Для Каждого Колонка Из БуфернаяТаблицаДанных.Колоники Цикл
Нужно пару слов про идею и алгоритм написать, а не только текст процедуры. Чем Ваш вариант лучше того, что я сейчас сяду и напишу за 10 минут на коленке?
Алгоритм писателя на 1С 77. Проще всего:
ВЫБРАТЬ * ПОМЕСТИТЬ ВременнаяТаблица ИЗ &Таблица КАК ВременнаяТаблица;
ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ ВременнаяТаблица
Можно использовать и запрос, спорить не буду. Таблицу нужно будет подготовить — описать типы колонок, и также добавить колонку, по которой будет происходить суммирование.
Далее почти по тексту, только нужно будет выбирать не различные, а группировать по нужному списку колонок (строить запрос динимически), и добавить в запрос условие «Имеющие сумма(КолонкаСуммирования) = 1». (просто различные использовать нельзя из-за значений в других колонках таблицы). Далее эту сгруппированную временную таблицу нужно будет джойнить с первоначальной временной таблицей, в условиях связи прописывать равенство по выбранным полям (строить условие динамически), плюс нужно будет в случае если нужно не удалить все дублирующие строки, а оставить по одной из удаляемых тоже это предусмотреть.
Хотел еще сказать, что этот способ расчитан, на большое количество строк в таблице, и малое количество строк с дублями, для других случаев можно это делать быстрее другим способом.
Вариант написанный на коленке возможно будет эффективнее, если предоставится возможность, хотел бы на него посмотреть и возможно использовать с Вашего разрешения.
(4) CagoBHuK, нужно иметь в виду, что добавится передача/возврат данных на SQL.
Я бы еще подумал над добавлением индекса(ов) в таблицу значений (по которой выполняется поиск).
(6) В данном случае речь шла о таблице значений, которую на клиенте Вы никак не сможете получить. Использование метода «Скопировать» доступно только для универсальных коллекций значений, которые не могут существовать на клиенте. Иными словами сам код обработки предполагает серверный вызов.
(8) CagoBHuK, я и не спорю относительно серверного (сервера 1С) вызова, добавится вызов именно SQL сервера.
(9) Вы считаете, что он будет длиться дольше, чем представленный алгоритм пересчета?
Мой вариант:
МассивСотрудников = Новый Массив; // проверяемое на дубль значение
Для каждого Строка Из ТЗНачисления Цикл
Если Строка.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.СдельныйЗаработок Тогда // критерий сравнения на дубль, может быть любой
Элем = МассивСотрудников.Найти(Строка.Сотрудник);
Если Элем = Неопределено Тогда // это первое вхождение проверяемого на дубль сотрудника
МассивСотрудников.Добавить(Строка.Сотрудник);
Иначе // а это — уже мы дубль встретили, по данному сотруднику и по данному критерию проверки на дубль
МассивДублей.Добавить(Строка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если МассивДублей.Количество() > 0 Тогда
Для каждого Элем Из МассивДублей Цикл
ТЗНачисления.Удалить(Элем);
КонецЦикла;
КонецЕсли;
Показать
Вся проверка делается за один проход. Очень просто.
(4) CagoBHuK, это при условии что все поля строк одинаковые.
Если, например, в таблице 4 колонки и дубли удалять надо только по 3 колонкам, то вариант стар как мир и даже описан в синтакс-помощнике (осторожно, код в стиле «капитан очевидность»):
Показать
=)
Спасибо, помогло)
Ну как-бы есть и такой метод Таблицы Значений, как Свернуть(«Групп колонки», » сумм колонки») если ничего не нужно суммировать, а только убрать дубли, подходит только групп колонки!
Слыхал наверное!?