Имя: Пароль:
1C
1C 7.7
v7: Получить цену прямым запросом?
,
0 PRO100 NigGaZ
 
14.08.13
21:33
Кто-нибудь получал цену целиком из запроса? не расчетную получить и посчитать в запросе легко, а вот если в этом же запросе выдать расчетную цену?
Этот расчитывает цену, помогите в такой запрос добавить еще расчет для случая с расчетными типами цен...
|SELECT
|ВложенныйЗапрос.Цена*ВложенныйЗапрос.Курс*ВложенныйЗапрос.Кратность Цена
|FROM
|(SELECT $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) Цена
|    , $ПоследнееЗначение.Валюты.Курс(Валюты.ID, :ВыбДата) Курс
|    , $ПоследнееЗначение.Валюты.Кратность(Валюты.ID, :ВыбДата) Кратность
|FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|    INNER JOIN $Справочник.Цены AS Цены With (NOLOCK) ON Номенклатура.ID = Цены.PARENTEXT
|    INNER JOIN $Справочник.Валюты AS Валюты With (NOLOCK) ON $Цены.Валюта = Валюты.ID
|WHERE (Номенклатура.ID = :ВыбНом)
|    AND ($Цены.ТипЦен = :ВыбТипЦен)) AS ВложенныйЗапрос
1 PRO100 NigGaZ
 
14.08.13
21:44
|SELECT
|ВложенныйЗапрос.Цена*ВложенныйЗапрос.Курс*ВложенныйЗапрос.Кратность Цена
|, ВложенныйЗапрос.Рассчитывается ЭтоРасчетнаяЦена1или0
|FROM
|(SELECT $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) Цена
|    , $ПоследнееЗначение.Валюты.Курс(Валюты.ID, :ВыбДата) Курс
|    , $ПоследнееЗначение.Валюты.Кратность(Валюты.ID, :ВыбДата) Кратность
|    , $ТипыЦен.Рассчитывается Рассчитывается
|FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|    INNER JOIN $Справочник.Цены AS Цены With (NOLOCK) ON Номенклатура.ID = Цены.PARENTEXT
|    INNER JOIN $Справочник.Валюты AS Валюты With (NOLOCK) ON $Цены.Валюта = Валюты.ID
|    INNER JOIN $Справочник.ТипыЦен AS ТипыЦен With (NOLOCK) ON $Цены.ТипЦен = ТипыЦен.ID
|WHERE (Номенклатура.ID = :ВыбНом)
|    AND (ТипыЦен.ID = :ВыбТипЦен)) AS ВложенныйЗапрос
2 Тьма
 
14.08.13
21:52
3 PRO100 NigGaZ
 
14.08.13
21:55
Возможно ли существование такой конструкции?

Case
    WHEN ВложенныйЗапрос.Рассчитывается = 1
    THEN SELECT Цена FROM ВложеныйЗапрос WHERE ВложенныйЗапрос.ТипЦен = $ТипыЦен.БазовыйТипЦен
END
?
4 КонецЦикла
 
14.08.13
21:59
Если рассчитывается, то работай с базовым типом цен, там же все просто
5 PRO100 NigGaZ
 
14.08.13
22:01
да загвоздка в том что это надо сделать по всему товару...
это для примера я товар выбрал...
вот запрос с базовым типом цен
|SELECT
|ВложенныйЗапрос.Цена*ВложенныйЗапрос.Курс*ВложенныйЗапрос.Кратность Цена
|FROM
|(SELECT $ТипыЦен.БазовыйТипЦен [БазовыйТипЦен $Справочник.ТипыЦен]
|    , $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) Цена
|    , $ПоследнееЗначение.Валюты.Кратность(Валюты.ID, :ВыбДата) Кратность
|    , $ПоследнееЗначение.Валюты.Курс(Валюты.ID, :ВыбДата) Курс
|FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|    INNER JOIN $Справочник.Цены AS Цены With (NOLOCK) ON Номенклатура.ID = Цены.PARENTEXT
|    INNER JOIN $Справочник.ТипыЦен AS ТипыЦен With (NOLOCK) ON $ТипыЦен.БазовыйТипЦен = $Цены.ТипЦен
|    INNER JOIN $Справочник.Валюты AS Валюты With (NOLOCK) ON Валюты.ID = $Цены.Валюта
|WHERE (Номенклатура.ID = :ВыбНом)
|    AND (ТипыЦен.ID = :ВыбТипЦен)) AS ВложенныйЗапрос
6 PRO100 NigGaZ
 
14.08.13
22:02
Как это в один собрать? :)
7 PRO100 NigGaZ
 
14.08.13
22:03
И на форуме вообще можно редактировать сообщение?
8 КонецЦикла
 
14.08.13
22:14
Редактировать нельзя
Могу удалить если хочешь

Цены могут быть выражены в разных валютах и для разных единиц измерений - это не забыл?
Так что все немного сложнее выйдет

Если буде слишком сложно - можно попробовать тупо затащить все что нужно во временную таблицу
Потом в пару этапов ее обработать
Потом уже селект из этой таблицы делать
9 PRO100 NigGaZ
 
14.08.13
22:17
да я так и думал, взять результаты обоих запросов и вытащить положительный, валюта же в типе цены указывается, а я от нее и отталкиваюсь, просто было бы хорошо по условию выполнять запрос...
10 КонецЦикла
 
14.08.13
22:28
Все можно, можно и партии без курсоров списывать :)
Но блин думать бесплатно уже разучился :(
11 Злопчинский
 
15.08.13
00:22
мне тут народ подсказывал, может тоже вот пригодится чуток инфы
http://infostart.ru/public/76287/
12 PRO100 NigGaZ
 
15.08.13
12:19
С точки зрения производительности, получать значение периодического реквизита стандартным способом неправильно, когда я подбор правил получение цены (а именно цены и курса) занимало больше времени чем получить остатки, резервы, и заказы и прочую инфу )))) ну это отступление
как избавляться от таких ошибок?
Column 'Товар.Комментарий' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
всегда надо группировать не агрегируемые поля?
13 ДенисЧ
 
15.08.13
12:20
(12) "всегда надо группировать не агрегируемые поля"

Об этом в любом учебник по скулю говорится...
14 Ёпрст
 
15.08.13
12:20
(12) select max (Товар.Комментарий)
15 PRO100 NigGaZ
 
15.08.13
12:27
|SELECT
|Ном Номенклатура
|, MAX(ЭтоГруппа) ЭтоГруппа
|, MAX(Комментарий) Комментарий
|FROM
|(SELECT Номенклатура.ID Ном
|, Номенклатура.IsFolder ЭтоГруппа
|, $Номенклатура.Комментарий Комментарий
|FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|) Товар
|GROUP BY Ном
The text, ntext, and image data types are invalid in this subquery or aggregate expression.
вот вырезал из запроса не получается... :(
16 Ёпрст
 
15.08.13
12:28
(15) ну обрежь свой комментарий до строки в 256 хотя бы.
17 dk
 
15.08.13
12:33
нахрена вообще комментарий тащить?
18 PRO100 NigGaZ
 
15.08.13
12:36
в прайс выводится, хочу в запросе получить все данные данные...
19 Ёпрст
 
15.08.13
12:40
ну и как бэ, оборачивать это в подзапрос вовсе не обязательно
20 PRO100 NigGaZ
 
15.08.13
12:52
В левой части запроса номенклатура, в правой все регистры
а в примере подзапрос как частный случай того что делаю :)
21 Ёпрст
 
15.08.13
12:57
и зачем тебе весь справочник сдался ?
22 PRO100 NigGaZ
 
15.08.13
13:10
Выполняется быстрее, даже проверка по каждому регистру на вхождение в список групп справочника замедляет в 2 раза (как добавил условие запрос с 3,5 сек 9 стал выполняться), а если объединять со справочником и еще ставить условия по реквизитам, то еще хуже становится
а если отбор сделать один раз со справочником а потом лефт джоином с вложенным запросом (7 регистров (2 считают средний остаток за пол года)) то все быстренько отрабатывает
23 PRO100 NigGaZ
 
15.08.13
13:23
C:\LS1C\ВЫГРУЗКАПРАЙСА.ERT    452    ТЗР.Загрузить(рс.ВыполнитьИнструкцию(ТекстЗапроса));    1    6.154344    
C:\LS1C\ВЫГРУЗКАПРАЙСА.ERT    453    ТЗР.Загрузить(рс.ВыполнитьИнструкцию(ТекстЗапроса));    1    3.818454
Первый ресурсы проверяются на вхождение в группу
Второй когда по всему справочнику
24 Ёпрст
 
15.08.13
13:25
нам отсюда не видно твой текст запроса и чем/как ты меряешь
25 PRO100 NigGaZ
 
15.08.13
13:28
это отладчик, прям сюда 200 строк?
26 ЧеловекДуши
 
15.08.13
15:46
Дарю... Функция получения цены:

Сперва вот такой код, для создания ряда функция на сервере:

//Начинается с цифры 5-ть, т.к. первые четыре тебе ненужны, как и последняя, но дал на всякой.
//_____________________________________________________________________________
Функция ПроверкаНаФункцию(ФункПР,режим,Удалить=0) Экспорт   //sp_toEdIzm - 1
    Перем ЗапросSQL, ТекстЗапроса, ТЗ_Приход;
    Перем Рез;
    Перем Текст, _1CRS;
    Перем Мета,СпсЗапроса;
    Перем шшш,СтрЗамНа,СтрИскать;
    Перем ИДспр,ИДспр2;
    
    //---
    Рез=0;
    
    ЗапросSQL=СоздатьОбъект("ODBCRecordSet");
    попытка
        ЗапросSQL.УстБД1С();
        
        Если глОтладкаSQL = 1 Тогда
            ЗапросSQL.Отладка();
        КонецЕсли;
        
    исключение
        глСообщить("Ошибка при создании объекта ""ODBCRecordSet"", обратитесь к системному адмнистратору!", "!");
        Возврат Рез;
    конецпопытки;
    
    Если режим=5 Тогда //Type_ToCena - в место даты, дату по положению
        
        Мета=СоздатьОбъект("MetaDataWork");
        ИДспр = Мета.ИДРеквизитаСправочника("Цены","Цена");
        ИДспр2 = Мета.ИДРеквизитаСправочника("Цены","Единица");
        
        СпсЗапроса = СоздатьОбъект("СписокЗначений");
        
        СпсЗапроса.ДобавитьЗначение("[Спр.Цены]","SC"+Мета.ИДСправочника("Цены"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Цены.ТипЦен]","SP"+Мета.ИДРеквизитаСправочника("Цены","ТипЦен"));
        
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура]","SC"+Мета.ИДСправочника("Номенклатура"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура.БазоваяЕдиница]","SP"+Мета.ИДРеквизитаСправочника("Номенклатура","БазоваяЕдиница"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура.СтавкаНДС]","SP"+Мета.ИДРеквизитаСправочника("Номенклатура","СтавкаНДС"));
        
        СпсЗапроса.ДобавитьЗначение("[Спр.ТипыЦен]","SC"+Мета.ИДСправочника("ТипыЦен"));
        СпсЗапроса.ДобавитьЗначение("[Спр.ТипыЦен.ЦенаВклНДС]","SP"+Мета.ИДРеквизитаСправочника("ТипыЦен","ЦенаВклНДС"));
        
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.БезНДС]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.БезНДС));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС10]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС10));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС20]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС20));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС18]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС18));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС9_09]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС9_09));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС16_67]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС16_67));
    
        СпсЗапроса.ДобавитьЗначение("[Спр.Единицы]","SC"+Мета.ИДСправочника("Единицы"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Единицы.Коэффициент]","SP"+Мета.ИДРеквизитаСправочника("Единицы","Коэффициент"));
        
        //len1 - дата Строкой 8 симв (4 год + 2 мес + 2 день), len2 - Базовый тип цены
        //len3 - Передоваемая номенклатура, т.е. товар, len4 - Единица измерения, на которую надо расчитать цену
        ТекстЗапроса="
        |if   Object_ID('"+ФункПР+"') is null
        |Begin
        |Exec('
        |create FUNCTION  "+ФункПР+"( @len1 varchar(8), @len2 varchar(9), @len3 varchar(9), @len4 varchar(9)) RETURNS numeric(15,2)
        |AS
        |begin
        |declare @tval numeric(15,2);   --Результирующая цена!
        |declare @tval1 datetime;    --Дата ноль 01.01.1753
        |declare @tval2 datetime;    --Дата, на которую надо получить цену
        |declare @tval3 varchar(9);  --Пустой элемент, НУЛЬ
        |declare @tval4 varchar(9);  --Справочник -Цены-, подченен -Номенклатуре-
        |declare @tval5 varchar(9);  --Справочник Единица измерения
        |declare @tval6 int;         --Справочник ТипыЦен -ЦенаВклНДС-
        |declare @tval7 varchar(9);  --Ставка НДС,
        |declare @tval8 numeric(33,30);  --Значение Ставки НДС
        |declare @tval95 numeric(10,3);  --Коэф. значения @tval5, то что было по дефолту
        |declare @tval94 numeric(10,3);  --Коэф. значения @len4, то что стало вместо, пересчет на
        |set @tval = 0;
        |set @tval3 = ''     0   '';
        |
        |if (@len3 is null) or (@len3 = @tval3) or (@len1 is null) or (LTrim(RTrim(@len1)) = '''') or (@len2 is null) or (@len2 = @tval3) RETURN(@tval);
        |
        |set @tval1 = Cast(''17530101'' AS datetime);
        |set @tval2 = Cast(@len1 AS datetime);
        |
        |if (@tval1 >= @tval2) RETURN(@tval);
        |
        |if (@len4 is not null) or (@len4 <> @tval3)
        |set @tval4 = ( Select top 1 Ceny.ID from [Спр.Цены] as Ceny(NOLOCK)
        |            where (Ceny.PARENTEXT = @len3) and (Ceny.[Спр.Цены.ТипЦен] = @len2) and
        |            ( (select top 1 value from _1sconst(NOLOCK)
        |                    where (objid = Ceny.ID) and (id="+ИДспр2+") and (date <= @tval2)
        |                    order by date desc,time desc) = @len4 )
        |            order by Ceny.ISMARK );
        |
        |if (@tval4 is null) or (@tval4 = @tval3)
        |set @tval4 = ( Select top 1 Ceny.ID from [Спр.Цены] as Ceny(NOLOCK)
        |            where (Ceny.PARENTEXT = @len3) and (Ceny.[Спр.Цены.ТипЦен] = @len2)
        |            order by Ceny.ISMARK );
        |
        |if (@tval4 is null) or (@tval4 = @tval3) RETURN(@tval);
        |
        |set @tval = ( Cast( (select top 1 value from _1sconst(NOLOCK)
        |            where (objid = @tval4) and (id="+ИДспр+") and (date <= @tval2)
        |            order by date desc,time desc) AS numeric(15,2)) );
        |
        |if (@tval is null) or (@tval = 0) RETURN(@tval);
        |
        |set @tval5 = ( Left( (select top 1 value from _1sconst(NOLOCK)
        |            where (objid = @tval4) and (id="+ИДспр2+") and (date <= @tval2)
        |            order by date desc,time desc) ,9) );
        |
        |if (@tval5 is null) or (@tval5 = @tval3)
        |set @tval5 = ( Select top 1 Tovar.[Спр.Номенклатура.БазоваяЕдиница] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |
        |if (@tval5 is null) or (@tval5 = @tval3) RETURN(@tval);
        |if (@len4 is null) or (@len4 = @tval3)
        |set @len4 = ( Select top 1 Tovar.[Спр.Номенклатура.БазоваяЕдиница] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |
        |--тут получим ЦенаВклНДС или нет
        |set @tval6 = ( Select top 1 TypeCen.[Спр.ТипыЦен.ЦенаВклНДС] From [Спр.ТипыЦен] as TypeCen(NOLOCK)
        |            where TypeCen.ID = @len2 );
        |
        |-- прибавим НДС
        |set @tval8 = 0;
        |if @tval6 = 0 Begin
        |set @tval7 = ( Select top 1 Tovar.[Спр.Номенклатура.СтавкаНДС] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |if @tval7 = ''[Прч.СтавкиНДС.БезНДС]'' set @tval8 = 0;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС10]'' set @tval8 = 0.1;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС20]'' set @tval8 = 0.2;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС18]'' set @tval8 = 0.18;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС9_09]'' set @tval8 = 0.09998900010999890001099989000;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС16_67]'' set @tval8 = 0.20004800192007680307212288492;
        |end;
        |
        |set @tval = @tval + @tval*@tval8;
        |
        |if (@tval5 = @len4) RETURN(@tval);
        |
        |set @tval94 = ( Select top 1 EdIzmer.[Спр.Единицы.Коэффициент] From [Спр.Единицы] as EdIzmer(NOLOCK)
        |            where EdIzmer.ID = @len4
        |            order by EdIzmer.ISMARK );
        |
        |set @tval95 = ( Select top 1 EdIzmer.[Спр.Единицы.Коэффициент] From [Спр.Единицы] as EdIzmer(NOLOCK)
        |            where EdIzmer.ID = @tval5
        |            order by EdIzmer.ISMARK );
        |
        |if (@tval95 is null) or (@tval95 = 0) set @tval95 = 1;
        |
        |set @tval = @tval*@tval94/@tval95;
        |
        |RETURN(@tval);
        |end
        |')
        |
        |select 2 as Err
        |end else
        |select 1 as Err
        |";
        
        Для шшш = 1 По СпсЗапроса.РазмерСписка()  Цикл
            Если (Найти(ТекстЗапроса,"[")>0) и (Найти(ТекстЗапроса,"]")>0) Тогда
            Иначе
                Прервать;
            КонецЕсли;
            СтрЗамНа="";
            СтрИскать=СпсЗапроса.ПолучитьЗначение(шшш,СтрЗамНа);
            ТекстЗапроса=СтрЗаменить(ТекстЗапроса,СтрИскать,СтрЗамНа);
        КонецЦикла;
        
    ИначеЕсли режим=7 Тогда //Type_ToCena2 - в место даты, дату по положению
        
        Мета=СоздатьОбъект("MetaDataWork");
        ИДспр = Мета.ИДРеквизитаСправочника("Цены","Цена");
        ИДспр2 = Мета.ИДРеквизитаСправочника("Цены","Единица");
        
        СпсЗапроса = СоздатьОбъект("СписокЗначений");
        
        СпсЗапроса.ДобавитьЗначение("[Спр.Цены]","SC"+Мета.ИДСправочника("Цены"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Цены.ТипЦен]","SP"+Мета.ИДРеквизитаСправочника("Цены","ТипЦен"));
        
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура]","SC"+Мета.ИДСправочника("Номенклатура"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура.БазоваяЕдиница]","SP"+Мета.ИДРеквизитаСправочника("Номенклатура","БазоваяЕдиница"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Номенклатура.СтавкаНДС]","SP"+Мета.ИДРеквизитаСправочника("Номенклатура","СтавкаНДС"));
        
        СпсЗапроса.ДобавитьЗначение("[Спр.ТипыЦен]","SC"+Мета.ИДСправочника("ТипыЦен"));
        СпсЗапроса.ДобавитьЗначение("[Спр.ТипыЦен.ЦенаВклНДС]","SP"+Мета.ИДРеквизитаСправочника("ТипыЦен","ЦенаВклНДС"));
        
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.БезНДС]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.БезНДС));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС10]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС10));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС20]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС20));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС18]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС18));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС9_09]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС9_09));
        СпсЗапроса.ДобавитьЗначение("[Прч.СтавкиНДС.НДС16_67]",Мета.ЗначениеВСтрокуБД(Перечисление.СтавкиНДС.НДС16_67));
    
        СпсЗапроса.ДобавитьЗначение("[Спр.Единицы]","SC"+Мета.ИДСправочника("Единицы"));
        СпсЗапроса.ДобавитьЗначение("[Спр.Единицы.Коэффициент]","SP"+Мета.ИДРеквизитаСправочника("Единицы","Коэффициент"));
        
        //len1 - дата Строкой 8 симв (4 год + 2 мес + 2 день), len2 - Базовый тип цены
        //len3 - Передоваемая номенклатура, т.е. товар, len4 - Единица измерения, на которую надо расчитать цену
        //len5 - С НДС (0), без НДС (1)
        ТекстЗапроса="
        |if   Object_ID('"+ФункПР+"') is null
        |Begin
        |Exec('
        |create FUNCTION  "+ФункПР+"( @len1 varchar(8), @len2 varchar(9), @len3 varchar(9), @len4 varchar(9), @len5 int) RETURNS numeric(15,2)
        |AS
        |begin
        |declare @tval numeric(15,2);   --Результирующая цена!
        |declare @tval1 datetime;    --Дата ноль 01.01.1753
        |declare @tval2 datetime;    --Дата, на которую надо получить цену
        |declare @tval3 varchar(9);  --Пустой элемент, НУЛЬ
        |declare @tval4 varchar(9);  --Справочник -Цены-, подченен -Номенклатуре-
        |declare @tval5 varchar(9);  --Справочник Единица измерения
        |declare @tval6 int;         --Справочник ТипыЦен -ЦенаВклНДС-
        |declare @tval7 varchar(9);  --Ставка НДС,
        |declare @tval8 numeric(33,30);  --Значение Ставки НДС
        |declare @tval95 numeric(10,3);  --Коэф. значения @tval5, то что было по дефолту
        |declare @tval94 numeric(10,3);  --Коэф. значения @len4, то что стало вместо, пересчет на
        |set @tval = 0;
        |set @tval3 = ''     0   '';
        |
        |if (@len3 is null) or (@len3 = @tval3) or (@len1 is null) or (LTrim(RTrim(@len1)) = '''') or (@len2 is null) or (@len2 = @tval3) RETURN(@tval);
        |
        |set @tval1 = Cast(''17530101'' AS datetime);
        |set @tval2 = Cast(@len1 AS datetime);
        |
        |if (@tval1 >= @tval2) RETURN(@tval);
        |
        |if (@len4 is not null) or (@len4 <> @tval3)
        |set @tval4 = ( Select top 1 Ceny.ID from [Спр.Цены] as Ceny(NOLOCK)
        |            where (Ceny.PARENTEXT = @len3) and (Ceny.[Спр.Цены.ТипЦен] = @len2) and
        |            ( (select top 1 value from _1sconst(NOLOCK)
        |                    where (objid = Ceny.ID) and (id="+ИДспр2+") and (date <= @tval2)
        |                    order by date desc,time desc) = @len4 )
        |            order by Ceny.ISMARK );
        |
        |if (@tval4 is null) or (@tval4 = @tval3)
        |set @tval4 = ( Select top 1 Ceny.ID from [Спр.Цены] as Ceny(NOLOCK)
        |            where (Ceny.PARENTEXT = @len3) and (Ceny.[Спр.Цены.ТипЦен] = @len2)
        |            order by Ceny.ISMARK );
        |
        |if (@tval4 is null) or (@tval4 = @tval3) RETURN(@tval);
        |
        |set @tval = ( Cast( (select top 1 value from _1sconst(NOLOCK)
        |            where (objid = @tval4) and (id="+ИДспр+") and (date <= @tval2)
        |            order by date desc,time desc) AS numeric(15,2)) );
        |
        |if (@tval is null) or (@tval = 0) RETURN(@tval);
        |
        |set @tval5 = ( Left( (select top 1 value from _1sconst(NOLOCK)
        |            where (objid = @tval4) and (id="+ИДспр2+") and (date <= @tval2)
        |            order by date desc,time desc) ,9) );
        |
        |if (@tval5 is null) or (@tval5 = @tval3)
        |set @tval5 = ( Select top 1 Tovar.[Спр.Номенклатура.БазоваяЕдиница] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |
        |if (@tval5 is null) or (@tval5 = @tval3) RETURN(@tval);
        |
        |if (@len4 is null) or (@len4 = @tval3)
        |set @len4 = ( Select top 1 Tovar.[Спр.Номенклатура.БазоваяЕдиница] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |
        |--тут получим ЦенаВклНДС или нет
        |set @tval6 = ( Select top 1 TypeCen.[Спр.ТипыЦен.ЦенаВклНДС] From [Спр.ТипыЦен] as TypeCen(NOLOCK)
        |            where TypeCen.ID = @len2 );
        |
        |-- прибавим НДС
        |if (@len5 = 0) Begin
        |set @tval8 = 0;
        |if @tval6 = 0 Begin
        |set @tval7 = ( Select top 1 Tovar.[Спр.Номенклатура.СтавкаНДС] From [Спр.Номенклатура] as Tovar(NOLOCK)
        |            where Tovar.ID = @len3 );
        |if @tval7 = ''[Прч.СтавкиНДС.БезНДС]'' set @tval8 = 0;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС10]'' set @tval8 = 0.1;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС20]'' set @tval8 = 0.2;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС18]'' set @tval8 = 0.18;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС9_09]'' set @tval8 = 0.09998900010999890001099989000;
        |if @tval7 = ''[Прч.СтавкиНДС.НДС16_67]'' set @tval8 = 0.20004800192007680307212288492;
        |end;
        |
        |set @tval = @tval + @tval*@tval8;
        |end;
        |
        |if (@tval5 = @len4) RETURN(@tval);
        |
        |set @tval94 = ( Select top 1 EdIzmer.[Спр.Единицы.Коэффициент] From [Спр.Единицы] as EdIzmer(NOLOCK)
        |            where EdIzmer.ID = @len4
        |            order by EdIzmer.ISMARK );
        |
        |set @tval95 = ( Select top 1 EdIzmer.[Спр.Единицы.Коэффициент] From [Спр.Единицы] as EdIzmer(NOLOCK)
        |            where EdIzmer.ID = @tval5
        |            order by EdIzmer.ISMARK );
        |
        |if (@tval95 is null) or (@tval95 = 0) set @tval95 = 1;
        |
        |set @tval = @tval*@tval94/@tval95;
        |
        |RETURN(@tval);
        |end
        |')
        |
        |select 2 as Err
        |end else
        |select 1 as Err
        |";
        
        Для шшш = 1 По СпсЗапроса.РазмерСписка()  Цикл
            Если (Найти(ТекстЗапроса,"[")>0) и (Найти(ТекстЗапроса,"]")>0) Тогда
            Иначе
                Прервать;
            КонецЕсли;
            СтрЗамНа="";
            СтрИскать=СпсЗапроса.ПолучитьЗначение(шшш,СтрЗамНа);
            ТекстЗапроса=СтрЗаменить(ТекстЗапроса,СтрИскать,СтрЗамНа);
        КонецЦикла;
        
    ИначеЕсли режим=6 Тогда //hexto_sp
        //val - 36-ричное число, val1 - ее копия без пробелов, так на всякий случай!
        ТекстЗапроса="
        |if   Object_ID('"+ФункПР+"') is null
        |Begin
        |Exec('
        |create FUNCTION  "+ФункПР+"( val CHAR(9)) RETURNS int
        |AS
        |begin
        |DECLARE val1 CHAR(9)
        |DECLARE @j INT
        |DECLARE @Arr36 CHAR(36)
        |DECLARE @Deci INT
        |
        |Set val1 = LTrim(RTrim(val));
        |Set @Deci = 0;
        |
        |if (val1 = '''') or (val1 is null) RETURN(@Deci);
        |
        |Set @Arr36 = ''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'';
        |Set @j = 1;
        |
        |while @j <= LEN(val1)
        |begin
        |if @j <> 1 Set @Deci = @Deci*36;
        |Set @Deci = @Deci + CHARINDEX(SUBSTRING(val1, @j,1),@Arr36) - 1;
        |Set @j = @j+1;
        |end;
        |
        |RETURN(@Deci);
        |end
        |')
        |
        |select 2 as Err
        |end else
        |select 1 as Err
        |";
    КонецЕсли;
    
    если ЗапросSQL.Подготовить(ТекстЗапроса) = 0 тогда
        глСообщить("Ошибка при подготовке запроса, обратитесь к системному администратору!", "!");
        глСообщить(ЗапросSQL.ПолучитьОписаниеОшибки(), "I");
        Возврат Рез;
    конецесли;      
    
    ЗапросSQL.Открыть();
    ТЗ_Приход=СоздатьОбъект("ТаблицаЗначений");
    ЗапросSQL.ПолучитьРезультатыВ_ТЗ(ТЗ_Приход,1);
    ЗапросSQL.Закрыть();        
    
    //Обработка ТЗ
    Если ТЗ_Приход.КоличествоКолонок()=0 Тогда
        Рез=0;
    Иначе
        Если ТЗ_Приход.КоличествоСтрок()=0 Тогда
            Рез=0;
        Иначе
            Рез=ТЗ_Приход.ПолучитьЗначение(1,"Err");
        КонецЕсли;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции //ПроверкаНаФункцию("sp_tohex");
27 ЧеловекДуши
 
15.08.13
15:47
Тест

    ИначеЕсли режим=6 Тогда //hexto_sp
        //val - 36-ричное число, val1 - ее копия без пробелов, так на всякий случай!
        ТекстЗапроса="
        |if   Object_ID('"+ФункПР+"') is null
        |Begin
        |Exec('
        |create FUNCTION  "+ФункПР+"( val CHAR(9)) RETURNS int
        |AS
        |begin
        |DECLARE val1 CHAR(9)
        |DECLARE @j INT
        |DECLARE @Arr36 CHAR(36)
        |DECLARE @Deci INT
        |
        |Set val1 = LTrim(RTrim(val));
        |Set @Deci = 0;
        |
        |if (val1 = '''') or (val1 is null) RETURN(@Deci);
        |
        |Set @Arr36 = ''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'';
        |Set @j = 1;
        |
        |while @j <= LEN(val1)
        |begin
        |if @j <> 1 Set @Deci = @Deci*36;
        |Set @Deci = @Deci + CHARINDEX(SUBSTRING(val1, @j,1),@Arr36) - 1;
        |Set @j = @j+1;
        |end;
        |
        |RETURN(@Deci);
        |end
        |')
        |
        |select 2 as Err
        |end else
        |select 1 as Err
        |";
    КонецЕсли;
28 ЧеловекДуши
 
15.08.13
15:48
+(27) Чет переменную "@val1" воспринимает, как ссылку :)
29 ЧеловекДуши
 
15.08.13
15:52
+(26) Затем, как получать нужную тебе цену в запросе.

//БазТипЦен - присвоить нужный тебе тип значения...
//Можно брать и по запросу, но у меня оно пока так
ЗапросSQL.УстановитьТекстовыйПараметр("БазТипЦен",БазТипЦен);

//В SELECT-те добавить
sum(dbo.Type_ToCena(Left(Журнал.DATE_TIME_IDDOC, 8),:БазТипЦен,$ПНстр.Номенклатура,$ПНстр.Единица)) as Цена

//Т.е. По пунктам
//1 - Это дата вида ГГГГММДД
//2 - Ссылка на тип цены
//3 - Ссылка на номенклатуру
//4 - Ссылка на единицу измерения
30 ЧеловекДуши
 
15.08.13
15:55
+ должно получиться типо

dbo.Type_ToCena('Некая дата', 'Cылка на тип цены','Ссылка на номенклатуру','Ссылка на единицу измерения')

dbo.Type_ToCena('20130815', '000001000','000001000','000001000')
31 ЧеловекДуши
 
15.08.13
15:58
+ Type_ToCena2 из (26) по пункту "7" получает цену без учета единицы измерения, т.е. если не указана Единица измерения, то берет ту, которая попадется :)
32 PRO100 NigGaZ
 
15.08.13
19:06
Спасибо, это что то невероятно крутое О_о
33 ЧеловекДуши
 
16.08.13
08:18
(32) Не совсем, там есть свои ограничения :)