При разработке на платформе 1С часто возникает задача поиска записей в массивах, состоящих из структур. Когда количество данных становится существенным, стандартные циклы могут работать медленно. Давайте разберем, как подходить к этой задаче эффективно, учитывая особенности выполнения кода на клиенте и на сервере.
Если задача выполняется на сервере, самым производительным и масштабируемым способом является работа с механизмом запросов и временными таблицами. Этот подход позволяет переложить нагрузку по поиску на СУБД, которая оптимизирована для таких операций.
Реализуем этот алгоритм по шагам:
ТаблицаЗначений. Важно, чтобы колонки таблицы соответствовали ключам структур.ТаблицаЗначений и помещаем ее во вторую временную таблицу.ВНУТРЕННЕЕ СОЕДИНЕНИЕ по всем полям ключей).Если возможности использовать запросы нет (например, работа на клиенте), приходится прибегать к циклической обработке. Чтобы избежать лишних итераций, мы можем использовать конструкцию с метками для быстрого выхода из цикла при первом несовпадении.
Рассмотрим пример реализации такого алгоритма:
ЭлМассива2 = Массив2[0];
ВыхМассив = Новый Массив;
Для К = 0 По Массив1.ВГраница() Цикл
ТекущаяСтруктура = Массив1[К];
Для Каждого ЭлСтруктуры Из ТекущаяСтруктура Цикл
Если ЭлСтруктуры.Значение <> ЭлМассива2[ЭлСтруктуры.Ключ] Тогда
Перейти ~ВыходИзЦикла;
КонецЕсли;
КонецЦикла;
ВыхМассив.Добавить(ТекущаяСтруктура);
~ВыходИзЦикла:
КонецЦикла;
Этот способ позволяет избежать полного прохода по всем элементам, если текущий элемент структуры уже не соответствует критериям поиска.
Если поиск по одному и тому же массиву выполняется многократно в течение одного сеанса, нет смысла каждый раз перебирать все элементы. Мы можем один раз создать индекс.
Для создания индекса:
Соответствие.В дальнейшем поиск по индексу будет происходить практически мгновенно со сложностью O(1).
Анализируя ситуацию, важно выбрать инструмент в зависимости от масштаба задачи:
JSON. Сериализация в строку позволяет сравнивать объекты одним выражением, что бывает удобно и быстро для простых структур.Соответствие для предварительного индексирования данных.Помните, что перенос тяжелой логики поиска с клиента на сервер — это золотое правило разработчика 1С. Если вы чувствуете, что цикл начинает тормозить систему, сразу переводите выполнение в процедуру с директивой &НаСервере.