- МЕНЮ
 - В избранное
Самые важные новости
 
Царьков Валерий
Доработка формы подбора номенклатуры по каталогу

Как ускорить открытие формы при подборе по каталогу в "1С:Торговля и склад" v.8.6, 8.7
Еще один подход к ускорению: динамическое заполнение списка
Как в списке подбора показать только товары, имеющиеся в наличии

        Как ускорить открытие формы при подборе по каталогу в "1С:Торговля и склад" v.8.6, 8.7.

        Для подбора номенклатуры по каталогу в "1С:Торговля и склад" v.8.6, 8.7 предусмотрена возможность видеть остатки и цены номенклатуры. Штука, безусловно, хорошая. Только вот в чем проблема. При открытии формы происходит расчет регистров по редактируемый документ, а это процесс небыстрый. Чтобы дать пользователю возможность самому устанавливать расчет делаем так:
        1.В процедуре ПриОткрытии() модуля формы строки
               Если внКонтекст.ДатаДок<ПолучитьДатуТА() Тогда
                      ОстТоваров
.ВременныйРасчет();
                      РассчитатьРегистрыПо(
внКонтекст.ДатаДок);
               КонецЕсли;

        нужно вынести в отдельную процедуру.
        2.В форму нужно вставить кнопку, по которой эта процедура срабатывает.
Примечание. В ТиС 9.х эта возможность учтена.

наверх

        Еще один подход к ускорению: динамическое заполнение списка.

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

Если ОстаткиТоваров.НайтиЗначение(ТекТовар,Поз,"Элемент")=0 Тогда
        // Не нашли. Вернем пустую строку
        // Возврат "";

        Поз
=Добавить(ТекТовар);
КонецЕсли;


Т.е. если не нашли, тогда не возвращаем пустую строку (как было ранее), а добавляем новую при помощи функции: Добавить(ТекТовар);

Осталось превратить процедуру: ЗаполнитьКЭШ(Группа) в функцию: Добавить(ТекТовар). Для этого убираем перебор справочника: добавляем в таблицу значений только текущий товар и значения цены и остатка для него. Возвращает функция номер только что введенной строки. Далее - без изменений. Текст функции в виде текстового файла лежит
здесь.
Данный пример нецелесообразно использовать в случае, описанном ниже.

наверх

        Как в списке подбора показать только товары, имеющиеся в наличии.

Исходный вид:

Вид после фильтрации по наличию:


        В общем - то все просто, нужно воспользоваться методом: ИспользоватьСписокЭлементов(СписокТоваров). А т.к. список значений необходимо получить весь и сразу, то от описанного выше динамического заполнения придется отказаться.
СписокЗначений формируем в уже известной нам процедуре: ЗаполнитьКЭШ(Группа). Ее потребуется переписать таким образом:
        - записываем СписокТоваров = СоздатьОбъект("СписокЗначений"); в начало процедуры;
        - в цикле для выбранного элемента сначала проверяем остатки: если товар есть в наличии, тогда добавляем его в СписокТоваров и в ОстаткиТоваров со всеми остальными реквизитами.
        - обратите внимание на группы, у них нет остатков и цен, а в СписокТоваров они должны попасть;
        - в конце процедуры пишем ИспользоватьСписокЭлементов(СписокТоваров).
Для удобства использования нововведения добавим в форму обработки: "ИзменениеФильтраПодбора" флажок


и допишем по паре строк в вызывающуу процедуру модуля справочника: ПоКнопкеИзменитьФильтр()
        Параметр.ДобавитьЗначение(Отобрать,"Отобрать");
       
Параметр.ДобавитьЗначение(ИерархическийСписок(),"ВидОтобрать");

       
Отобрать = Параметр.Получить("Отобрать");

и в модуль формы ибработки "ИзменениеФильтраПодбора"
        Отобрать = Форма.Параметр.Получить("Отобрать");
       
Форма.Отобрать.Доступность(Форма.Параметр.Получить("ВидОтобрать"));

       
Форма.Параметр.Установить("Отобрать", Отобрать);

для корректной передачи параметра. Теперь это выглядит так:


Все! Текст с кусками программных модулей лежит
здесь

наверх


обсудить на форуме   всего просмотров: 
Используются технологии uCoz


© Царьков Валерий 2000-2002