powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / 1с++ Как получить периодические реквизыты на дату
5 сообщений из 5, страница 1 из 1
1с++ Как получить периодические реквизыты на дату
    #35194235
babys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select tt.ndescr, rt.SP1599, j.docno, j.DATE_TIME_IDDOC 
 from DT1611 rt
  inner join _1SJOURN j ON rt.iddoc = j.iddoc -- получаем номер документа и дату
  inner join 
   (select sc84.id, sc84.descr ndescr, ss.sdescr, ss.sid, ss.date, ss.value 
     from sc84 -- получаем номенклатуру
     inner join 
      (select _1SCONST.*, sc219.descr sdescr, sc319.id sid, sc319.PARENText sext 
        from _1sconst --получаем переодический реквизит
         inner join sc319 on sc319.id = _1SCONST.objid  -- получаем ссылку на цену
         inner join SC219 on sc319.sp327 = sc219.id and sc219.descr like '%ПРИХОДНАЯ%' -- определям тип цены
        where _1SCONST.row_id = -- пытаемся получить цену на дату документа
-- поэтому выбираем поледнюю с максимальной датой но меньше чем j.DATE_TIME_IDDOC что есть дата документа
          (select top  1  row_id from _1sconst as ref 
            where ref.date <= j.DATE_TIME_IDDOC -- ограничиваем сверху датой документа
                      and ref.date >= _1sconst.date 
                      AND ref.objid = _1sconst.objid and ref.id = _1sconst.id 
            Order by ref.date desc, ref.time desc, ref.docid desc, ref.row_id desc
          ) and _1sconst.id =  324  -- ограничиваем тип данных для выбора из _1SCONST
      ) ss on sc84.id = ss.sext -- связываем цену и номенклатура
   ) tt on rt.sp1599 = tt.id -- связываем документ и то что получилось в подзапросе
where j.DATE_TIME_IDDOC between '01/01/2008' and '31/01/2008' -- просто ограничиваем объем выборки
order by j.docno, j.DATE_TIME_IDDOC, tt.ndescr -- формируем представление

Вопрос как правильно ограничить выборку периодических реквизитов?
За пример в нотации 1С++ отдельное спасибо :)
...
Рейтинг: 0 / 0
1с++ Как получить периодические реквизыты на дату
    #35194629
babys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде работающий запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select j.docno, j.DATE_TIME_IDDOC, sc84.descr, sc219.descr, _1sconst.value, _1sconst.date
  	from sc84 
		inner join DT1611 rt on rt.sp1599 = sc84.id
		inner join _1SJOURN j ON rt.iddoc = j.iddoc
		inner join sc319 on sc84.id = sc319.PARENText
		inner join _1sconst on sc319.id = _1SCONST.objid
		inner join SC219 on sc319.sp327 = sc219.id and sc219.descr like '%ПРИХОДНАЯ%'
		where _1SCONST.row_id = 
			(select top  1  row_id 
				from _1sconst as ref 
				where _1sconst.date <= CAST(LEFT(j.DATE_TIME_IDDOC,  8 ) as DateTime)
				    and ref.date >= _1sconst.date AND ref.objid = _1sconst.objid and ref.id = _1sconst.id 
				Order by ref.date desc, ref.time desc, ref.docid desc, ref.row_id desc
			) and _1sconst.id =  324  
and (j.DATE_TIME_IDDOC between '20080103%' and '20080104%')
order by j.docno, j.DATE_TIME_IDDOC
...
Рейтинг: 0 / 0
1с++ Как получить периодические реквизыты на дату
    #35195101
Menahem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы Вам рекомендовал периодические реквизиты выбирать средствами 1С, обрабатывая полученную в результате запроса таблицу значений: при выборе периодических реквизитов в прямом SQL-запросе средствами 1С++ я неоднократно сталкивался с тем, что он работает в разы медленнее, чем сначала получить прямым запросом ТаблицуЗначений, потом добавить в неё колонки для значений нужных периодических реквизитов, и заполнить эти колонки в цикле средствами 1С для получения значений периодических реквизитов.
...
Рейтинг: 0 / 0
1с++ Как получить периодические реквизыты на дату
    #35195960
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант для sql2000:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION fn_GetPeriodical (@ObjID char( 9 ), @ID int, @Dat datetime=null)
RETURNS varchar( 255 ) AS
BEGIN
  declare @Result varchar( 255 )
  set @Result=  
  (
    select top  1  Value
    from _1SConst (nolock)
    where OBJID=@ObjId and [ID]=@ID and [Date]<=(case when @Dat is null then [Date] else @Dat end)
    order by [Date] desc
  )
  return(@Result)
END
Не совсем красиво, но по скорости получается быстрее, чем выбирать периодические реквизиты дополнительно при обработке результата запроса в 1С-коде.

Тогда если в нотации 1С++, (если я правильно понял что Вы хотите получить и упрощая пример) будет выглядить примерно так:

Код: plaintext
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.
Процедура Сформировать()
  тз=СоздатьОбъект("ТаблицаЗначений");
  мета=СоздатьОбъект("MetaDataWork");
  одбц=СоздатьОбъект("ODBCRecordset");
  одбц.УстБД1С();
  
  типЦены="'"+мета.ЗначениеВСтрокуБД(ВыбТипЦены)+"'";

  запрос="
  |select
  |  $goods.DESCR as Наименование,
  |  $iv.Цена as Цена_ПНК,
  |  dbo.fn_GetPeriodical(cost.ID, "+мета.ИДРеквизитаСправочника("Цены", "Цена")+", convert(datetime, left(j.DATE_TIME_IDDOC, 8), 112)) as Цена_Спр,
  |  j.DOCNO,
  |  j.DATE_TIME_IDDOC
  |from
  |  _1SJOURN j
  |  inner join $ДокументСтроки.ПриходнаяНакладная dt on dt.IDDOC=j.IDDOC
  |  inner join $Справочник.Цены cost on cost.PARENTEXT=$dt.Товар
  |where
  |  j.DATE_TIME_IDDOC>='20080101'
  |  and j.DATE_TIME_IDDOC<='20080131'
  |";
  одбц.Открыть(Запрос);
  одбц.ПолучитьРезультатыВ_ТЗ(тз,  1 );
  одбц.Закрыть();

  тз.ВыбратьСтроку();
КонецПроцедуры
...
Рейтинг: 0 / 0
1с++ Как получить периодические реквизыты на дату
    #35197359
babys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / 1с++ Как получить периодические реквизыты на дату
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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