Прямые запросы: ускорение получения цен для типовой ТиС 7.7
Первая статья из цикла статей "Прямые запросы:…". Рассказывается о применении класса ПрямойЗапрос и компоненты 1С++ для ускорения функции глВернутьЦену() в типовой конфигурации Торговля и склад. Платформа 7.7.
- Описание
- Подробнее
Описание
Для внедрения разработки нам потребуется:
1. Компонента 1С++ (последняя версия);
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, ТипЦены.ПорядокОкругления); // элемент справочника Цены не существует (расчетный). Валюту и Наценку возьмем из типа цены ВалЦены=ТипЦены.Валюта; НаценкаЦены=ПроцентНаценки; КонецЕсли; Возврат Рез;КонецФункции
Ну вот собственно и все – разработка готова к работе на реальной базе.

