Имя: Пароль:
1C
1C 7.7
v7: Оптимизация РегОстатки.СводныйОстаток
,
0 Масянька
 
18.10.17
09:50
Доброе утро!
ТиС 7.7.
В справочнике "Номенклатура" (форма для подбора) реализовано следующее:
в колонке "Остаток" выводится остаток по фирме (в целом, без учета склада) и в правом нижнем углу окошко с остатками по складам, на форме функция, в которой получаются остатки по складам для текущей номенклатуры (используется РегОстатки.СводныйОстаток()).
Замечены тормоза (не критичны, но есть).
Вопрос: есть вариант оптимизировать?
Спасибо.
62 Ёпрст
 
24.10.17
16:19
и обсуждением
63 Масянька
 
24.10.17
17:57
(62) Извини, задергали.
А что лучше будет в данном контексте (остатки по номенклатуре по складу) для dbf?
64 ManyakRus
 
24.10.17
22:53
надо использовать дополнительный класс "ПоставщикДанных.Справочник"
тогда можно все данные получать одним запросом,
он получает только видимые на экране данные.
65 Масянька
 
25.10.17
11:49
(62) А как дату задать?
Select
   Рег.Номенклатура [Номенклатура :Справочник.Номенклатура],
   Рег.Склад [Склад :Справочник.Склады],
   Рег.Количество

From
[РегистрИтоги.ОстаткиТМЦ] as Рег
WHERE
Рег.period = ('01.10.2017')
Group by Рег.Номенклатура,Рег.Склад
В dbf стоит "01.10.2017".
66 Ёпрст
 
25.10.17
11:53
(65) я ж тебе пример дал :)
Там универсально, независимо от того, какая выставлена периодичность хранения останков.
67 Масянька
 
25.10.17
11:54
(66) Твой пример для меня силён...
Сижу, ковыряю консоль...
68 Ёпрст
 
25.10.17
11:55
+
тебе нужно понимать, какие останки ты хочешь видеть, на ТА или на произвольный момент времени.
Если на ТА, то просто берются останки с таблички RG по последней дате периодичности итогов.
Если на любую дату, то берется предыдущая дата хранения останков и прибавляется оборот с RA с даты пердыдущей периодичности до нужной тебе даты.
69 Ёпрст
 
25.10.17
11:56
+68 берутся итоги с предудыщей даты + оборот с RA
70 Масянька
 
25.10.17
11:56
(68) Останки хочу на дату подбора. В перспективе.
В консоли без даты - хрень полная получается.
71 Ёпрст
 
25.10.17
11:59
72 Масянька
 
25.10.17
16:00
(71) С остатками на начало получилось.
С движениями - нет. Причем, не ругается собака... Молча пусто.
SELECT
    Движения.Номенклатура As [Номенклатура :Справочник.Номенклатура],
    Движения.Склад As [Склад :Справочник.Склады],
    Движения.Количество As Количество
--    Движения.Количество * (1 - Движения.debkred * 2) As Количество
FROM
    [Регистр.ОстаткиТМЦ] As Движения
WHERE
    Движения.IDDOC >= '20171001' And  Движения.IDDOC <= '20171023'
  -- and Движения.Количество > 0
GROUP BY
    Движения.Номенклатура, Движения.Склад
ORDER BY
    Движения.Номенклатура
73 Ёпрст
 
25.10.17
16:19
(72) iddoc - это внутренний идентификатор документа.
Нужно date фильтровать
:)
74 Масянька
 
25.10.17
16:26
(73) Уже разобралась... Тебя пока дождешься - родишь :))))
Но - тебе ОГРОМНОЕ спасибо!
75 Масянька
 
25.10.17
16:29
(73) Кстати, первая строка после select - там будет просто строка с наименованием или полноценная ссылка (со всеми вытекающими последствиями)?
76 Ёпрст
 
25.10.17
16:52
(75) ссылка, ты же метапарсеру задаешь тип вот тут:
[Номенклатура :Справочник.Номенклатура]
77 Масянька
 
25.10.17
16:55
(76) А почему квадратные скобки используются?
78 Ёпрст
 
25.10.17
16:56
(77) просто указание метапарсеру
79 Ёпрст
 
25.10.17
16:56
что нужно полю присвоить определенный алияс (псевдоним) и привести к такому-то типу
80 Масянька
 
25.10.17
16:56
(78) Я тебя обожаю!!! Спасибо!!!
81 Масянька
 
25.10.17
16:57
(79) Про алиас - и коню понятно. Вот про метапарсер была мысль, но лучше уточнить.
82 Злопчинский
 
25.10.17
20:54
(76) а нафига там приводить к типу в последнем масянькином примере?
Ведь
Движения.Номенклатура и без приведения уже будет ссылкой
????
Или я не прав?
83 Aleksey
 
25.10.17
21:01
(82) Нет это будет строка, т.е. по сути id объекта в виде строки
84 Злопчинский
 
25.10.17
21:07
(83) а что из себя представляет ссылка тогда?
85 Aleksey
 
25.10.17
21:20
(84) ссылка содержит вид. Т.е. по строке 248 нельзя однозначно сказать, что это ссылка на "веник" или ссылка на контрагента Иванова
86 Злопчинский
 
25.10.17
21:24
(85) а в регистре ОстаткиТМЦ.Номенклатура - в измерении ссылка или ид?
87 Aleksey
 
25.10.17
21:46
(86) да кто же его помнит как оно в типовой. У меня конкретный ID (указан конкретный тип и вид Справочник.Номенклатура).
Если в конфигураторе в типе значения указать просто "справочник" то будет храниться вид + ID
88 Злопчинский
 
25.10.17
23:11
(87) если в типовой тип измерения Номенклатура есть Справочник.Номенклатура
?
89 Aleksey
 
26.10.17
00:05
(88) ну ты как маленький
http://www.script-coding.com/v77tables.html
90 Aleksey
 
26.10.17
00:06
1.1.1. Хранение ID объекта

ID может иметь 3 представления (уровня) в зависимости от длины (количества значащих символов):

    9 символов – определен тип и вид объекта (например «Справочник.Клиенты»), в ID включается только порядковый номер в 36-ричной системе исчисления. Под порядковый номер отводятся первые 6 символов, последние 3 символа зарезервированы под код базы УРБД.
    13 символов – определен только тип объекта, вид не задан (например «Справочник»). Первые 4 символа – идентификатор вида (как он задан в метаданных), последующие 9 символов – по аналогии с предыдущим пунктом.
    23 символа – не определен тип и вид объекта. В таком случае в первых 2 символах хранится тип объекта (будет рассмотрен ниже), следующие 13 символов формируются аналогично предыдущему пункту.

В некоторых случаях, при указании неопределенного типа объекта (длина ID кода 23 символа) создается дополнительное поле с символом «T» вначале (например, если в справочнике задан реквизит SP235 как неопределенный, то в таблице справочника будет создано еще одно поле TSP235).
91 Aleksey
 
26.10.17
00:17
Соответственно если задан конкретный справочник (Справочник.Номенклатура), то данные хранятся как 9 символов (6 под сам ID объект в 36-ричном формате + 3 символа по УРБД как оно задано в конфигураторе)

Т.е. прямой запрос вернет строку "   248   " (ну или "   248FIL" если создан в урбд копии у которой код FIL)

Если там просто справочник/документ, то будет что то типа " N57 5BTJC   ", где N57 это ID вида, а 5BTJC - 9-ти значный ID объекта
92 Ёпрст
 
26.10.17
08:00
(82) ну ты это, попробуй, что вернёт без типизации и вопрос, сам собой отпадёт
93 tgu82
 
26.10.17
09:16
(12) У меня тоже так сделано. Но если хотят, флагом переключают показывать это или нет. Малость тормозит но не всегда
94 Масянька
 
26.10.17
13:58
(92) Почем расхода нет:
SELECT
    Движения.Номенклатура As [Номенклатура :Справочник.Номенклатура],
    Движения.Склад As [Склад :Справочник.Склады],
   CASE
       WHEN (DEBKRED   = 1) THEN Движения.Количество
       ELSE 0
   END As Расход,
   CASE
       WHEN (DEBKRED   = 0) THEN Движения.Количество
       ELSE 0
   END As Приход
FROM
    [Регистр.ОстаткиТМЦ] As Движения
INNER Join [Журнал] Жур ON Жур.iddoc = Движения.iddoc and Жур.date BETWEEN '20171001'  And '20171025'
GROUP BY
    Движения.Номенклатура, Движения.Склад
ORDER BY
    Движения.Номенклатура

А приход есть.
95 Масянька
 
26.10.17
14:20
+(94) Получилось! :)))
96 Масянька
 
26.10.17
14:55
Вопрос по регистрам (dbf):
стандартный отчет "Ведомость по остаткам" показывает:
нач. ост   приход   расход   кон. ост
   15        11        21       5
запрос:
SELECT
    Остатки.Номенклатура As [Номенклатура :Справочник.Номенклатура],
    Остатки.Склад As [Склад :Справочник.Склады],
    Остатки.Количество As Количество
FROM
    [РегистрИтоги.ОстаткиТМЦ] As Остатки
WHERE
    Остатки.PERIOD = '20171001' And Остатки.Количество > 0
GROUP BY
    Остатки.Номенклатура, Остатки.Склад
ORDER BY
    Остатки.Номенклатура
выдает  - Количество - 5.
Лезу в dbf и вижу 01.10.17 - 5, 01.09.17 - 15.
Вопрос: так как же получить остатки на нач. периода?
Стандартный "Остатки ТМЦ" показывает тоже 15.
97 Масянька
 
26.10.17
15:37
Проверила - за сентябрь движений нет.
Переиндексила БД.
Результат - тот же: в отчете - 15, в запросе - 5.
98 aka AMIGO
 
26.10.17
15:46
(97) Склады совпадают?
99 aka AMIGO
 
26.10.17
15:48
Может, попробовать из запроса убрать склад?
100 Масянька
 
26.10.17
15:48
(98) Хороший вопрос...
Не знаю, как сказать...
2 записи (в dbf). По одному - 0, по другому - 5 (это если смотреть 01.10.2017). Если на 01.09.2017: 15 и 1.
101 Масянька
 
26.10.17
15:50
(99) ИМХО, дело не в запросе. Я же в запросе явно указываю дату. И в dbf (на эту дату) именно те цифры, которые в запросе.
102 aka AMIGO
 
26.10.17
15:52
(101) я имел в виду GROUP BY
    Остатки.Номенклатура, Остатки.Склад
103 Масянька
 
26.10.17
15:54
(102) Тоже самое (5).
104 aka AMIGO
 
26.10.17
15:56
Ну, и последнее, поискал в ветке: Пересчет итогов никто вроде не советовал?
Бывало у меня такое.
105 Масянька
 
26.10.17
15:57
(104) В конфигураторе - все галки - ничего не изменилось.
Это у меня поломатая БД?
106 aka AMIGO
 
26.10.17
16:00
(105) Ну, необычно ведет себя - не значит, что поломатая.
Бывали глюки необъяснимые.
Извини, Масянька, не горазд я на идеи, все закончились..
107 aka AMIGO
 
26.10.17
16:01
Оператор Сводного остатка скопипасть сюда, пожалуйста..
108 Масянька
 
26.10.17
16:01
(106) Причем, по нескольким позициям посмотрела: на 01.10.2017 лежат тек. остатки.
109 Масянька
 
26.10.17
16:01
(107) Чего? Переведи...
110 aka AMIGO
 
26.10.17
16:04
Типа Ост = Регистры.ТвойРегистр.СводныйОстаток(ТвояНоменклатура,[Измерения, желательно пустые],"Остаток[илиКакойТамРеквизитВРегистре]);
111 aka AMIGO
 
26.10.17
16:05
* илиКакойТамРеквизитВРегистре = илиКакойТамРесурсВРегистре
112 Масянька
 
26.10.17
16:07
(110) (111) Так я в консоли делаю.
113 aka AMIGO
 
26.10.17
16:09
(112) Ммм.. понятно..
А то у меня в ФормеСписка есть колонка СвободныйОстаток с формулой
Функция ОстатокТовараНаСкладе()

    //*ВМ@MyCompany, 28-08-2014 14:21:58
    
    Возврат Формат(Регистр.ОстаткиТоваров.Остаток(ТекущийЭлемент(),Склад,"ОстатокТовара") - Регистр.ЧугунныйРезерв.СводныйОстаток(ТекущийЭлемент(),,Склад,"Количество"),"Ч15.3");
    ///ВМ@MyCompany, 28-08-2014 14:21:58

КонецФункции

А внизу окна списка - маркер "Показывать остаток на складе"
114 Масянька
 
26.10.17
16:10
(113) Я пока в консоли запросы пытаюсь делать.
115 aka AMIGO
 
26.10.17
16:11
(114) Я понял уже.. Ладушки, не буду мешать.
116 Масянька
 
26.10.17
16:26
А я правильно понимаю, что если надо остатки на ТА, то прямым запросом (1cqlite, dbf) достаточно взять остатки на начало тек. месяца? Или не правильно?
117 Ёпрст
 
26.10.17
16:38
(116) на начало периодичности хранения останков.
118 Ёпрст
 
26.10.17
16:39
Не у всех стоит месяц. У нас , к примеру 5 дней всегда было.
Это если че, самы быстрый способ для получения итогов и записи движений в регистры.
119 Ёпрст
 
26.10.17
16:40
в (96) ты всего лишь берешь итоги на начало месяца.
Нужно к ним прибавить движения , будет тебе остаток
120 Масянька
 
26.10.17
16:43
(119) Дык, почему: в стандартных отчетах на начало месяца - 15, а мне запрос выдает 5? Да, и в dbf лежит 5.
121 Aleksey
 
26.10.17
16:47
(120) а начальные остатки по отчету + обороты совпадают с конечными?
122 Aleksey
 
26.10.17
16:48
(116)
Запрос.Подставлять("ДатаТА", НачМесяца(ПолучитьДатуТА()));
123 Масянька
 
26.10.17
16:49
(121) Обороты (другим запросом) один в один. А вот остатки (этим запросом) - дают конечный (сегодняшний) остаток.
Вот и думаю - на фига мне обороты?
124 opus70
 
26.10.17
17:00
самый простой способ поменять порядок регистров в 1с очень эффективно помогает
125 Масянька
 
26.10.17
17:05
(124) Хватит мне тут кидать! У меня и так голова прямоугольная уже :)
126 Ёпрст
 
26.10.17
17:35
(123) больше кода. Отсюда не видно чего ты там проверяешь
127 Ёпрст
 
26.10.17
17:35
и остаток на наччало<>остаток на конец
128 Ёпрст
 
26.10.17
17:35
если че.
129 Ёпрст
 
26.10.17
17:35
:)
130 Ёпрст
 
26.10.17
17:36
(120) а на конец месяца сколько ? :)
131 Масянька
 
26.10.17
17:40
(130) Вот этот запрос:
SELECT
    Остатки.Номенклатура As [Номенклатура :Справочник.Номенклатура],
    Остатки.Склад As [Склад :Справочник.Склады],
    Остатки.Количество As Количество
FROM
    [РегистрИтоги.ОстаткиТМЦ] As Остатки
WHERE
    Остатки.PERIOD = '20171001' And Остатки.Количество > 0
GROUP BY
    Остатки.Номенклатура, Остатки.Склад
--    Остатки.Номенклатура
ORDER BY
    Остатки.Номенклатура
в консоли показывает тек. остаток.
132 Ёпрст
 
26.10.17
17:45
(131) And Остатки.Количество > 0 это лишнее
133 Ёпрст
 
26.10.17
17:46
ну и
SUM(Остатки.Количество) Количество
134 Масянька
 
26.10.17
17:46
(132) А без этого пустые выводит.
Ну, дык, зачем обороты-то?
135 Изучаю1С8
 
26.10.17
17:46
А чего 1cqlite по дефолту не на ТА остатки показывает если дату не указывать?
136 Ёпрст
 
26.10.17
17:47
Жалко, что 1sqlite не ругается на неверный синтаксис, как t-sql или fox
137 Ёпрст
 
26.10.17
17:47
(135) конечно нет
138 Масянька
 
26.10.17
17:47
(133) Без разницы - тоже самое.
(136) А что неправильно?
139 Изучаю1С8
 
26.10.17
17:47
Вообще прямойзапрос класс бы уже освоила там синтаксис что для дфб что для скуля один
140 Ёпрст
 
26.10.17
17:48
(134) че ?
141 Изучаю1С8
 
26.10.17
17:48
и мануал есть нормальный
142 Масянька
 
26.10.17
17:50
(141) Кинь мануалом.
143 Масянька
 
26.10.17
17:51
(140) То! Если убрать - выводит пустые кол-ва по складу (другому).
144 Ёпрст
 
26.10.17
17:52
(138) нет агрегатной функции к числовым полям , которые есть в селект листе и которых нет в указании в group by
145 Изучаю1С8
 
26.10.17
17:52
146 Изучаю1С8
 
26.10.17
17:53
147 Масянька
 
26.10.17
17:54
(145) Спасибо. С dbf будет работать?
148 Изучаю1С8
 
26.10.17
17:54
(147) да также через лайт, но синтаксис одинаковый
149 Ёпрст
 
26.10.17
17:54
Биомать, а  ?

SELECT
    Остатки.Номенклатура As [Номенклатура :Справочник.Номенклатура],
    Остатки.Склад As [Склад :Справочник.Склады],
    sum(Остатки.Количество) As Количество
FROM
    [РегистрИтоги.ОстаткиТМЦ] As Остатки
WHERE
    Остатки.PERIOD = :НачПериод
GROUP BY
    Остатки.Номенклатура, Остатки.Склад

.....

мд = СоздатьОбъект("MetaDataWork");
    НачПериод = мд.ПолучитьНачПериода(НачДата);//начало периода
    Запрос.Подставлять("НачПериод",НачПериод);
150 Ёпрст
 
26.10.17
17:55
Если че, класс тебе не поможет.
151 Ёпрст
 
26.10.17
17:55
Всё равно, что доверить мотоцикл человеку, который на велосипеде не умеет ездить
152 Изучаю1С8
 
26.10.17
17:56
Класс более универсальный, запросы почти как на 1С8.
153 Изучаю1С8
 
26.10.17
17:56
Или базу на скуль потом перенесет, запросы переписывать придется? а так все будет работать за редким исключением.
154 Масянька
 
26.10.17
17:56
(149) Я в консоли ковыряю.
(150) Почему?
(151) Ой, можно подумать, что ты ни разу с велика не падал.
155 Изучаю1С8
 
26.10.17
17:57
Только поставщик поменяется.
156 Масянька
 
26.10.17
17:57
(153) Скуль платный. Начальство не ведется.
157 Ёпрст
 
26.10.17
17:57
Если че, в (149) - это останки на ТА, если НачДата в одной периодичности с ТА
158 Изучаю1С8
 
26.10.17
17:58
(156) Есть бесплатные версии.
159 Масянька
 
26.10.17
17:58
(158) Например...
160 Изучаю1С8
 
26.10.17
17:59
(159) SQL Express ограничение 10 гигов
161 Изучаю1С8
 
26.10.17
18:01
Хотя там вроде 1 гиг предел по памяти еще, может не вариант для тебя.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший