powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к ms sql с базой данных 1с. Прайс-лист
9 сообщений из 9, страница 1 из 1
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890881
livesid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Подскажите как выполнить запрос.

Есть документ
_Document6395 - Документ.ТоварнаяНоменклатураСборки
У него есть табличная часть, где указаны номенклатуры и план (количество) по каждой позиции. !!!Цена и итог не указано!!!
_Document6395_VT6404 - Документ.ТоварнаяНоменклатураСборки.НоменклатураТЧ

задача вывести список или в моем случае общую сумму: количество, ценаДействующая, ценаСтабильная. (ценаДействующая и ценаСтабильная - это виды цен в таблице _InfoRg3676 - РегистрСведений.ЦеныНоменклатуры). Где цена документа указана на момент даты документа Документ.ТоварнаяНоменклатураСборки.

Смог только реализовать, сумму: количество, ценаДействующая, ценаСтабильная по цене на текущий день.
Как брать цену в регистре сведений - ЦеныНоменклатуры на момент даты документа Документ.ТоварнаяНоменклатураСборки?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
--План с документа - Документ.ТоварнаяНоменклатураСборки
DECLARE @period date;
SET @period='01.01.4019';

WITH tm_price(id_nomen, nomenclature, id_type, type_price, cost)
	as(
		SELECT T1._nomen as id_nomen, nomen._Description as nomenclature, T1._type as id_type, typePrice._Description as type_price, T1.cost as cost
		FROM (
			SELECT	T4._period as _period,
					T4._Fld3677RRef as _nomen,
					T4._Fld3678RRef as _type,
					T4._Fld3680 as cost
			FROM (
				SELECT  T3._Fld3677RRef as _nomen, T3._Fld3678RRef as _type,
						max(T3._period) as max_period
				FROM _InfoRg3676 as T3
				GROUP BY T3._Fld3677RRef, T3._Fld3678RRef
				) as T2
			INNER JOIN _InfoRg3676 as T4 on T2._nomen = T4._Fld3677RRef and T2._type = T4._Fld3678RRef and T2.max_period = T4._Period) T1
			LEFT JOIN _Reference25 as nomen on T1._nomen = nomen._IDRRef --Справочник.Номенклатура
			LEFT JOIN _Reference56 as typePrice on T1._type = typePrice._IDRRef
		WHERE typePrice._Description in ('Действующая', 'Стабильная')
	)


SELECT doc_plan._Fld6397 as date_plan, doc_plan._Fld6398 as date_plan_month,
	sum(tp_doc_plan._Fld6407) as amount_plan, sum(tp_doc_plan._Fld6407*priceCurrent.cost) as sum_current_plan, sum(tp_doc_plan._Fld6407*priceStable.cost) as sum_stable_plan
FROM _Document6395 as doc_plan --Документ.ТоварнаяНоменклатураСборки
	LEFT JOIN _Document6395_VT6404 as tp_doc_plan on doc_plan._IDRRef = tp_doc_plan._Document6395_IDRRef --Документ.ТоварнаяНоменклатураСборки.НоменклатураТЧ
	LEFT JOIN _Reference25 as nomen on tp_doc_plan._Fld6406RRef = nomen._IDRRef --Справочник.Номенклатура
	LEFT JOIN _Reference25 as nomen_parent on nomen_parent._IDRRef = nomen._ParentIDRRef --Справочник.Номенклатура.Родитель
	LEFT JOIN tm_price as priceCurrent on priceCurrent.id_nomen = tp_doc_plan._Fld6406RRef and priceCurrent.type_price = 'Действующая'
	LEFT JOIN tm_price as priceStable on priceStable.id_nomen = tp_doc_plan._Fld6406RRef and priceStable.type_price = 'Стабильная'
WHERE CONVERT(varchar(max), doc_plan._marked, 2) = '00' and CONVERT(varchar(max), doc_plan._posted, 2) = '01'
	and CAST(doc_plan._date_time as date) >= @period
	and nomen_parent._Code NOT IN (27764, 29491)
GROUP BY doc_plan._Fld6397, doc_plan._Fld6398
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890897
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livesid,

Конечно, не видя данных перед глазами комплексно советы давать - но сходу - а почему бы не делать inner join к РС [ЦеныНоменклатуры] по периоду через BETWEEN - к справочнику цен, у которого есть ДатаНачалаСрокаДействияЦены и ДатаКонцаСрокаДействияЦены?
Джойним [Документ.ТоварнаяНоменклатураСборки] и [Справочник.Номенклатура] - по ID номенклатуры. Из [Документ.ТоварнаяНоменклатураСборки] получаем фактическую дату и ведем ее в [ЦеныНоменклатуры] используя BETWEEN между границами?
Если Даты окончания периода нет - можно предварительно этот регистр обработать в CTE, искусственно создав для него крайнюю границу как максимальное ДатаВремя
Получатся такие островки, куда можно будет попадать извне, как бы

Если я правильно понял задачу, естественно
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890901
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsyMisha
livesid,

Конечно, не видя данных перед глазами комплексно советы давать - но сходу - а почему бы не делать inner join к РС [ЦеныНоменклатуры] по периоду через BETWEEN - к справочнику цен, у которого есть ДатаНачалаСрокаДействияЦены и ДатаКонцаСрокаДействияЦены?
Джойним [Документ.ТоварнаяНоменклатураСборки] и [Справочник.Номенклатура] - по ID номенклатуры. Из [Документ.ТоварнаяНоменклатураСборки] получаем фактическую дату и ведем ее в [ЦеныНоменклатуры] используя BETWEEN между границами?
Если Даты окончания периода нет - можно предварительно этот регистр обработать в CTE, искусственно создав для него крайнюю границу как максимальное ДатаВремя
Получатся такие островки, куда можно будет попадать извне, как бы

Если я правильно понял задачу, естественно
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890909
livesid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попытался накидать в ексель.

BETWEEN - хорошая идея, если правильно понял, создаем виртуальную таблицу Price, где будут указаны периоды начала и конца действия цены для номенклатуры?
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890917
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livesid,

Ну как-то так, да

Вообще, по идее - такие сущности, как ЦеныНоменклатуры должны изначально, с уровня источника данных - идти с периодами, даже в 1С они есть. Под рукой кода сейчас нет, - пороюсь в архивах - если найду - то продемонстрирую

А насчет паттерна соваться в справочник к его датам через BETWEEN с даты, идущей с факта - да, это вполне рациональное рабочее решение
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890919
1C Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livesid
Как брать цену в регистре сведений - ЦеныНоменклатуры на момент даты документа Документ.ТоварнаяНоменклатураСборки?


РегистрСведений.ЦеныНоменклатуры - периодический, Вам нужен срез последних на дату документа, т.е. по интересующим Вас номенклатурам нужно найти значения цен с максимальной датой меньшей либо равной дате документа.

P.S. А почему бы Вам не решить данную задачу на стороне 1С?

P.P.S. Для t-sql есть универсальный способ представления даты - YYYYMMDD - лучше всегда пользоваться им, а не

Код: sql
1.
SET @period='01.01.4019';
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890930
livesid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так. Буду связывать через between
+2000 год, это так храниться в бд

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH tm_price
	as (
		SELECT TOP 1000  ROW_NUMBER() OVER(PARTITION BY nomen._Description, typePrice._Description ORDER BY price._Period ASC) AS RowNumber,
			price._Period as date_price, nomen._Description as nomen, typePrice._Description as type_price, price._Fld3680 as cost
		FROM _InfoRg3676 as price
			LEFT JOIN _Reference25 as nomen on price._Fld3677RRef = nomen._IDRRef --Справочник.Номенклатура
			LEFT JOIN _Reference56 as typePrice on price._Fld3678RRef = typePrice._IDRRef
		WHERE typePrice._Description in ('Действующая', 'Стабильная')	
		)

SELECT tm1.RowNumber, tm1.nomen, tm1.type_price, tm1.cost, 
	tm1.date_price, ISNULL(tm2.date_price, DATEADD(year, +2000, GETDATE())) as date_price2
FROM tm_price as tm1
	LEFT JOIN tm_price as tm2 on tm1.nomen = tm2.nomen and tm1.type_price = tm2.type_price and tm1.RowNumber = tm2.RowNumber-1
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890933
livesid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1C Developer,
к сожалению на стороне 1с, никто делать не будет
...
Рейтинг: 0 / 0
Запрос к ms sql с базой данных 1с. Прайс-лист
    #39890935
livesid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1C Developer,

SET @period='40190101'; - так имеется в виду?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к ms sql с базой данных 1с. Прайс-лист
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]