Имя: Пароль:
1C
1С v8
СКД: обороты по регистру между документами
0 Asmody
 
15.04.15
19:23
Задачка на сообразительность: даны два документа Док1 и Док2 одного вида. Требуется на СКД получить обороты по некоторому регистру за период между этими документами. Без кода. Документы задаются как параметры СКД.
1 Cyberhawk
 
15.04.15
19:24
Сделать из них моменты времени через выражения СКД, не?
2 Asmody
 
15.04.15
19:26
(1) а ты попробуй
3 Dmitry1c
 
15.04.15
19:31
в смысле, без кода?
4 DirecTwiX
 
15.04.15
19:52
Сделать из них границы через выражения СКД
5 DrShad
 
15.04.15
19:55
Каково вознаграждение?
6 Asmody
 
15.04.15
19:56
(3) в смысле все внутри СКД
7 DirecTwiX
 
15.04.15
19:57
(4) Не, Границ она не знает. Думал, проблема в получении даты для момента.
8 Asmody
 
15.04.15
19:59
(7) вот-вот
9 DarKySiK
 
15.04.15
20:10
А чего мешает в параметры границы передавать по документам вместе с самими документами (если они еще где-то нужны)...
10 Asmody
 
15.04.15
20:18
(9) Куда передавать? Параметры определены в настройках, форма генерится автоматом. "Чистая" СКД, ни строчки другого кода.
11 ДенисЧ
 
15.04.15
20:20
"Асмоде?й (собственно Ашмедай, то есть искуситель) — злой, сластолюбивый демон"

Я всегда (уже over 4 года) говорил, что СКД от лукавого...
12 DarKySiK
 
15.04.15
20:22
(10) печаль
13 DirecTwiX
 
15.04.15
20:29
Регистраторов у регистра несколько?
Время выполнения запроса важно?
У тебя получилось?)
14 mehfk
 
15.04.15
20:43
ВЫБРАТЬ
    Продажи.МоментВремени
ПОМЕСТИТЬ МВ_1
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Регистратор = &Док1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Продажи.МоментВремени
ПОМЕСТИТЬ МВ_2
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Регистратор = &Док2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Продажи.Период,
    Продажи.Регистратор,
    Продажи.НомерСтроки,
    Продажи.Активность,
    Продажи.Номенклатура,
    Продажи.ХарактеристикаНоменклатуры,
    Продажи.ЗаказПокупателя,
    Продажи.ДоговорКонтрагента,
    Продажи.ДокументПродажи,
    Продажи.Подразделение,
    Продажи.Проект,
    Продажи.Организация,
    Продажи.Контрагент,
    Продажи.Количество,
    Продажи.Стоимость,
    Продажи.СтоимостьБезСкидок,
    Продажи.НДС
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ МВ_1 КАК МВ_1
        ПО Продажи.МоментВремени >= МВ_1.МоментВремени
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ МВ_2 КАК МВ_2
        ПО Продажи.МоментВремени <= МВ_2.МоментВремени
15 mehfk
 
15.04.15
20:43
Примерно как-то так.
16 PR
 
15.04.15
20:52
(10) В модуле отчета

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Момент1").Значение = Новый Граница(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Регистратор1").Значение.МоментВремени(), ВидГраницы.Включая);
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Момент2").Значение = Новый Граница(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Регистратор2").Значение.МоментВремени(), ВидГраницы.Включая);
    
КонецПроцедуры


В СКД в параметрах Момент1 и Момент2 соответственно.
17 Asmody
 
15.04.15
21:56
(14) Документы могут не являтся регистратором.
(16) Роман, без кода, на "чистом" СКД
18 Asmody
 
15.04.15
22:00
(13)
> Регистраторов у регистра несколько?
Не имеет значения
> Время выполнения запроса важно?
Время хочется разумное
> У тебя получилось?)
Несколько сегодняшних идей не дали результата. Есть еще несколько, буду пробовать завтра.
19 PR
 
15.04.15
22:03
(17) Не уверен, что без кода получится.
А зачем без кода-то?
20 Asmody
 
15.04.15
22:05
(19) Хочется
21 Asmody
 
15.04.15
22:05
Это же задачка :)
22 PR
 
15.04.15
22:06
(21) Нууу, думаю, что разве что если в выражение параметра воткнуть код, так ведь не втыкается же :))
23 PR
 
15.04.15
22:07
+(22) С учетом того, что делается двумя строчками кода и очень красиво без всяких созданий форм, я бы сделал и не парился :))
24 Asmody
 
15.04.15
22:09
(22) Я остановился на том, что можно через связь запросов перекинуть моменты времени в параметры виртуальной таблицы Обороты.
25 Armando
 
15.04.15
22:58
(17) >>Документы могут не являтся регистратором

Тогда непонятно чего ты хочешь. Когда в параметры виртуальной таблицы передаешь момент времени, ограничение именно на регистратор делается.
26 Armando
 
15.04.15
23:00
Вот запрос который физически на SQL выполняется, когда в параметры суешь момент времени. Такой же можно самому сделать без использования виртуальной таблицы оборотов

SELECT
T1.Fld18168RRef,
T1.Fld18179Turnover_
FROM (SELECT
T2._Fld18168RRef AS Fld18168RRef,
CAST(SUM(T2._Fld18179) AS NUMERIC(26, 8)) AS Fld18179Turnover_
FROM dbo._AccumRg18167 T2
WHERE ((T2._Fld894 = ?)) AND ((T2._Period > ? OR T2._Period = ? AND (T2._RecorderTRef > 0x0000011B OR T2._RecorderTRef = 0x0000011B AND T2._RecorderRRef >= ?)) AND (T2._Period < ? OR T2._Period = ? AND (T2._RecorderTRef < 0x0000011B OR T2._RecorderTRef = 0x0000011B AND T2._RecorderRRef <= ?)) AND T2._Active = 0x01)
GROUP BY T2._Fld18168RRef
HAVING (CAST(SUM(T2._Fld18179) AS NUMERIC(26, 8))) <> ?) T1
27 Asmody
 
15.04.15
23:01
(25) Чего хочу - понятно: есть два документа. Любых. Хоть два События, неважно, они просто задают период. Хочу посчитать, какие, например, продажи были между первым и вторым документом.
28 Armando
 
15.04.15
23:03
(27) Вот по дате и сравнивай
29 Asmody
 
15.04.15
23:08
(28) По какой дате? Или ты предлагаешь самому городить аналог таблицы Остатки?
30 Armando
 
15.04.15
23:12
(29) По полю период. Давай представим, что есть оборотный регистр с одним измерением, пусть будет номенклатура, и ресурс сумма. Как бы ты выполнил свою задачу не на СКД? Хоть кодом, хоть как.
31 Asmody
 
15.04.15
23:37
(30) Взял бы моменты времени от документов. Собственно, в этом состоит суть задачки.
32 Asmody
 
15.04.15
23:37
(31)+ Даже не моменты времени, а границы.
33 Armando
 
15.04.15
23:45
(31) (32) граница это дата. момент времени в твоем случае тоже дата, т.к. ссылку с регистратором ты сравнивать не хочешь
34 Asmody
 
15.04.15
23:47
(33) Ты не понял суть проблемы.
35 Asmody
 
15.04.15
23:54
Задача сводится к тому, как из документа, заданного в параметре СКД, вытянуть МоментВремени (это просто) и подставить его в параметр виртуальной таблицы.
Или, если отойти от СКД к просто запросам, как, передав в запрос параметр типа ДокументСсылка и только его, подставить его момент времени в параметр виртуальной таблицы.
36 Armando
 
16.04.15
00:00
(35) см (26) в 1С это был такой запрос:
выбрать измерение, ресурс из ОбротныйРегистр.Обороты(&МоментВремени1, &МоментВремени2)
37 Asmody
 
16.04.15
00:01
Задача решается без использования виртуальной таблицы, надо просто городить ее аналог в запросе. Задача решается с виртуальной таблицей, но без параметров, сравнением периодов с дополнительными группировками.
На СКД я предполагаю, что ее можно сделать через передачу параметров в связях таблиц. На "голом" запросе, скорее всего, решения не будет.
38 Asmody
 
16.04.15
00:01
(36) Нет параметра типа МоментВремени. Есть параметр типа Документ.
39 Asmody
 
16.04.15
00:02
ДокументСсылка
40 Armando
 
16.04.15
00:03
На СКД через связь наборов можно параметр передать
41 Armando
 
16.04.15
00:05
В одном наборе данных из документа вытаскиваешь момент времени и передаешь его параметром в другой набор данных
42 Asmody
 
16.04.15
00:13
(40) это ты у меня в (37) прочитал и догадался или в (24)?
43 Armando
 
16.04.15
00:22
если под связью таблиц и связью запросов подразумевалась связь наборов данных, то извините
44 Armando
 
16.04.15
00:25
Но я все равно не догоняю. С одной стороны ты хочешь в параметры передать момент времени, а с другой не хочешь сравнивать с регистратором. Даже не знаю что сказать.
45 Asmody
 
16.04.15
00:40
(44) Пишу большими жирными буквами: в параметры передается ДОКУМЕНТССЫЛКА, ни момент времени, ни дата, ничего иного. И что я должен сравнить с регистратором?
P.S. Наборы данных я называю "запросами" автоматически, поскольку ни разу ни у кого не встречал и сам не использовал "набор данных объект", а объединение суть тот же запрос.
46 Armando
 
16.04.15
00:47
(45) ок выражусь точнее. В параметры компоновки ты передаешь ссылку, а в параметры виртуальной таблицы хочешь чтоб передался момент времени. Так?
47 PR
 
16.04.15
00:59
(46) Не момент времени, а граница на основании этого момента времени
48 Armando
 
16.04.15
01:31
(47) не важно.
Если передавать границу на основании момента времени, то условие все равно по регистратору делается.
было передано две границы. одна исключающая, другая включающая.

SELECT
T1.Fld12442RRef,
T1.Fld11029Turnover_
FROM (SELECT
T2._Fld12442RRef AS Fld12442RRef,
CAST(SUM(T2._Fld11029) AS NUMERIC(27, 8)) AS Fld11029Turnover_
FROM dbo._AccumRg11023 T2 WITH(NOLOCK)
WHERE (T2._Period > ? OR T2._Period = ? AND T2._RecorderRRef > ?) AND (T2._Period < ? OR T2._Period = ? AND T2._RecorderRRef <= ?) AND T2._Active = 0x01
GROUP BY T2._Fld12442RRef
HAVING (CAST(SUM(T2._Fld11029) AS NUMERIC(27, 8))) <> ?) T1
49 Trance_1C
 
16.04.15
05:22
Если типы документов-границ однозначны, то можно сначала получить их моменты времени, а потом сделать выборку оборотов за период между ними, не вижу проблемы сделать все это на голом СКД
52 Classic
 
21.04.15
17:56
Чет не доганяю, в чем проблема. Ну используй не Обороты(), а саму таблицу регистра
53 Asmody
 
21.04.15
18:01
(52) Ответ не верный.
54 Asmody
 
21.04.15
18:01
Я, кстати, сделал через связь наборов данных.
55 Cyberhawk
 
21.04.15
19:18
(54) передавал в подчиненный набор? (25) не прав?
56 Зеленый пень
 
23.04.15
12:22
В чем проблема?
Ссылки (регистраторы) сравниваются точно так же как и даты. Если в пределах одной секунды - сравниваем ссылки.
57 DirecTwiX
 
23.04.15
13:28
(56) Ссылки сравниваются по-другому
58 DirecTwiX
 
23.04.15
13:29
(57) Они завязаны на номере таблицы документов.
59 Зеленый пень
 
23.04.15
15:13
(58) Чего? Какие номера?
60 DirecTwiX
 
24.04.15
11:09
(59) Того. Порядковые, таблиц.
Так, например, ссылки заказов покупателей всегда меньше ссылок требований-накладных.