Как реализовать упорядоченную коллекцию с быстрым поиском на клиенте в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых форм часто возникает задача: нам необходимо хранить набор данных, к которому нужно обращаться по уникальному ключу (быстрый поиск), но при этом критически важно сохранять последовательность элементов (порядок вывода или обработки). В серверном коде мы привыкли использовать ТаблицаЗначений, однако на клиенте полноценная работа с ней ограничена, так как это объект серверного контекста. Давайте разберем, как эффективно решить эту задачу, не создавая избыточных нагрузок на платформу.

Использование реквизитов формы (Таблица значений на форме)

Первый и наиболее предпочтительный способ — это использование реквизита формы с типом ТаблицаЗначений. Несмотря на то, что мы не можем создать «чистую» ТаблицаЗначений через оператор Новый на клиенте, мы можем добавить её в структуру формы в конфигураторе.

Преимущества данного подхода:

Чтобы найти нужную запись, достаточно воспользоваться методом НайтиСтроки() с параметром Структура:


СтруктураПоиска = Новый Структура(\"Идентификатор\", ИскомыйКлюч);
НайденныеСтроки = ЭтотОбъект.МояТаблица.НайтиСтроки(СтруктураПоиска);
Если НайденныеСтроки.Количество() > 0 Тогда
    ЦелеваяСтрока = НайденныеСтроки[0];
КонецЕсли;

Комбинированный подход: Массив плюс Соответствие

Если создание реквизитов формы не подходит (например, данные носят временный или строго программный характер и не должны отображаться пользователю), мы можем реализовать собственный механизм «индексированного массива». Суть метода заключается в синхронизации двух объектов: Массив для хранения порядка и Соответствие для мгновенного поиска.

Рассмотрим логику работы:

  1. Массив содержит элементы в том порядке, в котором они были добавлены.
  2. Соответствие содержит пары «Ключ — Индекс в массиве».

При добавлении нового элемента мы обновляем обе коллекции. Давайте посмотрим, как это выглядит в коде:


// Инициализация
МойМассив = Новый Массив;
МоеСоответствие = Новый Соответствие;

// Метод добавления
Процедура ДобавитьЭлемент(Ключ, Значение)
    Индекс = МойМассив.Количество();
    МойМассив.Добавить(Значение);
    МоеСоответствие.Вставить(Ключ, Индекс);
КонецПроцедуры

// Метод поиска
Функция ПолучитьЭлемент(Ключ)
    Индекс = МоеСоответствие.Получить(Ключ);
    Если Индекс <> Неопределено Тогда
        Возврат МойМассив[Индекс];
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Важные нюансы реализации:

Этот метод работает очень быстро, так как Соответствие внутри платформы реализовано как хеш-таблица. Однако при удалении элементов из середины массива порядок индексов в Соответствии нарушится. В таких случаях необходимо либо перестраивать все индексы в соответствии заново, либо помечать элементы как «удаленные» (логическое удаление), не меняя физическую структуру массива.

Почему не стоит использовать Список значений?

Часто возникает соблазн использовать объект СписокЗначений, так как он кажется «золотой серединой». Действительно, он поддерживает порядок и поиск. Однако, анализируя производительность, мы выясним, что поиск по значению в СписокЗначений осуществляется последовательным перебором всех элементов. При увеличении коллекции до нескольких тысяч записей скорость работы приложения существенно упадет. Используйте СписокЗначений только для небольших наборов данных, где порядок важнее скорости поиска.

Подведем итог

Чтобы решить задачу выбора структуры данных на клиенте, проанализируйте объем данных:

Таким образом, мы объединили преимущества быстрого доступа к данным Соответствия и упорядоченности Массива, обеспечив оптимальное решение для клиентской части платформы 1С.

← На главную