вторник, 24 августа 2010 г.

1С: Кеш

Есть у нас один логический склад (центральный), который объединяет в себе четыре физических. Это необходимо для того чтобы набивать заявки одним документом.
Т. к. ассортимент на складах меняется довольно таки редко. Решил сделать все ручками по кодам. Знаю-знаю это не правильно как ни крути. Возможно было использовать в группе товаров "ХранитьНаСкладе" со значением типа "Перечисление", но у нас есть несколько товаров которые хотя и находятся в одной товарной группе, но физически находятся на разных складах.
Задача: разделить складское требование (первичный документ), по логическим складам.
Есть списки групп (~15 позиций), и товаров (~15 позиций)
Вношу их в функцию
Функция глПолучитьСкладДляПечати(Товар) Экспорт
    // т.к. группы постоянно меняются не нашел ничего более
    интересного как на каждом проверить принадлежитгруппе
    // Склад1
    СигаретыИПапиросы = СоздатьОбъект("Справочник.Товары");
    СигаретыИПапиросы.НайтиПоКоду(14);
    Сигары = СоздатьОбъект("Справочник.Товары");
    Сигары.НайтиПоКоду(376);
 
*** 
    Склад = 0;
    Если (Товар.ПринадлежитГруппе(БутылкаИмпорт) = 1) или
        (Товар.ПринадлежитГруппе(БутылкаРоссия) = 1) или 
        (Товар.ПринадлежитГруппе(ПивЗакуски) = 1) или
        (Товар.ПринадлежитГруппе(Черноголовка) = 1) Тогда
        Склад = 2;
    ИначеЕсли 
***
    КонецЕсли;
     Возврат Склад; 
КонецФункции
А в документе делаю сортировку по складу товара, и вывожу на печать страницы товар одного и того же склада.
Запускаю все нормально, но при печатании больших (>25 строк) заявок ощущается притормаживание... Решил наконец воспользоваться такой мощной штукой как кеш.
Что нам нужно:
  1. Переменная с глобальным доступом.
  2. Проверка на вхождение значение.
  3. Добавление обработанного значения.
Перем Кеш Экспорт;
***

Функция глПолучитьСкладДляПечати(Товар) Экспорт
    Стр = 0;
    Попытка
        // пытаемся найти значение для кеша
        Кеш.НайтиЗначение(Товар,Стр,"ТоварДляПечати");
    Исключение
        // попытка не удалась  значит даже столбцов нет
        Кеш.НоваяКолонка("ТоварДляПечати","Справочник.Товары");
        Кеш.НоваяКолонка("СкладДляПечати","Число");
    КонецПопытки;
    // контрольный поиск
    ЕслиКеш.НайтиЗначение(Товар,Стр,"ТоварДляПечати") = 1 Тогда
        // берем необходимое значение
        Возврат Кеш.ПолучитьЗначение(Стр,"СкладДляПечати");
    КонецЕсли;
    // Склад1
***
    КонецЕсли;
    // Вносим значение в кеш чтобы в следующий раз найти быстрее
    Кеш.НоваяСтрока();
    Кеш.ТоварДляПечати = Товар;
    Кеш.СкладДляПечати = Склад;
    Возврат Склад;
КонецФункции
Собственно и все. Кеш дал прирост ~40% на накладных >25 строк. Затем я использовал кеш в дополнительном фильтре: Нужно собрать всех поставщиков в группе товаров и предоставить выбор среди них, для организации отчета остатки товаров. Прирост составил не менее 20%.
Ну и ложка дегтя: наращивая скорость работы, увеличивается расход ОЗУ. Хотя это и так общеизвестный факт.

Комментариев нет:

Отправить комментарий