Хитрый двухуровневый кэш

Как вам такой хитрый двухуровневый кэш?

Первый уровень – ДатаПотребности, второй – Номенклатура, на третьем – массив Заказов.

Искать можно без учета заказов, тогда будут возвращены все заказы и по конкретному заказу, тогда заказ ищется перебором в массиве на втором уровне кэша. Массивы маленькие, перебор работает быстро.

Перебираем все строки и заносим их в кэш: 


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

 
Кэш2 = Кэш[ДатаПотребности];
 Если
Кэш2 = Неопределено Тогда
  Возврат
М;
 КонецЕсли;

 
Кэш3 = Кэш2[Номенклатура];
 Если
Кэш3 = Неопределено Тогда
  Возврат
М;
 КонецЕсли;

 Если
Заказ = Неопределено Тогда
  Возврат
Кэш3;
 КонецЕсли;

 Для Каждого
Эл ИЗ Кэш3 Цикл
  Если
Эл.Заказ = Заказ
   И (Подразделение = Неопределено ИЛИ Эл.Подразделение = Подразделение)
   Тогда
  
М.Добавить(Эл);
  КонецЕсли;
 КонецЦикла;

 Возврат
М;

КонецФункции

Каково, а?! Летает!

promo fixin december 31, 2037 16:57 1419
Buy for 30 tokens
UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок - список. Мой проект "…