Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Получить историю изменения цен прямым запросом (число прочтений - 1193 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Получить историю изменения цен прямым запросом
24. Мая 2021 :: 20:00
Печать  
Добрый день!

Конфигурация "Торговля и Склад".
Нужно получить историю изменения цен указанного типа цен за определенный период.
База - DBF.
В документе по описанию 1С++ написано, что "голый" прямой запрос только с помощью библиотеки 1С++ будет довольно громоздким:

Код
Выбрать все
|SELECT 
|	СпрН.Descr AS Наименование,
|	Цены.Цена as [Цена $Число]
|FROM
|	$Справочник.Номенклатура СпрН
|LEFT JOIN
|	$Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
|                           $СпрЦ.ТипЦен = :ТипЦен";
|LEFT JOIN (
|	SELECT
|		Период.objid as objid,
|		Период.value as Цена
|	FROM 1sconst as Период
|	WHERE
|		Период.date IN
|		(SELECT
|			MAX(Константа.date)
|		FROM 1sconst as Константа
|		WHERE
|			(Константа.date <= :ВыбДата ~~)
|			AND (Константа.id = $ИсторияРеквизита.Цены.Цена)
|			AND (Константа.objid = Период.objid)
|		)
|		AND Период.id = $ИсторияРеквизита.Цены.Цена
|	) as Цены ON Цены.objid = СпрЦ.id
 



Может быть с помощью класса "ПрямойЗапрос" этот запрос будет проще?
К сожалению, я классом "ПрямойЗапрос" ни разу не пользовался.
Действительно ли его использование упрощает написание прямых запросов?

Подскажите, пожалуйста, как написать запрос по истории цен с помощью этого класса. Хотя бы посоветуйте с чего начать.

Кстати, где скачать последнюю версию класса "ПрямойЗапрос"?
  
Наверх
ICQ  
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Получить историю изменения цен прямым запросом
Ответ #1 - 25. Мая 2021 :: 08:32
Печать  
Код (C++)
Выбрать все
ТекстЗапроса = "
		|SELECT
		|	спрНом.id [Номенклатура $Справочник.Номенклатура]
		|	,$ПоследнееЗначение.Цены.Цена(спрЦенРоз.ID, :ТекДата) КАК ЦенаРозн
		|FROM
		|  Справочник.Номенклатура спрНом
		|LEFT JOIN Справочник.Цены спрЦенРоз
		|	ON $спрЦенРоз.Владелец = спрНом.id and $спрЦенРоз.ТипЦен = :ВыбТипЦен
		|LIMIT 100
		|";

	ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
	ПрямойЗапрос.Текст = ТекстЗапроса;
	ПрямойЗапрос.РежимОтладки = 1;

	ТипЦенПродажи = глПользователь.ОсновнойТипЦенПродажи;
	ПрямойЗапрос.УстановитьТекстовыйПараметр("ВыбТипЦен", ТипЦенПродажи);
	ПрямойЗапрос.УстановитьТекстовыйПараметр("ТекДата", ТекущаяДата());

	тз = СоздатьОбъект("ТаблицаЗначений");
	ПрямойЗапрос.Выполнить("ТаблицаЗначений").Выгрузить(тз);
	тз.ВыбратьСтроку(); 



Скачать можно тут:
https://www.1cpp.ru/forum/YaBB.pl?num=1273512019
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Получить историю изменения цен прямым запросом
Ответ #2 - 25. Мая 2021 :: 09:32
Печать  
Спасибо!

Только мне нужно выбрать изменение цен за период, а не просто последнюю цену.
Поэтому наверно придется все-таки вручную писать запрос по таблице _1sconst.

Вчера вечером написал вот такой запрос:

Код
Выбрать все
	ТекстЗапроса = "
	|SELECT 
	|	СпрНоменклатура.Id	 		AS [Номенклатура $Справочник.Номенклатура],
	|	СпрНоменклатура.Descr 		AS Наименование,
	|	СпрНоменклатура.Code 		AS КодНоменклатуры,
	|	СпрЦены.ТипЦены				AS ТипЦены,
	|	ИзменениеЦен.Цена 			AS Цена,
	|	ИзменениеЦен.ДатаИзменения 	AS ДатаИзменения
	|FROM
	|		(SELECT *, $СпрЦены1.ТипЦен AS ТипЦены FROM $Справочник.Цены СпрЦены1 WHERE $СпрЦены1.ТипЦен = :ТипЦен) AS СпрЦены
	|	LEFT JOIN (
	|		SELECT
	|			objid as objid,
	|			value as Цена,
	|			date as ДатаИзменения
	|		FROM _1sconst AS Константы
	|		WHERE
	//|				(Константы.date BETWEEN :НачДата AND :КонДата~)
	//|			AND
	|				(Константы.id = $ИсторияРеквизита.Цены.Цена)
	//|			AND (Константы.objid = СпрЦены.id)
	|		) AS ИзменениеЦен ON СпрЦены.id = ИзменениеЦен.objid
	|	LEFT JOIN
	|		$Справочник.Номенклатура СпрНоменклатура ON СпрЦены.ParentExt = СпрНоменклатура.ID
	|ORDER BY СпрНоменклатура.Descr, СпрНоменклатура.id, ИзменениеЦен.ДатаИзменения
 



Сейчас этот запрос выбирает все изменения цен по всей номенклатуре по указанному типу цен.

Но в этом запросе есть две проблемы:

1) не срабатывает проверка периода, выдается ошибка
"Ошибка преобразования даты или времени из символьной строки."
Поэтому я пока проверку периода закомментировал.

2) Почему-то в результат запроса не попадает самая первая строка из истории цен номенклатуры с датой 01.01.1980 и пустым значением цены.

Как исправить эти два пункта? Подскажите плиз.

А насчет класса "ПрямойЗапрос" - сейчас буду пробовать "переложить" свой запрос для этого класса.
  
Наверх
ICQ  
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Получить историю изменения цен прямым запросом
Ответ #3 - 25. Мая 2021 :: 13:07
Печать  
Давно не работал с ПрямымЗапросом. В документации сразу находится такое:
$История.ВидОбъекта(НачалоПериода,КонецПериода,Реквизиты,ДопУсловия,Соединения)

Пример:
ВЫБРАТЬ История.*
ИЗ
  $История.ОсновныеСредства(
  :НачалоПериода
  ,:КонецПериода~
  ,(Подразделение,СрокИспользования)
  ,($СпрОС.ПометкаУдаления = 0)
  ,ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОсновныеСредства КАК СпрОС $nolock
          ПО $СпрОС.ТекущийЭлемент = ТекущийЭлемент) КАК История

Т.е. в твоем случае будет что-то типа:

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