|
Вопрос по движениям документа. | ☑ | ||
---|---|---|---|---|
0
Bodrug
11.01.19
✎
17:34
|
Добрый день!
Возникла задача. Есть документ, время проведения которого занимает время (около 10 минут). Нужно при начале проведения этого документа делать запись в регистр сведений с признаком "ВыполняетсяРасчет" = Истина (ресурс типа булево). А после окончания проведения сделать запись с признаком "ВыполняетсяРасчет" = Ложь. Я это сделал. Но, открыв параллельно базу в 2-х окнах, вижу, что после начала проведения документа в одном окне, во втором движений в регистре нет. Они появляются только после проведения. Вопрос, как можно сделать так, чтобы движения по регистру были видны еще до окончания проведения документа? |
|||
1
Ёпрст
11.01.19
✎
17:36
|
Может, сперва решать эту задачу ? (около 10 минут)
|
|||
2
Быдло замкадное
11.01.19
✎
17:36
|
(0) так откуда они возьмутся если они 10 минут считаются... а ты их хочешь в первую секунду видеть?
|
|||
3
Aleksandr N
11.01.19
✎
17:37
|
Движения по этому регистру привязаны к регистратору, вот и не видно их во втором окне.
(1) 10 минут это конечно жутко. |
|||
4
Быдло замкадное
11.01.19
✎
17:38
|
"ВыполняетсяРасчет" = Истина надо делать подпиской на событие перед записью, или при записи.. не помню где ам понятно что документ проводится. И регистр должен быть независимым.
|
|||
5
palsergeich
11.01.19
✎
17:39
|
Проведение выполняется в транзакции - пока оно идет - другие транзакциии не видят этих данных)
(4) Не катит - транзакция уже открыта и не зафиксирована |
|||
6
Bodrug
11.01.19
✎
17:40
|
(0) (3)
документ по закрытию периода, делает кучу расчетов и движений, поэтому это не критично, т.к. он проводится не часто. (2) Докмент делает свои движения по разным регистрам 10 минут, но в начале я делаю движение по отдельному регистру сведений, и это занимает 2 секунды |
|||
7
Быдло замкадное
11.01.19
✎
17:40
|
(5) почему не катит? я так делал. Во время проведения документа расчета с/с добавлял запись независимого РС.
После проведения запись удалял. |
|||
8
palsergeich
11.01.19
✎
17:41
|
(7) Сделать запись можешь - но она будет видна только в рамках этой транзакции
|
|||
9
Bodrug
11.01.19
✎
17:42
|
Если Не Отказ Тогда
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Движения.РасчетСебестоимости.Очистить(); Для Каждого Стр Из Организации Цикл Запись = Движения.РасчетСебестоимости.Добавить(); Запись.ВыполняетсяРасчет = Истина; Запись.Активность = Истина; Запись.Организация = Стр.Организация; Запись.Дата = Дата; Запись.ПредварительныйРасчет = ПредварительныйРасчет; Запись.Регистратор = ЭтотОбъект.Ссылка; НаборЗаписей.Записать(Истина); КонецЦикла; Движения.РасчетСебестоимости.Записать(Истина); ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда Движения.РасчетСебестоимости.Очистить(); Движения.РасчетСебестоимости.Записать(Истина); КонецЕсли; КонецЕсли; |
|||
10
Bodrug
11.01.19
✎
17:42
|
Процедура ПередЗаписью
|
|||
11
Быдло замкадное
11.01.19
✎
17:42
|
(8) нет, у меня все другие пользователи и документы видели эту запись.
|
|||
12
Bodrug
11.01.19
✎
17:43
|
(4) Спасибо, попробую. Сейчас регистр подчинен регистратору
|
|||
13
palsergeich
11.01.19
✎
17:43
|
(11) Платформа какая?
|
|||
14
Bodrug
11.01.19
✎
17:43
|
(13) 8.3.13
|
|||
15
Быдло замкадное
11.01.19
✎
17:44
|
(13) сейчас пример покажу..
|
|||
16
palsergeich
11.01.19
✎
17:49
|
(15) В 83 стоит по умолчанию Read Commited Snapshot и не вышло бы.
Уровень изоляции Read uncommitted - чтение незафиксированных данных можно добится. Но писать такой код это ходить по очень тонкому льду. |
|||
17
Быдло замкадное
11.01.19
✎
17:55
|
(15) не могу понять откуда вызывается процедура, т.к. CF внешним файлом, базу разворачивать лень.
Создаем запись: НачатьТранзакцию(); РСМенеджерзаписи = РегистрыСведений.БлокировкаДляРасчетаСебестоимости.СоздатьМенеджерЗаписи(); РСМенеджерзаписи.ДокументКорректировка = НовыйДок.Ссылка; РСМенеджерзаписи.Записать(); ЗафиксироватьТранзакцию(); Проверяем из других документов и сеансов запись: Процедура ПриЗаписиРНПартииТоваровПриЗаписи(Источник, Отказ, Замещение) Экспорт Если Источник.Количество() > 0 Тогда Если ТипЗнч(Источник[0].Регистратор) <> Тип("ДокументСсылка.РасчетСебестоимостиВыпуска") Тогда Выборка = РегистрыСведений.БлокировкаДляРасчетаСебестоимости.Выбрать(); Если Выборка.Следующий() Тогда Сообщить("В данный момент проводится расчет себестоимости, повторите попытку через 1 минуту."); Отказ = Истина; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
18
palsergeich
11.01.19
✎
17:56
|
(17) Самое важное - платформа то какая?
в 82 можно было получить грязное чтение. в 83 нет |
|||
19
Быдло замкадное
11.01.19
✎
17:57
|
(18) 8.3 была
|
|||
20
palsergeich
11.01.19
✎
17:58
|
(17) Значит она вызывалась не в транзакционной процедуре, а при нажатии на кнопку или как то еще
|
|||
21
palsergeich
11.01.19
✎
17:59
|
тогда все хорошо
|
|||
22
Cyberhawk
11.01.19
✎
17:59
|
(20) Или режим совместимости конфы 8.2
|
|||
23
palsergeich
11.01.19
✎
17:59
|
(22) Дада, запамятовал.
|
|||
24
Быдло замкадное
11.01.19
✎
18:00
|
(15) нашел. Создаем запись: делалось в процедуре Обработка проведения, без всяких подписок.
Режим совместимости 8.2, т.к. это упп. |
|||
25
Cyberhawk
11.01.19
✎
18:00
|
Хотя он же это в ПриЗаписи читает, так что грязного чтения не должно быть в любом случае. Т.е. про то, что он не дожидаясь конца транзакции что-то записал и это прочиталось другими сеансами - вранье )
|
|||
26
Bodrug
11.01.19
✎
18:01
|
(17) И у меня расчет себестоимости надо отлавливать. Только при формировании отчета.
Спасибо! |
|||
27
Быдло замкадное
11.01.19
✎
18:03
|
(25) какое вранье? я сам проверял)
У меня даже еще хуже все... В обработке проведения я создавал и проводил документ корректировка записей регистров. И он и его движения были видны в обработке проведения расчета С/С. А запись РС проверял на других сеансах, все видно было. |
|||
28
palsergeich
11.01.19
✎
18:04
|
(24) Ну вот теперь все ясно)
|
|||
29
palsergeich
11.01.19
✎
18:04
|
Если 8.3 и ннет режима совместимости с 8.2 то такой фокус не прокатит
|
|||
30
Cyberhawk
11.01.19
✎
18:05
|
(27) Допускаю, что Я погорячился с оценкой твоих слов, назвав их враньем. В этом случае прошу извинить. Но что-то странно, что чтение в транзакции в 8.2 грязное.
|
|||
31
palsergeich
11.01.19
✎
18:05
|
(30) грязное грязное
|
|||
32
palsergeich
11.01.19
✎
18:05
|
Я постоянно про УПП шников забываю, что они сидят в 82 совместимости(
|
|||
33
Быдло замкадное
11.01.19
✎
18:06
|
(29) ну значит увидят мой говнокод когда УПП снимет режим совместимости)) если это произойдет..
|
|||
34
Cyberhawk
11.01.19
✎
18:13
|
(31) В транзакции штатно не может быть такого. У него там 2000 скуль что ли?
http://downloads.v8.1c.ru/content//Platform/8_3_5_1248/1cv8upd.htm#46d1c4ae-74f7-11e2-adcc-e61f135f174b Ctrl+F "грязное". Как было: "Microsoft SQL Server 2005 и выше использовался в режиме блокировок. Использовался уровень изоляции транзакций READ_COMMITED. При чтении вне транзакций использовалось «грязное» чтение." |
|||
35
Быдло замкадное
11.01.19
✎
18:18
|
(34) не могу сказать почему так было, но я проверял, запись была видна.
|
|||
36
Быдло замкадное
11.01.19
✎
18:18
|
вот и у автора можно уточнить, пусть проверит на другом сеансе.
|
|||
37
Cyberhawk
11.01.19
✎
18:20
|
(35) База файловая может была? )
|
|||
38
Bodrug
11.01.19
✎
18:55
|
(36) В общем-то не сработало. Увы... ((
|
|||
39
Bodrug
11.01.19
✎
18:55
|
база серверная
|
|||
40
Bodrug
11.01.19
✎
18:56
|
(36) В другом сеансе появление записи видно только после окончания проведения документа.
|
|||
41
Bodrug
14.01.19
✎
12:19
|
Ребят, вопрос еще актуален. Если кто-то с подобным сталкивался и нашел выход, прошу подсказать. Спасибо!
P.S. Режим совместимости 8.3, база серверная. |
|||
42
ДенисЧ
14.01.19
✎
12:22
|
(41) Пиши до транзакции и после неё.
|
|||
43
Bodrug
14.01.19
✎
12:37
|
(42) При проведении транзакция автоматически активна (ТранзакцияАктивна()=Истина). При попытке отменить Транзнакцию вываливается ошибка, что транзакция не активна...
|
|||
44
ДенисЧ
14.01.19
✎
12:43
|
(43) ПОдписка передЗаписью
|
|||
45
Bodrug
14.01.19
✎
15:12
|
(44) Не помогло. Движение по регистру сведений видно только после окончания проведения документа.
|
|||
46
НЕА123
14.01.19
✎
15:33
|
ПередЗаписью() уже в транзакции
|
|||
47
Bodrug
14.01.19
✎
16:00
|
Я так понял, что все, что происходит с момента "перед записью" и до конца проведения/записи - происходит в одной транзакции.
Может, есть какая-то возможность "вклиниться" где-то и сделать отдельно запись в регистр? А потом уже пусть запускается транзакция. |
|||
48
Bodrug
14.01.19
✎
16:04
|
(46) Можно ли как-то отменить эту транзакцию, выполнить свой код, а потом начать уже эту транзакцию?
|
|||
49
Ботаник Гарден Меран
14.01.19
✎
16:43
|
В качестве семафора
управляемые блокировки или фоновые задания |
|||
50
Bodrug
14.01.19
✎
17:17
|
(49) Можно немного подробнее?
|
|||
51
Bodrug
14.01.19
✎
17:20
|
(49) Запуск фонового задания при записи документа?
|
|||
52
vetal5872
14.01.19
✎
17:24
|
(41)
Делаешь свою команду "Провести" вместо стандартной, а в ней: ЗаписатьВРС(Истина); Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)); ЗаписатьВРС(Ложь); |
|||
53
Bodrug
14.01.19
✎
17:26
|
(52) А если проводят из формы списка? или регламентным заданием?
|
|||
54
vetal5872
14.01.19
✎
17:30
|
(53) В форме списка аналогично, а регламентное задание и так программно проводит. Две строки только дописать.
Как вариант, в транзакции можно накладывать блокировку на регистр и, если данные заблокированы, значит ВыполняетсяРасчет = Истина. |
|||
55
vetal5872
14.01.19
✎
17:31
|
(53) Или в какую-нибудь внешнюю sql-таблицу запись делать или даже в файл. Вариантов масса.
|
|||
56
Bodrug
14.01.19
✎
17:33
|
(55) опять таки, если писать в файл или во внешнюю таблицу, то это произойдет только по окончании записи документа.
|
|||
57
ДенисЧ
14.01.19
✎
17:34
|
(56) С какого перепою?
|
|||
58
vetal5872
14.01.19
✎
17:34
|
(56) Ваше утверждение ложно
|
|||
59
Bodrug
14.01.19
✎
17:35
|
Вообще, цель задачи в том, при формировании определенного отчета нужно вычислить, проводится ли документ "Расчет себестоимости" в данный момент. Если есть какой-то механизм, то мне и запись в регистр/файл/таблицу не нужен.
|
|||
60
Bodrug
14.01.19
✎
17:37
|
(57) (58) Возможно. Но я думал, что если писать код записи в файл/таблицу в процедуре ПередЗаписью/ПриЗаписи/ОбработкаПроведения, то данные туда запишутся по окончании записи документа.
|
|||
61
Cyberhawk
14.01.19
✎
20:20
|
Стартуй отдельный сеанс (фоновое задание)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |