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