Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос по СКД

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

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

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

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

;

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

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

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

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

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


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

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

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

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

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

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


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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.