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