В процессе разработки на платформе 1С:Предприятие часто возникает задача сравнения двух наборов данных. Простая проверка наличия хотя бы одной общей строки между двумя ТаблицаЗначений может стать узким местом в производительности, если использовать неоптимальные алгоритмы. Давайте разберем наиболее эффективные способы решения этой задачи, от использования мощи СУБД до манипуляций с объектами встроенного языка.
Если вы работаете в клиент-серверном варианте, наиболее производительным методом будет использование Запрос. Сервер баз данных значительно быстрее справляется с операциями объединения и поиска, чем последовательный перебор записей в коде.
ТаблицаЗначений в запрос в качестве параметров.ВнутреннееСоединение по всем полям, которые должны совпадать.Если после выполнения запроса Выборка.Количество() > 0, значит, совпадения найдены. Этот подход считается стандартом индустрии для больших объемов данных.
// Пример логики запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ * ПОМЕСТИТЬ ВТ1 ИЗ &ТЗ1 КАК ТЗ1;
|ВЫБРАТЬ РАЗЛИЧНЫЕ * ПОМЕСТИТЬ ВТ2 ИЗ &ТЗ2 КАК ТЗ2;
|ВЫБРАТЬ 1 ИЗ ВТ1 КАК Т1
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК Т2 ПО Т1.Поле1 = Т2.Поле1 И Т1.Поле2 = Т2.Поле2";
Запрос.УстановитьПараметр("ТЗ1", ТЗ1);
Запрос.УстановитьПараметр("ТЗ2", ТЗ2);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
// Совпадения найдены
КонецЕсли;
Для небольших или средних объемов данных отлично подходит алгоритм со сверткой. Суть его заключается в поиске «дублей» после объединения таблиц.
КолСтрок, и заполняем её значением 1.ТаблицаЗначений.Свернуть по всем полям, кроме КолСтрок, суммируя значения в этой колонке.КолСтрок > 1, это означает, что исходные данные присутствовали в обеих таблицах.Этот метод интуитивно понятен и позволяет легко вычислить, какие именно данные совпали.
Если использование запросов по какой-то причине невозможно, а таблицы содержат тысячи строк, можно применить алгоритм с сериализацией строк в структуру или строку.
Разберем шаг за шагом:
Структура, где ключи — это имена колонок, а значения — соответствующие данные.Соответствие или СписокЗначений для быстрого поиска.Такой подход имитирует работу хэш-таблицы и позволяет избежать вложенных циклов с временной сложностью O(N*M), сокращая её до линейной.
При выборе метода всегда учитывайте следующие аспекты:
Ссылка (например, Номенклатура или Контрагент) в рамках Свернуть или Запрос могут работать медленнее из-за обращений к кэшу или БД. Если производительность критична, попробуйте сначала получить УникальныйИдентификатор или Код объектов.Сортировать. Это позволит использовать алгоритм сравнения упорядоченных списков, что гораздо быстрее полного перебора.Запрос, который работает с данными на уровне СУБД.Подводя итог: для большинства корпоративных задач в 1С наиболее надежным и «красивым» решением остается использование запросов. Они позволяют вынести всю тяжелую логику на сервер, оставляя код чистым и легко поддерживаемым.