Каталог решений - Прямые запросы: ускорение получения цен для типовой ТиС 7.7

Прямые запросы: ускорение получения цен для типовой ТиС 7.7

Прямые запросы: ускорение получения цен для типовой ТиС 7.7

В наличии

Первая статья из цикла статей "Прямые запросы:…". Рассказывается о применении класса ПрямойЗапрос и компоненты 1С++ для ускорения функции глВернутьЦену() в типовой конфигурации Торговля и склад. Платформа 7.7.

Категория:

Описание

Для внедрения разработки нам потребуется:

1. Компонента 1С++ (последняя версия);

2. Класс ПрямойЗапрос;

3. Для работы разработки в DBF базах — компонента 1sqlite (не ниже 1.0.2.3)

Опишем порядок загрузки компонент и подключения класса.

1. Скачиваем по вышеуказанным ссылкам компоненты и класс ПрямойЗапрос.

2. Располагаем компоненты либо в каталоге ИБ либо в требуемом нам общем каталоге (чтобы все базы использовали одинаковые версии компонент). Описываем загрузку ВК в ГМ конфигурации. 1С++ должна быть загружена самой первой — до всех компонент. Также в последней версии 1С++ изменилась загрузка компоненты. Теперь не требуется наличия административных прав и доступа к ветке реестра HKLM.

Любителей загружать 1С++ не в ГМ прошу ознакомится с рекомендациями по загрузке компоненты из модуля отчета (обработки).

3. Создаем в каталоге ИБ каталог Classes (или же создаем общий каталог если планируем использовать для всех баз одни классы). Создаем в каталоге ИБ файл defcls.prm и в него добавляем следующую строчку

#include Classes\ПрямыеЗапросы\classes.prm

Результатом правильного выполнения описанных выше действий будет наличие в окне Помощь>О Программе вкладки 1С++ и наличия в ней строки о зарегистрированном классе ПрямойЗапрос.

 

Переходим к описанию изменений в ГМ.

1. Добавим глобальную переменную

 Перем глПрямойЗапросЦен Экспорт;

 2. Добавим в ГМ процедуру:

 

 Процедура глИнициализироватьЗапросЦен()
                        глПрямойЗапросЦен.Текст= "
                        |ВЫБРАТЬ
                        | СрезПоследнихЦен.ТекущийЭлемент КАК [ЦенаНоменклатуры $Справочник.Цены]
                        |,СрезПоследнихЦен.Цена КАК [Цена $Число]
                        |,СрезПоследнихЦен.Единица КАК [Единица $Справочник.Единицы]
                        |,СрезПоследнихЦен.Процент КАК [Процент $Число]
                        |ИЗ
                        | $СрезПоследних.Цены(:ТекДата
                        |,(Цена,Единица,Процент)
                        |,(($СпрЦен.Владелец = @Товар) И ($СпрЦен.ТипЦен = @ТипЦен))
                        |,ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Цены КАК СпрЦен $nolock
                        |ПО ($СпрЦен.ТекущийЭлемент = ТекущийЭлемент) И ($СпрЦен.ПометкаУдаления = 0)
                        |) КАК СрезПоследнихЦен
                        |";
                        
                        
                        
                        //глПрямойЗапросЦен.ОписаниеПараметра("ДатаЦены","Дата");
                        глПрямойЗапросЦен.УстановитьТекстовыйПараметр("ТекДата",РабочаяДата());
                        глПрямойЗапросЦен.ОписаниеПараметра("Товар","Справочник.Номенклатура");
                        глПрямойЗапросЦен.ОписаниеПараметра("ТипЦен","Справочник.ТипыЦен");
                        глПрямойЗапросЦен.ПодготовитьПараметризованныйЗапрос();
                        
КонецПроцедуры // глИнициализироватьЗапросЦен

 

3. В процедуре ПриНачалеРаботыСистемы() добавим следующие строки:

 

                        глПрямойЗапросЦен = СоздатьОбъект("ПрямойЗапрос");
                        
                        //Параметризированный запрос для получения цен
                        глПрямойЗапросЦен.БухгалтерскийУчет = 0;
                        глПрямойЗапросЦен.ОперативныйУчет = 0;
                        глПрямойЗапросЦен.ПериодическиеЗначения = 1;
                        глИнициализироватьЗапросЦен();

 

4. Приведем функцию ГМ глВернутьЦену() к следующему виду:

 

Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены=0, ЦенаЦены=0, ЕдЦены=0, ВалЦены=0, НаценкаЦены=0, НайденнаяЦена=0) Экспорт
Перем ЦеныНоменклатуры;
Перем НужныйТипЦен;
Перем ЕстьУдаленные;
 
                        Рез=1; НайденнаяЦена=ПолучитьПустоеЗначение("Справочник.Цены");
 
                        Если ПустоеЗначение(ДатаЦены)=1 Тогда ДатаЦены=РабочаяДата();           КонецЕсли;
 
                        // Найдет или нужную цену в справочнике, если она рассчитывается, то найдем базовую цену
                        Рассчетная=ТипЦены.Рассчитывается;
                        НужныйТипЦен=?(ПустоеЗначение(Рассчетная)=1, ТипЦены, ТипЦены.БазовыйТипЦен);
                        глПрямойЗапросЦен.ПодставлятьПараметры("ТипЦен",НужныйТипЦен);
                        глПрямойЗапросЦен.ПодставлятьПараметры("Товар",Номенклатура);
                        ТзЦен = глПрямойЗапросЦен.ВыполнитьПараметризованныйЗапрос();
                        ТзЦен.ВыбратьСтроки();
                        Пока ТзЦен.ПолучитьСтроку()=1 Цикл
                                               НайденнаяЦена = ТзЦен.ЦенаНоменклатуры;
                                               ЦенаЦены = ТзЦен.Цена;
                                               ЕдЦены = ТзЦен.Единица;
                                               ВалЦены = НайденнаяЦена.Валюта;
                                               НаценкаЦены = НайденнаяЦена.Процент;
                                               Прервать;
                        КонецЦикла;
                        
                        Если ПустоеЗначение(НайденнаяЦена)=1 Тогда Возврат 0; КонецЕсли;
 
                        // Заполним все ценовые характериситики
 
                        // если не задана единица цены на эту дату, то потом придется обрабатывать случай нулевого коэффициента у пустой единицы
 
                        Если ПустоеЗначение(Рассчетная)=1 Тогда
                                               
                        Иначе
                                               //Если цена рассчитывается
                                               ПроцентНаценки = ТипЦены.Процент;
                                               БазоваяЦена=ЦенаЦены;
                                               БазоваяВалюта=ВалЦены;
                                               // Цены у базового типа могут отличаться
                                               ЦенаЦены=глПересчет(БазоваяЦена, БазоваяВалюта, ДатаЦены, ТипЦены.Валюта, ДатаЦены);
                                               ЦенаЦены=глОкруглить(ЦенаЦены*(100+ПроцентНаценки)/100, ТипЦены.ПорядокОкругления);
                                               // элемент справочника Цены не существует (расчетный). Валюту и Наценку возьмем из типа цены
                                               ВалЦены=ТипЦены.Валюта;
                                               НаценкаЦены=ПроцентНаценки;
                        КонецЕсли;
                        Возврат Рез;
КонецФункции

 

Ну вот собственно и все – разработка готова к работе на реальной базе.

has been added to your cart:
Оформление заказа