Процедура сравнения больших списков телефонов

27.06.17

Разработка - Универсальные функции

Обработка для 1С (управляемые формы), которая читает списки телефонов из текстовых файлов, сортирует их средствами 1С и затем сравнивает: либо вычитая один список из другого, либо находит пересечение

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Процедура сравнения больших списков телефонов:
.epf 9,31Kb
1 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

История вопроса такова, что у коллеги из смежного отдела возникла проблема с сопоставлением больших списков телефонов, обычно это делалось в Excel`е с помощью функции ВПР(), но при обработке двух списков в каждом из которых порядка миллиона строк, Excel стал просто "вешать" компьютер на час и более, хорошо если при этом удавалось дождаться результата.

Было решено сделать процедуру сравнения файлов, работающую более эффективно.

В результате была создана обработка для 1С (управляемые формы), которая читает списки телефонов из текстовых файлов, сортирует их средствами 1С и затем сравнивает: либо вычитая один список из другого, либо находит пересечение.

Версия платформы 8.3.9.2233

Режим использования модальности - не использовать

Режим совместимости - не использовать

Для чтения и записи текстовых файлов используется объект ADODB.Stream, т.к. это оказался наиболее быстрый способ из протестированных:

Чтение файла:

file = Новый COMОбъект("ADODB.Stream");
file.Type = 2;
file.charset = "windows-1251";
file.Open();
file.LoadFromFile(СокрЛП(Файл1));
		
й = 0; 
Пока file.EOS = 0 Цикл
	й = й + 1;
	Если ((й % 2000) = 0) Тогда
		Состояние("Чтение файла № " + Формат(ё, "ЧГ=") + ": " + Формат(й, "ЧГ="));
	КонецЕсли;
	ОбработкаПрерыванияПользователя();
			
	cardnum = СокрЛП(file.ReadText(-2));
	Если cardnum <> "" Тогда
		сп1.Добавить(cardnum);
	КонецЕсли;
КонецЦикла; 
file.Close();


Запись файла:

ПС = Символ(13) + Символ(10);
		
file = Новый COMОбъект("ADODB.Stream");
file.Type = 2;
file.charset = "windows-1251";
file.LineSeparator = -1;
file.Open();
		
Для ъ = 1 по N Цикл
	Если ((ъ % 500) = 0) Тогда
		Состояние("Формирование строки для записи в файл: " + Формат(ъ, "ЧГ=") + " " + Формат(ъ/N*100, "ЧДЦ=2; ЧН=0; ЧГ=") + "%");
	КонецЕсли;
	file.WriteText(СокрЛП(м3[ъ-1]) + ПС);
КонецЦикла;
file.SaveToFile(Файл3, 2);

Обработка отсортированных массивов, алгоритм был взят с просторов интернета

Процедура ВыполнитьВычитание()
	N = м1.Количество()-1;
	K = м2.Количество()-1;
	
	ъ = 0; ь = 0;
	Пока (ъ <= N) и (ь <= K) Цикл
		Если ((ъ % 1000) = 0) Тогда
			Состояние("Обработка массивов(вычитание): " + Формат(ъ, "ЧГ=") + " " + Формат(ъ/N*100, "ЧДЦ=2; ЧН=0; ЧГ=") + "%");
		КонецЕсли;
		
		Если м1[ъ] < м2[ь] Тогда
			м3.Добавить(м1[ъ]);
			ъ = ъ + 1;
		ИначеЕсли м1[ъ] > м2[ь] Тогда
			ь = ь + 1;
		Иначе
			ь = ь + 1;
			ъ = ъ + 1;
		КонецЕсли;	
	КонецЦикла;
	м1 = ""; м2 = "";
КонецПроцедуры


Процедура ВыполнитьПересечение()
	N = м1.Количество()-1;
	K = м2.Количество()-1;
	
	ъ = 0; ь = 0;
	Пока (ъ <= N) и (ь <= K) Цикл
		Если ((ъ % 1000) = 0) Тогда
			Состояние("Обработка массивов(пересечение): " + Формат(ъ, "ЧГ=") + " " + Формат(ъ/N*100, "ЧДЦ=2; ЧН=0; ЧГ=") + "%");
		КонецЕсли;
		
		Если м1[ъ] < м2[ь] Тогда
			ъ = ъ + 1;
		ИначеЕсли м1[ъ] > м2[ь] Тогда
			ь = ь + 1;
		Иначе
			м3.Добавить(м1[ъ]);
			ь = ь + 1;
			ъ = ъ + 1;
		КонецЕсли;	
	КонецЦикла;
	м1 = ""; м2 = "";
КонецПроцедуры

На последнем скрине видно время обработки двух списков и их размер

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4827    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9027    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    57918    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8138    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    72665    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    10113    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. v3rter 27.06.17 13:21 Сейчас в теме
В следующих версиях, думаю, можно будет добавить "отлов" номеров по всему тексту, удаление дублей, удаление из номеров сторонних символов - скобок, пробелов, минусов, плюсов и т.п., проверку на десятизначность, проверку на принадлежность к мобильным или городским номерам, расстановку регионов и, наконец, дополнительную версию для обычных форм )

П.С. По личному опыту для разовых обработок миллионных списков можно пробовать Access, в нем есть возможность подключать таблицы из текстовых документов, экселя, SQL и т.п. Удобно сначала скопировать запросом исходные данные (с первичным фильтром) из присоединенной таблицы в собственную таблицу базы акцсеса, а затем рисовать и запускать запросы и макросы - так быстрее.
Для отправки сообщения требуется регистрация/авторизация