Имя: Пароль:
1C
1C 7.7
v7: Как лучше получить остатки: запросом или расчетом регистра
0 zelenprog
 
21.09.12
16:03
Для свертки базы надо получить остатки на дату свертки. Дата свертки установлена 31.12.2010.
Скажите пожалуйста, какой способ будет лучше в смысле быстродействия?

1)
   "//{{ЗАПРОС(Остатки)
   |Период с ДатаСвертки по ДатаСвертки;
   |Номенклатура = Регистр.[Остатки].Номенклатура;
   |ЦенаРозн = Регистр.[Остатки].ЦенаРозн;
   |Количество = Регистр.[Остатки].Количество;
   |Сумма = Регистр.[Остатки].Сумма;

или

2) при помощи метода "РассчитатьРегистрыПо(ДатаСвертки)"
1 ДенисЧ
 
21.09.12
16:03
ТА перенести на нужную дату и снять остатки без расчёта :-)
2 Ненавижу 1С
 
гуру
21.09.12
16:04
перейти на 8 ку
3 zelenprog
 
21.09.12
16:04
(1) а как снять?
запросом?
4 zelenprog
 
21.09.12
16:04
(2) не катит
5 Эльниньо
 
21.09.12
16:07
(3) ВыгрузитьИтоги()
6 Cандер
 
21.09.12
16:08
Получай запросом, т.к. ИМХО проще обрабатывать.
Запросы в 7.7 не оптимальны, поэтому разница, думаю, будет не большая.
7 zelenprog
 
21.09.12
16:11
(1),(5) попробовал перенести ТА...
че-то долго переносит
8 zelenprog
 
21.09.12
16:12
запрос по-моему быстрее отрабатывает.
кстати база у меня ДБФ, если что
9 Эльниньо
 
21.09.12
16:13
Получай запросом...
Запросы в 7.7 не оптимальны...
)))
10 zelenprog
 
21.09.12
16:58
Похоже некоторые регистры у меня не закрываются.

В этих регистрах три измерения: Номенклатура, Характеристика, ЦенаРозн.
Так вот некоторые товары не имеют характеристики, и движения по ним пишутся с пустым измерением.
Чем мне это грозит?
11 пипец
 
21.09.12
17:00
ЦенаРозн - измерение ? Оо
12 zelenprog
 
21.09.12
17:04
(11) да, измерение
13 zelenprog
 
21.09.12
17:04
досталось по наследству
14 Ёпрст
 
21.09.12
17:05
(10) если делается  приход и расход с одинаковым набором измерений (хоть и пустыми), то ничем.
В противном случае, табличка итогов будет пухнуть от периода к периоду с геометрической прогрессией
15 Джинн
 
21.09.12
17:12
(8) Это только по-вашему :)
16 Mikeware
 
21.09.12
17:18
взять их прямым запросом.
17 Эльниньо
 
21.09.12
18:07
(16) ВыгрузитьИтоги() на ТА сработает быстрее прямого.
Проверено не раз.
18 Mikeware
 
21.09.12
18:29
(17)Это твои прямые запросы... Ну, мягко скажем,  не совсем прямые....
Прямой запрос почти почти вдвое быстрее выгрузки итогов.
19 Эльниньо
 
21.09.12
18:37
(18) Ещё раз для суровых:
Прямой не на ТА быстрее ВыгрузитьИтоги() в десятки раз.
На ТА медленнее в разы.
20 miki
 
21.09.12
18:39
(13)Зря оправдываешься.
(11)Глянь типовую ТиС...
21 Mikeware
 
21.09.12
18:45
(19) Прямой на ТА быстрее почти вдвое.
Был уверен, потому как профилировал в свое время, и знал, что именно делает ВыгрузитьИтоги.
Но только что попробовал ради интереса ("вдруг дурак все-таки я?". не, не я.... ).
Прямой запрос
Строк-4524
время-24
ВыгрузитьИтоги
Строк-4524
время-47
22 ADirks
 
21.09.12
20:14
Вообще-то, получение остатков при обрезании базы - далеко не самая времяжрущая операция. Чё тут парицца то? Да как тебе понятнее - так и быстрее.
23 zelenprog
 
22.09.12
18:54
(22) а какие еще время жрущие операции? и как их правильно выполнять?
24 zelenprog
 
22.09.12
18:55
есть проблема с удалением документов - чтобы было быстрее вроде надо перенести ТА в начало периода удаления, и начать удалять в обратном порядке
25 КонецЦикла
 
22.09.12
22:07
(0) Тут еще группировки нужны, их колбасить 1С долговато будет
Проще и быстрее выгрузить итоги, тем более операция разовая
26 Nirvana
 
22.09.12
23:12
(0) РассчитатьРегистрыНа(ДатаСвертки+1)
27 ADirks
 
23.09.12
09:00
(24) Проще перед чисткой удалить файлы RA* и RG*, ну и до кучи 1sentry, и чего-то там ещё, что за бух.итоги отвечает. Для пущего ускорения можно удалить все DT*, и ненужные DH* (ненужные - это те виды док., которые полностью удаляются). Сформированные остатки перед этим выгрузить в файл (ЗначениеВФайл(тзВсеОстатки);).
28 mishaPH
 
23.09.12
09:30
(10) пустое значение - это тоже значение. если + без хар-ки и - без то все норм
29 zelenprog
 
24.09.12
10:39
(14),(28) значит у меня все "ОК" с регистрами - закрываются
30 zelenprog
 
24.09.12
10:42
(26) хм.. интересная идея
что-то никто не прокомментировал

раз уж пошла такая пьянка, может быть обсудим все способы?
31 1Сергей
 
24.09.12
10:45
(23) запись движений (проведение) - вот самая жрущая операция
32 Эльниньо
 
24.09.12
10:47
(31) При свёртке?
33 zelenprog
 
24.09.12
10:53
(31) при свертке ведь всего несколько документов проводятся с остатками
34 1Сергей
 
24.09.12
10:53
(32) да. Проведение Ввода остатков - самая долгая операция. Хотя, смотря на какую дату сворачиваем. Если оставляем достаточно большой период, то сдвиг ТА на текущий день может занять тоже не мало времени.
35 1Сергей
 
24.09.12
10:54
(33)не знаю, не знаю. На прошлом месте работал, у нас там было около 50 документов ввода остатков, а в некоторых до нескольких сотен тысяч строк
36 zelenprog
 
24.09.12
10:54
(34) ну получается время занимает не само проведение остатков, а перемещение ТА
37 zelenprog
 
24.09.12
11:19
Подведем итоги :)
На текущий момент обсуждались следующие варианты получения остатков для свертки:

1) Запрос (1С, без переноса ТА)
2) РассчитатьРегистрыНа(ДатаСвертки)
3) Перенос ТА на нужную дату + ВыгрузитьИтоги без расчета регистра
4) Прямой запрос
4.1) Прямой запрос с переносом ТА
4.2) Прямой запрос без переноса ТА
5) РассчитатьРегистрыНа(ДатаСвертки+1)

Из обсуждений следует, что самый быстрый - это прямой запрос с переносом ТА.
Может расставим другие варианты в порядке увеличения времени?
38 Nirvana
 
25.09.12
00:42
(37) Всё зависит от того, на какой момент получать остатки.
Вариант 1: на начало периода - рассчитанные остатки уже есть в базе.
Вариант 2: на любой другой момент в периоде - к остаткам на начало периода будут добавлены все движения от начала периода до этого момента.
Остатки НА 01.01 - это остатки на начало января (вариант 1).
Остатки ПО 31.12 - это остатки по конец декабря (вариант 2).
39 Simod
 
25.09.12
05:49
(0) Свертка базы операция однократная, так что неважно, каким способом или методом будут получены остатки.

Время затраченное на обсуждение проблемы многократно превысило время расчета остатков.
40 1Сергей
 
25.09.12
06:58
(38) остатки на конец периода = остатки на начало следующего периода

С уважением, КЭП
41 Mikeware
 
25.09.12
07:41
(39) время, затраченное на обсуждение, превысило не только время расчета остатков, но и время написания собственной свертки, и самого процесса свертки.
42 Mikeware
 
25.09.12
07:43
(39) а вот насчет "однократности" - я бы поспорил.
у меня "автоподрезка" стоит в шедулере, каждый месяц база на месяцок "укорачивается"... естественно, в часы наименьших нагрузок...
43 Simod
 
25.09.12
09:05
Если база каждый месяц нуждается в "укорачивании", то либо что-то с ней не так, либо у того, кто ее обслуживает.
44 Эльниньо
 
25.09.12
09:31
(38) Ух ты! Это открытие!
45 Mikeware
 
25.09.12
11:06
(43)База довольно большая, уже 81. Даже бэкап создает некоторую нагрузку.
если есть архивная база, в которой хранятся данные за 8 лет - зачем держать большую (более 3 лет) оперативную? вот она и держится автоматом в размере 37 месяцев...
46 Nirvana
 
25.09.12
15:19
(40) Не, ни фига. Рассчитываться они будут по-разному.
Теоретически остатки по 31.12 и на 01.01 могут даже отличаться, если в своё время произошёл какой-нибудь сбой при открытии периода.
47 Mikeware
 
25.09.12
15:20
(46) штатным методом - по разному. оптимальным - одинаково.
48 Nirvana
 
25.09.12
15:50
(47) Как может быть "одинаково", если для одного случая нужен лишь кусок таблицы RG, а для другого придётся ещё и часть RA обрабатывать?
49 Mikeware
 
25.09.12
15:57
(48) штатный метод берет остатки  на предыдущий период, и прибавляет обороты.
оптимизированный запрос берет остатки на ближайший период, и прибавляет или вычитает обороты (в данном предельном случае - о оборотов))
50 Nirvana
 
25.09.12
16:10
(49) Интеллектуальный механизм?
А как он вычислит ближайший период - по разнице дат или по количеству движений между датами?
51 Mikeware
 
25.09.12
16:13
(50) по разнице дат. по количеству - можно сделать, но это потребует дополнительных затрат, сравнимых со стоимостью самого запроса.