Хитрый двухуровневый кэш
Как вам такой хитрый двухуровневый кэш?
Первый уровень – ДатаПотребности, второй – Номенклатура, на третьем – массив Заказов.
Искать можно без учета заказов, тогда будут возвращены все заказы и по конкретному заказу, тогда заказ ищется перебором в массиве на втором уровне кэша. Массивы маленькие, перебор работает быстро.
Перебираем все строки и заносим их в кэш:
//Кэш строк документа
КэшСтрокДокумента = Новый Соответствие();
Для Каждого Строка ИЗ Объект.ОбеспечениеПотребности Цикл
ДобавитьВКэшСтрокДокумента(КэшСтрокДокумента, Строка);
КонецЦикла;
Сама процедура занесения в кэш:
Процедура ДобавитьВКэшСтрокДокумента(Кэш, Строка) Экспорт
Кэш2 = Кэш[Строка.ДатаПотребности];
Если Кэш2 = Неопределено Тогда
Кэш2 = Новый Соответствие();
Кэш.Вставить(Строка.ДатаПотребности, Кэш2);
КонецЕсли;
Кэш3 = Кэш2[Строка.Номенклатура];
Если Кэш3 = Неопределено Тогда
Кэш3 = Новый Массив();
Кэш2.Вставить(Строка.Номенклатура, Кэш3);
КонецЕсли;
Кэш3.Добавить(Строка);
КонецПроцедуры
Функция поиска в кэше:
Функция НайтиВКэшеСтрокиДокумента(Кэш, ДатаПотребности, Номенклатура, Заказ = Неопределено, Подразделение = Неопределено) Экспорт
М = Новый Массив();
Кэш2 = Кэш[ДатаПотребности];
Если Кэш2 = Неопределено Тогда
Возврат М;
КонецЕсли;
Кэш3 = Кэш2[Номенклатура];
Если Кэш3 = Неопределено Тогда
Возврат М;
КонецЕсли;
Если Заказ = Неопределено Тогда
Возврат Кэш3;
КонецЕсли;
Для Каждого Эл ИЗ Кэш3 Цикл
Если Эл.Заказ = Заказ
И (Подразделение = Неопределено ИЛИ Эл.Подразделение = Подразделение)
Тогда
М.Добавить(Эл);
КонецЕсли;
КонецЦикла;
Возврат М;
КонецФункции
Каково, а?! Летает!