|
Как правильно и надежно получать остатки по регистрам? | ☑ | ||
---|---|---|---|---|
0
gae
13.10.18
✎
10:58
|
Ситуация:
Имеем регистр бухгалтерии, Хозрасчетный. Сегодня 13 октября, в базе постоянно вводятся новые документы текущей датой. Итоги по регистру рассчитаны по 30.09.2018. Нам надо прочитать запросом остатки на 02.10.2018 00:00:00 (на начало секунды). Например, по счету 43, не суть важно. Используем запрос, по виртуальной таблице остатков: "РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, ..." Остатки выбираются то правильные, то неправильные. Похоже ловится ситуация, когда вводится документ от 13.10.2018, и запись в регистре уже есть, а в таблице итогов актуальный итог еще не обновлен. То есть виртуальная таблица остатков читает неактуальное состояние таблицы итогов и вычитает корректные сформированные записи с 02.10.2018 по 3999 год, получается неправильный остаток на 02.10.2018. Правильно я рассуждаю? Выполнение запроса в транзакции не помогает. Похоже надо как-то блокировать. Как именно? |
|||
1
Фрэнки
13.10.18
✎
11:07
|
Традиционно уже приходится напоминать топикстартерам, что без включения в описание проблемы версии конфигурации и платформы, невозможно рассчитывать на адекватные и соответствующие проблеме подсказки и рекомендации
|
|||
2
gae
13.10.18
✎
11:11
|
(1) Я счел, что это относится к всей платформе 1С:Предприятие 8.
На данный момент 8.3.10.2299, конфигурация УПП. |
|||
3
Cool_Profi
13.10.18
✎
11:12
|
Проведение документа выполняется в транзакции всегда. И остатки обновляются в той же транзакции. Есть подозрение, что у вас там перемудерно с настройками сервера
|
|||
4
gae
13.10.18
✎
11:17
|
(3) Но когда читаем без транзакции, то можем ведь теоретически поймать состояние, когда запись регистра уже есть, а итоги не обновлены? Блокировки же на такое чтение распространяются?
|
|||
5
Фрэнки
13.10.18
✎
11:21
|
(4) у тебя в любом случае итоги есть только в одной версии, в твоем описании - это по 30.09.2018 (конец дня)
|
|||
6
Cool_Profi
13.10.18
✎
11:22
|
(4) Нет, не можем. Ибо транзакция это ACID. Или всё записано, или ничего не записано.
Если не колдовать с скулем. |
|||
7
Cool_Profi
13.10.18
✎
11:23
|
(6) +поясниение
https://ru.wikipedia.org/wiki/ACID |
|||
8
echo77
13.10.18
✎
11:23
|
(4) Не можем, Итоги рассчитываются и пишутся в той же транзакции, что и запись движений. Поправьте меня, если это не так.
То что итоги рассчитаны по 30.09.2018 не играет никакой роли, т.к. вы получаете остатки после даты рассчитанных итогов - поэтому 1С:Предприятие будет рассчитывать итог отталкиваясь от Актуальных Итогов по таблице оборотов "назад" |
|||
9
gae
13.10.18
✎
11:28
|
(8) То что они в одной транзакции, я не сомневаюсь.
Но я явно вижу отклонение от реальных остатков на значение в записи, по только что проведенному документу. Например, остаток на 02.10.2018 у меня 10, а я получаю 11. Вижу, что есть документ реализации на 1 шт, только что проведенный текущим временем 13.10.2018. То есть в некорректных итогах было еще 10, запись на -1 уже появилась, я получил остаток 11. Пока только такое объяснение. |
|||
10
gae
13.10.18
✎
11:29
|
(6) Не знаю, к сожалению, что на объекте за сервер и как настроен. Но вариант работы серверный.
|
|||
11
Cool_Profi
13.10.18
✎
11:30
|
(10) Вот и нужно узнать. И настучать в морду лица админам.
|
|||
12
gae
13.10.18
✎
11:31
|
(11) Чтоб "стучать морду", надо сначала самому разобраться в теме, а то неудобно может получиться :)
|
|||
13
Фрэнки
13.10.18
✎
11:35
|
(10) тогда нужно еще и версию скуля указывать. Там тоже были какие-то проблемы в прошлых релизах. Не все версии скуля были удачно совсместимы с версиями платформ 1С и там то патчи, то сервис-паки какие-то требовались. Но это надо уточнять. Я помню только, что какие-то проблемы с остатками/итогами/оборотами/сведениями в виртуальных таблицах регистров возникали, но частности мне сейчас на ум не приходят. Гуглить не очень понятно как - инфы мало.
|
|||
14
echo77
13.10.18
✎
11:37
|
попробуйте пересчитать Актуальные итоги по регистру бухгалтерии и потестировать базу.
Проблема не в способе получения остатков |
|||
15
gae
13.10.18
✎
11:44
|
(14) Итоги недавно пересчитывали. Если бы они были некорректные, то результат получался бы некорректный, но всегда одинаковый, как я понимаю. Тестирование долгое, если быстрее решить не получится, то потом будем делать.
|
|||
16
gae
13.10.18
✎
11:59
|
Вот сейчас просто взял ОСВ по счету 43, за 02.10.2018, поформировал несколько раз, один раз поймал другое состояние остатков. Отличия - на те же величины, что в нескольких только-что проведенных документах от 13.10.2018 (они с разницей в несколько секунд проведены, смотрел в ЖР).
|
|||
17
gae
13.10.18
✎
13:16
|
(5) Всегда есть еще "актуальные итоги", которые "на конец времён", записываются с датой 01.11.3999. Если, конечно, по регистру вообще итоги не отключены.
|
|||
18
Скиурус
13.10.18
✎
13:37
|
Не может ли быть так, что кто-то перепроводит старый документ (до 02.10)?
|
|||
19
gae
13.10.18
✎
13:57
|
(18) Очень вряд ли, сентябрь закрыт, да и такая ерунда наблюдается и на 01.10.2018 00:00:01, то есть как только остатки начинают читаться на с таблицы итогов от 30.09.2018, а от актуальных, так сразу начинают скакать.
Выполнение запроса в транзакции не помогает. "Для изменения" не помогает. Ловлю отклонения, и они как раз совпадают с тем, что идет в только что вводимых документах. |
|||
20
hhhh
13.10.18
✎
14:50
|
(19) всё, что после 01.10.2018 00:00:01 остатки считаются от актуальных. Где вы нашли, что не от актуальных?
|
|||
21
gae
13.10.18
✎
14:53
|
(20) Я с самого начала пишу, что они считаются от актуальных, с вычитанием записей.
|
|||
22
hhhh
13.10.18
✎
15:02
|
(21) ну, значит в коде чего-то начудили, смотрите свой код. И запросы.
|
|||
23
Сияющий в темноте
13.10.18
✎
16:10
|
Возможнло,кто то отложеннле допроведение велючил,тогда сами виноваты
|
|||
24
Сияющий в темноте
13.10.18
✎
17:12
|
Еще не забываем,что,если в отчете транзакция не открыта,то при выборе двумя запросами из двух таблиц получаем часто,что из первой таблицы выбрали данные до проведения документа,а из второй после.
|
|||
25
Фрэнки
13.10.18
✎
18:18
|
может еще и срабатывать граница, а не запрос на дату-время.
|
|||
26
gae
13.10.18
✎
19:24
|
(24) Тут прямо на одном запросе и одной таблице проблема.
|
|||
27
dmpl
13.10.18
✎
19:54
|
(26) А если поставить закладку в модуле набора записей по поводу несовпадения период записи с датой регистратора?
|
|||
28
gae
14.10.18
✎
06:54
|
(27) Там типовые документы проводятся, и у них движения имеют дату-время документа. Если предположить что они временно датой 01.10.2018 записываются, то я бы видел искажение остатка в другую сторону.
|
|||
29
Мимохожий Однако
14.10.18
✎
07:40
|
Текст запроса секретный?
|
|||
30
gae
14.10.18
✎
09:18
|
(29) Да любой простой запрос по виртуальной таблице остатков или остатков и оборотов, например:
ВЫБРАТЬ ХозрасчетныйОстатки.Организация, ХозрасчетныйОстатки.Счет КАК Счет, ХозрасчетныйОстатки.Субконто1 КАК Субконто1, ХозрасчетныйОстатки.Субконто2 КАК Субконто2, ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток, ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток ИЗ РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки В общем как только остаток начинает рассчитываться от актуальных итогов, с вычитанием записей от требуемой даты остатков по дату 01.11.3999, то запрос может вернуть некорректные остатки, если в базу активно вводятся документы текущей датой. Наблюдаю это на работающей базе, параметры и тип сервера пока не известны. Например, если сейчас, 14.10.2018 вводятся документы, то остаток на 02.10.2018 не могу получить без вероятной ошибки. |
|||
31
shuhard
14.10.18
✎
10:11
|
(0)[ не могу получить без вероятной ошибки.]
топик откровенная лажа вместо того, чтобы разобраться в причинах, а это можно сделать и напрямую на сиквеле и техжурнолом, обсуждается то, что не имеет не имеет повторения ни у кого |
|||
32
Cyberhawk
14.10.18
✎
10:19
|
RCSI + запрос в транзакции спасет тебя
|
|||
33
Cyberhawk
14.10.18
✎
10:20
|
А так непонятно, чему ты там удивляешься. "Nolock" он и в Африке "Nolock"
|
|||
34
Cyberhawk
14.10.18
✎
10:59
|
(6) "Нет, не можем" // Здрасти, как же по-твоему грязное чтение работает?
|
|||
35
gae
14.10.18
✎
11:09
|
(31) >то, что не имеет не имеет повторения ни у кого
На 100% уверен? |
|||
36
Cool_Profi
14.10.18
✎
11:11
|
(34) Грязное чтение при нормальной транзакции?
|
|||
37
Cyberhawk
14.10.18
✎
11:40
|
(36) О какой транзакции речь?
Он тебя спрашивет в (4) "читаем без транзакции, то можем ведь теоретически поймать состояние" |
|||
38
Cool_Profi
14.10.18
✎
12:08
|
(37) Да никакой транзакции, Кибер, чего вы полощете языком нёбо?
Документ же проводится так просто, никому ничего не обещает... |
|||
39
hhhh
14.10.18
✎
12:12
|
(38) да всё тут более прозаично, он ведь берет остатки не на момент документа, а на начало секунды. Тут и без транзакций фигня получится.
|
|||
40
gae
14.10.18
✎
12:18
|
(38) Запись в регистр производится в транзакции (при проведении документов).
Читаем остатки запросом без транзакции (как во всех типовых отчетах). Получаем некорректные остатки из-за того что будущими числами ведется изменение данных в регистре, а остатки рассчитываются от актуальных итогов с вычитанием записей от даты остатков по 01.11.3999. То есть в расчете участвуют постоянно изменяемые записи таблиц. Хотя пробовал уже и чтение в транзакции. Один фиг ловится искажение остатков. |
|||
41
gae
14.10.18
✎
12:25
|
(39) В чем проблема с получением остатка на дату-время/ начало-конец секунды?
|
|||
42
gae
14.10.18
✎
13:06
|
Короче говоря воспроизвел я эту ситуацию на тестовом стенде (MSSQL 2014, 8.3.10.2580).
Конфигурация с регистром накопления, документом, который пишет много записей в этот регистр, чтобы несколько секунд все выполнялось. И обработка, которая постоянно пинает запрос по остатку на дату, и как только фиксирует изменение, то выводит искаженный остаток. В одном сеансе запускаем обработку, в другой проводим - отменяем проведение документа, датой больше чем дата остатка. Если режим совместимости конфигурации "Версия 8.2.13" или "Версия 8.2.16", то проблема воспроизводится. Как с чтением без транзакции, так и с чтением в транзакции (правда, немного по разному). Без режима совместимости, или в режиме совместимости с 8.3 (любом) - проблема не воспроизводится. Что-то значит в 8.3 подвинитили. |
|||
43
Feanor
14.10.18
✎
14:12
|
(42) напиши в запросе на чтение остатков, который выполняется в транзакции в режиме совместимости с 8.2 конструкцию "ДЛЯ ИЗМЕНЕНИЯ", после этого будут выводиться ошибочные остатки?
|
|||
44
gae
14.10.18
✎
14:18
|
(43) Да, пробовал, тоже ошибка. Также что автоматические, что управляемые блокировки - без разницы, ошибка ловится.
Вот теперь сижу и думаю о судьбах работающих на конфигурациях УПП, УТ в режиме совместимости с 8.2... |
|||
45
Feanor
14.10.18
✎
14:18
|
+(43) или управляемый режим блокировок?
|
|||
46
Feanor
14.10.18
✎
14:21
|
(44) в автоматическом режиме c "ДЛЯ ИЗМЕНЕНИЯ" не должно быть ошибки.
В управляемом режиме до чтения остатков неплохо было бы поставить управляемую блокировку. |
|||
47
gae
14.10.18
✎
14:22
|
(45) Хотя стоп, включил автоматические блокировки + "ДЛЯ ИЗМЕНЕНИЯ" - просто возникает блокировка, ты прав.
|
|||
48
Feanor
14.10.18
✎
14:28
|
(47) В упр. режиме попробуй поставить блокировку, тоже будут ожидания, но кривых остатков быть не должно
|
|||
49
Cyberhawk
14.10.18
✎
16:09
|
(38) Хз о чем ты
|
|||
50
Cyberhawk
14.10.18
✎
16:10
|
(40) Что тебя смущает? Вроде Я выше написал рецепт
|
|||
51
Фрэнки
14.10.18
✎
16:58
|
(40) // Один фиг ловится искажение остатков.
А ведь я не зря запросил версию конфигурации, на которой вашим пользователям хочется видеть остатки. |
|||
52
Фрэнки
14.10.18
✎
16:59
|
т.е. с учетом поста (42) становится тем более очевидно.
|
|||
53
gae
14.10.18
✎
17:57
|
(51) Не зря, любые детали могут иметь значение.
|
|||
54
gae
14.10.18
✎
18:36
|
(50) Я не очень в технологических вопросах силен, поэтому до меня не сразу и не все доходит. На данный момент я понял что в 8.3 (в режиме совместимости с 8.3) у баз данных на MSSQL режим RCSI включен по умолчанию, поэтому там такого эффекта искажения остатков не наблюдается, так как запрос (будь он в транзакции или нет) будет читать старую версию данных, пока транзакция по записи движений и апдейта итогов не закончится. Верно?
|
|||
55
Cyberhawk
14.10.18
✎
19:19
|
(54) Если в конфигурации разрешен упр. режим и в свойствах регистра / регистратора движения пишутся под ним же, то верно.
Но вообще обычно к отчетам такой строгости получения данных не предъявляют, т.к. все равно через секунду после его формирования ситуация с остатками может измениться. На 8.2 (без версий RCSI) запросы в транзакциях тоже спасают, но будешь ловить ожидание на блокировке. |
|||
56
gae
14.10.18
✎
19:26
|
(55) >>Но вообще обычно к отчетам такой строгости получения данных не предъявляют, т.к. все равно через секунду после его формирования ситуация с остатками может измениться.
Фиг знает, если заведомо известно что данные меняются только текущим числом, то ситуация получения отчетом неверных остатков за прошлые дни выглядит достаточно проблемной. |
|||
57
Cyberhawk
14.10.18
✎
20:46
|
Ну и отчеты в 8.2 "из коробки" допускают грязное чтение, т.к. длительность блокирующего чтения (в транзакции) может быть значительной, что повышает вероятность получать более частые блокировки по тайм-ауту, что никому как правило не нужно.
Короче все зависит от конкретного регистра и частоты записи в него (и длительности блокировки при записи). Если ты пишешь, что тебя интересует регистр бухгалтерии, и документы в систему вводятся часто, то вряд ли твоя идея чего-то там блокировать для формирования отчета придется по душе конечному пользователю. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |