Имя: Пароль:
1C
1С v8
СКД: Содинение наборов данных, поле связи XYNULL = X, Y, Null
0 К_Дач
 
09.11.12
12:25
1 набор данных ХозрасчетныйОбороты:
поля
- ВалютаОперации
- ДатаОперации

ВалютаОперации определена как:

ВЫБОР
  КОГДА ХозрасчетныйОбороты.Счет.Валютный
    ТОГДА ХозрасчетныйОбороты.Валюта
  КОГДА ХозрасчетныйОбороты.КорСчет.Валютный
    ТОГДА ХозрасчетныйОбороты.ВалютаКор
  ИНАЧЕ &Рубль
КОНЕЦ КАК ВалютаОперации

ДатаОперации определена как:

НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, ДЕНЬ) КАК ДатаОперации

2 наборданных КурсыВалютСрезПоследних:

запрос:

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Период КАК ДатаКурса,
   КурсыВалютСрезПоследних.Валюта КАК Валюта,
   КурсыВалютСрезПоследних.Курс КАК Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &ТекВалюта) КАК КурсыВалютСрезПоследних

Соединяю наборы:

1. Источник ДатаОперации Приемник ДатаКурса Параметр ----> ДатаСреза
2. Источник ВалютаОперации Приемник Валюта Параметр ----> ТекВалюта

Так вот. Соединение по дате отлично работает.
По валюте работает во всех случаях, если валюта не рубли.
То есть получает курсы валют, все кроме рублей.

Есть мнение, что получение данных в наборе производится ДО передачи в них параметров, которые не являются критичными (все, кроме параметров виртуальных таблиц). Параметр &Рубль, он определяет заполнение поля и критичным для связи не является.

То есть, как я думаю происходит так:
1. Получение данных в наборе.
2. Связывание с другим набором.
3. Заполнение полей в наборах, определенных передачей параметров.

Если определить поле ВалютаОперации = &Рубль и связывать по нему - работать не будет...


Вопрос:

Есть поле XYNULL, могущее принимать значения X, Y, Null.
Как "подменить" Null, чтобы потом по полю организовать связь?

Прокомментируйте, плз...
1 acsent
 
09.11.12
12:27
Как "подменить" Null,

ЕСТЬNULL
2 К_Дач
 
09.11.12
12:30
(1)

Ты не понял... Null не на уровне получения данных в запросе. То есть параметр еще для подмены Null еще не передан, но фактически вместо параметра там Null
3 GLazNik
 
09.11.12
12:33
(0) ОФФ XYN.... ну и поля...
4 samozvanec
 
09.11.12
12:33
isnull(&Рубль,&Рубль)
5 К_Дач
 
09.11.12
12:35
(3) я просто обобщил свой пример.... причем тут название поля то. Какая разница, какие наборы связывать, вопрос то не в этом же.
6 samozvanec
 
09.11.12
12:35
на всякий случай даже так
isnull(isnull(&Рубль, &Рубль), &Рубль)
7 К_Дач
 
09.11.12
12:38
(6) Прочитай внимательно, плз:

То есть, как я думаю происходит так:
1. Получение данных в наборе.
2. Связывание с другим набором.
3. Заполнение полей в наборах, определенных передачей параметров.

isnull(&Рубль,&Рубль) - не работает
8 К_Дач
 
09.11.12
12:39
на момент соединения параметр еще не передан, другими словами
9 GLazNik
 
09.11.12
12:39
(5) для начала бы более понятно сформировать вопрос. я в ваши "подменах" запутался. В запросе можно использовать ЕСТЬNULL и ЕСТЬ NULL
(6) isnull(isnull(isnull(&Рубль, &Рубль), &Рубль), &Рубль) так надежнее будет
10 shuhard
 
09.11.12
12:39
(2)[Null не на уровне получения данных в запросе.]
передавать NULL в запрос
да мсье прост эсперт в извращениях
11 К_Дач
 
09.11.12
12:42
(10) да привязались вы к этому Null, это всего лишь мое предположение.

Упрощу вопрос:

по полю ВалютаОперации = &Рубль связь наборов данных в СКД не работает
12 GLazNik
 
09.11.12
12:42
(8) вот убей, но фразы "на момент соединения параметр еще не передан, другими словами" не понимаю. запрос просто не выполнится без переданных параметров
13 shuhard
 
09.11.12
12:43
(11) [Упрощу вопрос: ]
ню ню
14 К_Дач
 
09.11.12
12:45
(12)

Все верно ты говоришь, это и без слов понятно...
В запросе первого набора есть поле, как написано в (11)

Соединияя со вторым набором, запрос которого:

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Период КАК ДатаКурса,
   КурсыВалютСрезПоследних.Валюта КАК Валюта,
   КурсыВалютСрезПоследних.Курс КАК Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &ТекВалюта) КАК КурсыВалютСрезПоследних


с помощью связи:

Источник ВалютаОперации Приемник Валюта Параметр ----> ТекВалюта

ничего не получаем. я не знаю, как еще понятнее объяснить, ну могу оба запроса тут привести или СКД сохранить в файл и куда-нить залить
15 GLazNik
 
09.11.12
12:46
(11) наверное вам нужно что-то типа такого условия: (ВалютаОперации ЕСТЬ NULL) ИЛИ (ВалютаОперации = &Рубль)
16 shuhard
 
09.11.12
12:48
(15) не а,
надо передать в правый набор валюту и вернуть её для связи

ссылка на сайт СКД выкладывалась на мисту 100500 раз
17 К_Дач
 
09.11.12
12:51
(16) именно, передать в правый набор для связи (то есть в параметр второго набора) но как передать, если он в первом наборе то еще не заполнен...

ткни носом в этот сайт, если нетрудно
18 shuhard
 
09.11.12
12:53
(17) блеать
ну на куя на форуме поиск, если я должен тратить на это время
http://1cskd.ru/2010/10/srez-poslednix-na-kazhduyu-datu-v-skd/
19 К_Дач
 
09.11.12
12:56
(18)

спасибо, конечно...
но ответа на мой вопрос там нет...
20 shuhard
 
09.11.12
12:57
(19) форум так не думает
21 ProDeveloper
 
09.11.12
12:57
22 shuhard
 
09.11.12
12:58
(21) не флюди
23 GLazNik
 
09.11.12
12:58
(19) а приведи весь запрос...
24 К_Дач
 
09.11.12
12:59
В примере по ссылке из (18) соединяют наборы по ЗАПОЛНЕННЫМ полям.

А у меня поле в момент связи еще не заполнено... Я не просто так написал (7)
25 К_Дач
 
09.11.12
13:01
http://depositfiles.com/files/sf2p102gr

вот ссылка на схему компоновки
26 GLazNik
 
09.11.12
13:03
"А у меня поле в момент связи еще не заполнено..." Это как??? взрыв мозга
27 GLazNik
 
09.11.12
13:03
(25) да ну нафиг... текст давай
28 К_Дач
 
09.11.12
13:06
____________________________________________________________
ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, ДЕНЬ) КАК ДатаОперации,
   ВЫБОР
       КОГДА ХозрасчетныйОбороты.Счет.Валютный
           ТОГДА ХозрасчетныйОбороты.Валюта
       КОГДА ХозрасчетныйОбороты.КорСчет.Валютный
           ТОГДА ХозрасчетныйОбороты.ВалютаКор
       ИНАЧЕ &Рубль
   КОНЕЦ КАК ВалютаОперации    
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, Счет В (&СписокСчетов), , , НЕ КорСчет В (&СписокСчетов), ) КАК ХозрасчетныйОбороты

____________________________________________________________

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Период КАК ДатаКурса,
   КурсыВалютСрезПоследних.Валюта КАК Валюта,
   КурсыВалютСрезПоследних.Курс КАК Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &ТекВалюта) КАК КурсыВалютСрезПоследних

____________________________________________________________


2 связи на закладки "связи наборов":

ДатаОперации - ДатаКурса - Параметр ДатаСреза
ВалютаОперации - Валюта - Параметр ТекВалюта
29 К_Дач
 
09.11.12
13:07
(26) а вот так))) ради интереса, скачай схему, встрой в отчет и сформируй - дело 5 секунд
30 ProDeveloper
 
09.11.12
13:14
Далай все в запросе

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ДатаОперации,
ВЫБОР
  КОГДА ХозрасчетныйОбороты.Счет.Валютный
    ТОГДА ХозрасчетныйОбороты.Валюта
  КОГДА ХозрасчетныйОбороты.КорСчет.Валютный
    ТОГДА ХозрасчетныйОбороты.ВалютаКор
  ИНАЧЕ &Рубль
КОНЕЦ КАК ВалютаОперации
Поместить ВТ1
ИЗ РБ.Хозрасчетный.Обороты
;
////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ1.ДатаОперации,
ВТ1.ВалютаОперации,
МАКСИМУМ(КурсыВалют.Период) КАК ПериодДляСвязи
ПОМЕСТИТЬ ВТ2
ИЗ ВТ1 КАК ВТ1
ЛЕВОЕ СОЕДИНЕНИЕ РС.КурсыВалют КАК КурсыВалют
ПО ВТ1.ВалютаОперации = КурсыВалют.Валюта
 И ВТ1.ДатаОперации >= КурсыВалют.Период
СГРУППИРОВАТЬ ПО ВТ1.ДатаОперации, ВТ1.ВалютаОперации
ИНДЕКСИРОВАТЬ ПО ПериодДляСвязи
;
////////////////////////////////////////////
ВЫБРАТЬ
ВТ2.ДатаОперации,
ВТ2.ВалютаОперации,
КурсыВалют.Курс
ИЗ ВТ2 КАК ВТ2
ЛЕВОЕ СОЕДИНЕНИЕ РС.КурсыВалют КАК КурсыВалют
ПО ВТ2.ПериодДляСвязи = КурсыВалют.Период
И ВТ2.ВалютаОперации = КурсыВалют.Валюта


Пользуйся)
31 ProDeveloper
 
09.11.12
13:15
И покури ещё раз ссылку по (18)
32 К_Дач
 
09.11.12
13:19
(30)

Спасибо))

Только я пишу отчет для тонкого клиента, СКД мне нужна, чтобы вытащить на форму настройки отборов и сортировок и еще всякие плюшки... я бы не стал тему создавать, если б удовлетворился решением с помощью запроса.... сначала сам всю голову сломал
33 ProDeveloper
 
09.11.12
13:21
(32) И? Для тонкого и что? В СКД делай все в 1 наборе, срез последних на каждую дату получай в запросе как я тебе написал и будет тебе счастье
34 К_Дач
 
09.11.12
13:23
(31)

все, что написано по ссылке - у меня настроено. честное пионерское.

(33) ну как вариант... по-видимому, так и придется поступить
35 shuhard
 
09.11.12
13:52
(33) зря это, многие функции связи наборов повторить запросом не удастся
36 ProDeveloper
 
09.11.12
14:11
(35) каждый случай индивидуален, по личному опыту скажу что СКД далеко не идеальна и баги в ней есть, почитай хотя бы эту ветку v8: СКД Глюк платформы ? Параметры виртуальных таблиц в СКД и ОТБОР
37 shuhard
 
09.11.12
14:24
(36)[СКД далеко не идеальна и баги в ней есть,]
речь не о багах, а о том, что многие задачи не имеют иных решений, кроме связи наборов
38 К_Дач
 
09.11.12
14:28
(38)

Вобщем, если выборку валюты из ХозрасчетныйОборот убрать во вложенный запрос - работает... вот
39 ProDeveloper
 
09.11.12
14:29
(37) попробуй сделать то, что пишет ТС, в результате в таком случае получается не совсем корректный срез последних на каждую дату для валюты когда она определена в 1 наборе как

ВЫБОР
  КОГДА ХозрасчетныйОбороты.Счет.Валютный
    ТОГДА ХозрасчетныйОбороты.Валюта
  КОГДА ХозрасчетныйОбороты.КорСчет.Валютный
    ТОГДА ХозрасчетныйОбороты.ВалютаКор
  ИНАЧЕ &Рубль
КОНЕЦ КАК ВалютаОперации
через СКД связыванием 2х наборов данных через параметр связи
40 ProDeveloper
 
09.11.12
14:32
Помочь может кстати, если в 1 наборе все поместить во временную таблицу, а потом просто ещё раз все из неё выбрать. И делать через 2 связанных набора СКД по параметрам связи
41 К_Дач
 
09.11.12
14:34
(40) угу, ты прав
42 ProDeveloper
 
09.11.12
14:38
(40) + это все равно будет работать медленнее по производительности, нежели 1 набор и получения среза последних на каждую дату в запросе.
"В итоге делаем вывод что oldschool style вывозит, срез последних на каждую дату в запросе производительнее, чем финт ушами СКД через 2 набора и связи между ними через параметр связи"
43 К_Дач
 
09.11.12
14:50
(42) спорно, потому что фактически набор-запрос - после выполнения компоновки - это тот же самый запрос...

спасибо всем отписавшимся за внимание
44 ProDeveloper
 
09.11.12
14:59
(43) проверено по производительности консолью отчетов СКД
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший