Имя: Пароль:
1C
1С v8
Вопрос по СКД
, , ,
0 anna_z
 
27.12.20
17:06
Здравствуйте!
Есть регистр сведений, в нем определено измерение "Лицевой счет" и ресурс "Количество жителей". Нужно посчитать, как изменилось количество жителей на определенную дату. То есть взять число жителей из последней записи и вычесть число жителей из предпоследней. Как это сделать средствами СКД, не прибегая к функциям общих модулей?
1 МихаилМ
 
27.12.20
17:27
регистр периодический ?
2 anna_z
 
27.12.20
17:29
Да, по позиции регистратора.
3 rozer76
 
27.12.20
17:54
Объединить два запроса среза на разные даты и вычесть значения
4 Cthulhu
 
27.12.20
18:04
(3) там наверное не так. судя по формулировкам - по каждому(!) лицевому счету надо сравнивать значение, установленное(!) по нему при(!) последний его установке со значением, установленным(!) по нему при(!) пред-последний его установке. а это не так просто (и самое главное - весьма затратный запрос получится если только в не это делать).
5 anna_z
 
27.12.20
18:06
(3) Даты записей различны. Так не получится получить последнюю и предпоследнюю запись.
Например, записи для ЛС1:
1.11 - 2 жильца;
10.11 - 3 жильца;
1.12 - 4 жильца;
А для ЛС2:
1.11 - 1 жилец;
1.12 - 5 жильцов;
Если мы возьмем срезы на 1.11 и 1.12, то получим разность для ЛС1: 4-2 = 2, что неверно.
6 Cthulhu
 
27.12.20
18:14
|ВЫБРАТЬ ПЕРВЫЕ 2
|РсЛицевыеСчета.Период,
|РсЛицевыеСчета.ЛицевойСчет,
|РсЛицевыеСчета.КолчествоЖителей
|ИЗ
|    РегистрСведений.ЛицевыеСчета КАК РсЛицевыеСчета
|ГДЕ
|    РсЛицевыеСчета.Период МЕЖДУ &НачПериода И &КонПериода
|УПОРЯДОЧИТЬ ПО
|    Период УБЫВ
7 Cthulhu
 
27.12.20
18:15
в (4) про реурсоемкость - ошибка, перепутал с "на каждую дату" ))
8 anna_z
 
27.12.20
18:30
(6) Такой запрос возвращает первые 2 ЛС :-)
9 Cthulhu
 
27.12.20
18:51
(8): последние 2
в (0) "Нужно посчитать, как изменилось количество жителей на определенную дату" - в (6) оно и есть (с установкой параметра начпериода на "до рождества христова")
10 ам794123
 
27.12.20
19:53
(0) первая временная таблица - срез последних.  Вторая временная таблица - срез последних без учета данных первой временной таблицы. Ну и разница этих двух таблиц.
11 kumena
 
27.12.20
20:37
так должно работать

Выбрать
    Период
    ,ЛицевойСчет
    ,КоличествоЖителей

Поместить Основная

Из РегистрСведений.ЛицевыеСчета.СрезПоследних(&НужнаяДата)

;

Выбрать
    ПредпоследнийСрез.ЛицевойСчет
    ,Счета.Период
    ,Счета.КоличествоЖителей

Поместить ПредыдущиеЗаписи

Из (
    Выбрать
        Основная.Период
        ,Основная.ЛицевойСчет    
        ,Максимум(Счета.Период)    КАК ДатаСреза    

    Из Основная КАК Основная
        Левое соединение РегистрСведений.ЛицевыеСчета КАК Счета
        По Основная.ЛицевойСчет = Счета.ЛицевойСчет
        и Основная.Период > Счета.Период

    Сгруппировать по
        Основная.Период
        ,Основная.ЛицевойСчет    
        
    ) КАК ПредпоследнийСрез
        
        Левое соединение РегистрСведений.ЛицевыеСчета КАК Счета
        По Основная.ЛицевойСчет = Счета.ЛицевойСчет
        и Основная.ДатаСреза = Счета.Период
        
;


Выбрать
    Основная.ЛицевойСчет
    ,Основная.КоличествоЖителей - ISNULL(ПредыдущиеЗаписи.КоличествоЖителей, 0) КАК Разница
    
Из Основная КАК Основная
    Левое соединение ПредыдущиеЗаписи КАК ПредыдущиеЗаписи
    По Основная.ЛицевойСчет = ПредыдущиеЗаписи.ЛицевойСчет
12 D_E_S_131
 
28.12.20
07:12
(11) Вот это ты накатал... :)
13 toypaul
 
гуру
28.12.20
09:28
Зависит от структуры отчета. Можно сделать без извратов с запросом
14 anna_z
 
28.12.20
16:43
(11) Здорово, конечно, - 2 временные таблицы. Но база очень большая, боюсь мой отчет будет весь день формироваться.))
Написала запрос, который выбирает все записи из регистра и упорядочивает по убыванию периода. Добавила вычисляемое поле "Изменение", выражение:

isNULL(ВычислитьВыражение("КолвоЖителей",  , , "Первая")  - ВычислитьВыражение("КолвоЖителей", , , "Первая(2)"), 0)
В настройках отчета группировки по Населенному пункту, ЛС и детальные записи. Выставила в "Других настройках" количество записей 2. По каждому ЛС изменение верно посчиталось, а вот итоги какие-то кривые. Даже не понятно как они получаются. Может, данные ЛС, у которые больше 2 записей тоже вошли в итоги?
15 toypaul
 
гуру
28.12.20
18:44
(14) с итогам тут будет проблема. судя по выражению на группировках они должны считаться по детальным записям с отбором по значениям группировок, что понятно совсем не то что нужно.

с помощью Сумма не посчитаешь такое и с помощью ВычислитьВыражениеСГруппировкойМассив тоже потому что ВычислитьВыражение внутрих этих функций нельзя использовать.

так что придется использовать запрос. или что сложнее 2 схемы СКД. в первой получать базовую таблицу с вычисленным выражением, а вторую с обычной Сумма
16 kumena
 
28.12.20
18:56
> Вот это ты накатал... :)

легкая разминка на 5-7 минут! )))

> Можно сделать без извратов с запросом

У меня другое мнение, извраты - это без запроса, т.к. на сегодняшний день запрос - это самый быстрый способ получения данных из базы.


> Но база очень большая, боюсь мой отчет будет весь день формироваться.))

фройляйн, вы попробуйте, а потом уже мнение высказывайте. это не тяжелый запрос.
17 kumena
 
28.12.20
18:56
В любом случае - всем удачи!
18 МихаилМ
 
28.12.20
19:46
(16) у "фройляйн" с мужским полом  если  не включено "разрешить итоги срез полследних" - то 2 скана (фул индекс - без разницы). иначе - 1. повод для увольнения из-за проф непригодности.
19 ам794123
 
28.12.20
19:51
(16) этот запрос на любой базе будет выполнятся секунды.
20 Дык ё
 
28.12.20
20:18
(14) соедини два запроса в одной схеме с передачей параметров в настройках соединения. а (15) не слушай, он щас насоветует.. :)
21 Cthulhu
 
28.12.20
20:47
бльо накатали.
еще раз. если нужны даты и значения двух последних установок - простенький запрос (6), если надо - от него полпинка до "разницы". и полтора - до сведЕния к по-датной "шахматке".
ИЛИ ЧО НАДО???