Вход | Регистрация
 

Вопрос по движениям документа.

Вопрос по движениям документа.
Я
   Bodrug
 
11.01.19 - 17:34
Добрый день!
Возникла задача. Есть документ, время проведения которого занимает время (около 10 минут). Нужно при начале проведения этого документа делать запись в регистр сведений с признаком "ВыполняетсяРасчет" = Истина (ресурс типа булево). А после окончания проведения сделать запись с признаком "ВыполняетсяРасчет" = Ложь. Я это сделал. Но, открыв параллельно базу в 2-х окнах, вижу, что после начала проведения документа в одном окне, во втором движений в регистре нет. Они появляются только после проведения.
Вопрос, как можно сделать так, чтобы движения по регистру были видны еще до окончания проведения документа?
 
 
   Ёпрст
 
1 - 11.01.19 - 17:36
Может, сперва решать эту  задачу ?  (около 10 минут)
   Быдло замкадное
 
2 - 11.01.19 - 17:36
(0) так откуда они возьмутся если они 10 минут считаются... а ты их хочешь в первую секунду видеть?
   Aleksandr N
 
3 - 11.01.19 - 17:37
Движения по этому регистру привязаны к регистратору, вот и не видно их во втором окне.
(1) 10 минут это конечно жутко.
   Быдло замкадное
 
4 - 11.01.19 - 17:38
"ВыполняетсяРасчет" = Истина надо делать подпиской на событие перед записью, или при записи.. не помню где ам понятно что документ проводится. И регистр должен быть независимым.
   palsergeich
 
5 - 11.01.19 - 17:39
Проведение выполняется в транзакции - пока оно идет - другие транзакциии не видят этих данных)
(4) Не катит - транзакция уже открыта и не зафиксирована
   Bodrug
 
6 - 11.01.19 - 17:40
(0) (3)
документ по закрытию периода, делает кучу расчетов и движений, поэтому это не критично, т.к. он проводится не часто.
(2) Докмент делает свои движения по разным регистрам 10 минут, но в начале я делаю движение по отдельному регистру сведений, и это занимает 2 секунды
   Быдло замкадное
 
7 - 11.01.19 - 17:40
(5) почему не катит? я так делал. Во время проведения документа расчета с/с добавлял запись независимого РС.
После проведения запись удалял.
   palsergeich
 
8 - 11.01.19 - 17:41
(7) Сделать запись можешь - но она будет видна только в рамках этой транзакции
   Bodrug
 
9 - 11.01.19 - 17:42
Если Не Отказ Тогда 
        Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
            Движения.РасчетСебестоимости.Очистить();
            Для Каждого Стр Из Организации Цикл
                Запись = Движения.РасчетСебестоимости.Добавить();
                Запись.ВыполняетсяРасчет = Истина;
                Запись.Активность = Истина;
                Запись.Организация = Стр.Организация;
                Запись.Дата = Дата;
                Запись.ПредварительныйРасчет = ПредварительныйРасчет;
                Запись.Регистратор = ЭтотОбъект.Ссылка;
                НаборЗаписей.Записать(Истина);
            КонецЦикла;
            Движения.РасчетСебестоимости.Записать(Истина);
            
        ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
            Движения.РасчетСебестоимости.Очистить();
            Движения.РасчетСебестоимости.Записать(Истина);
        КонецЕсли;
    КонецЕсли;
   Bodrug
 
10 - 11.01.19 - 17:42
Процедура ПередЗаписью
 
 Рекламное место пустует
   Быдло замкадное
 
11 - 11.01.19 - 17:42
(8) нет, у меня все другие пользователи и документы видели эту запись.
   Bodrug
 
12 - 11.01.19 - 17:43
(4) Спасибо, попробую. Сейчас регистр подчинен регистратору
   palsergeich
 
13 - 11.01.19 - 17:43
(11) Платформа какая?
   Bodrug
 
14 - 11.01.19 - 17:43
(13) 8.3.13
   Быдло замкадное
 
15 - 11.01.19 - 17:44
(13) сейчас пример покажу..
   palsergeich
 
16 - 11.01.19 - 17:49
(15) В 83 стоит по умолчанию Read Commited Snapshot и не вышло бы.
Уровень изоляции Read uncommitted - чтение незафиксированных данных можно добится.
Но писать такой код это ходить по очень тонкому льду.
   Быдло замкадное
 
17 - 11.01.19 - 17:55
(15) не могу понять откуда вызывается процедура, т.к. CF внешним файлом, базу разворачивать лень.

Создаем запись:

НачатьТранзакцию();
    
    
    РСМенеджерзаписи = РегистрыСведений.БлокировкаДляРасчетаСебестоимости.СоздатьМенеджерЗаписи();
    
    РСМенеджерзаписи.ДокументКорректировка = НовыйДок.Ссылка;
    РСМенеджерзаписи.Записать();
ЗафиксироватьТранзакцию();

Проверяем из других документов и сеансов запись:
Процедура ПриЗаписиРНПартииТоваровПриЗаписи(Источник, Отказ, Замещение) Экспорт
    
    Если Источник.Количество() > 0 Тогда
        
        Если ТипЗнч(Источник[0].Регистратор) <> Тип("ДокументСсылка.РасчетСебестоимостиВыпуска") Тогда
            
            Выборка = РегистрыСведений.БлокировкаДляРасчетаСебестоимости.Выбрать();
            
            Если Выборка.Следующий() Тогда
                
                Сообщить("В данный момент проводится расчет себестоимости, повторите попытку через 1 минуту.");
                Отказ = Истина;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры
   palsergeich
 
18 - 11.01.19 - 17:56
(17) Самое важное - платформа то какая?
в 82 можно было получить грязное чтение.
в 83 нет
   Быдло замкадное
 
19 - 11.01.19 - 17:57
(18) 8.3 была
   palsergeich
 
20 - 11.01.19 - 17:58
(17) Значит она вызывалась не в транзакционной процедуре, а при нажатии на кнопку или как то еще
   palsergeich
 
21 - 11.01.19 - 17:59
тогда все хорошо
   Cyberhawk
 
22 - 11.01.19 - 17:59
(20) Или режим совместимости конфы 8.2
   palsergeich
 
23 - 11.01.19 - 17:59
(22) Дада, запамятовал.
   Быдло замкадное
 
24 - 11.01.19 - 18:00
(15) нашел.  Создаем запись: делалось в процедуре Обработка проведения, без всяких подписок.
Режим совместимости 8.2, т.к. это упп.
   Cyberhawk
 
25 - 11.01.19 - 18:00
Хотя он же это в ПриЗаписи читает, так что грязного чтения не должно быть в любом случае. Т.е. про то, что он не дожидаясь конца транзакции что-то записал и это прочиталось другими сеансами - вранье )
   Bodrug
 
26 - 11.01.19 - 18:01
(17) И у меня расчет себестоимости надо отлавливать. Только при формировании отчета.
Спасибо!
   Быдло замкадное
 
27 - 11.01.19 - 18:03
(25) какое вранье? я сам проверял)
У меня даже еще хуже все... В обработке проведения я создавал и проводил документ корректировка записей регистров.
И он и его движения были видны в обработке проведения расчета С/С.

А запись РС проверял на других сеансах, все видно было.
   palsergeich
 
28 - 11.01.19 - 18:04
(24) Ну  вот теперь все ясно)
   palsergeich
 
29 - 11.01.19 - 18:04
Если 8.3 и ннет режима совместимости с 8.2 то такой фокус не прокатит
   Cyberhawk
 
30 - 11.01.19 - 18:05
(27) Допускаю, что Я погорячился с оценкой твоих слов, назвав их враньем. В этом случае прошу извинить. Но что-то странно, что чтение в транзакции в 8.2 грязное.
   palsergeich
 
31 - 11.01.19 - 18:05
(30) грязное грязное
   palsergeich
 
32 - 11.01.19 - 18:05
Я постоянно про УПП шников забываю, что они сидят в 82 совместимости(
   Быдло замкадное
 
33 - 11.01.19 - 18:06
(29) ну значит увидят мой говнокод когда УПП снимет режим совместимости)) если это произойдет..
 
 
   Cyberhawk
 
34 - 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
вот и у автора можно уточнить, пусть проверит на другом сеансе.
   Cyberhawk
 
37 - 11.01.19 - 18:20
(35) База файловая может была? )
   Bodrug
 
38 - 11.01.19 - 18:55
(36) В общем-то не сработало. Увы... ((
   Bodrug
 
39 - 11.01.19 - 18:55
база серверная
   Bodrug
 
40 - 11.01.19 - 18:56
(36) В другом сеансе появление записи видно только после окончания проведения документа.
   Bodrug
 
41 - 14.01.19 - 12:19
Ребят, вопрос еще актуален. Если кто-то с подобным сталкивался и нашел выход, прошу подсказать. Спасибо!
P.S. Режим совместимости 8.3, база серверная.
   ДенисЧ
 
42 - 14.01.19 - 12:22
(41) Пиши до транзакции и после неё.
   Bodrug
 
43 - 14.01.19 - 12:37
(42) При проведении транзакция автоматически активна (ТранзакцияАктивна()=Истина). При попытке отменить Транзнакцию вываливается ошибка, что транзакция не активна...
   ДенисЧ
 
44 - 14.01.19 - 12:43
(43) ПОдписка передЗаписью
   Bodrug
 
45 - 14.01.19 - 15:12
(44) Не помогло. Движение по регистру сведений видно только после окончания проведения документа.
   НЕА123
 
46 - 14.01.19 - 15:33
ПередЗаписью() уже в транзакции
   Bodrug
 
47 - 14.01.19 - 16:00
Я так понял, что все, что происходит с момента "перед записью" и до конца проведения/записи - происходит в одной транзакции.
Может, есть какая-то возможность "вклиниться" где-то и сделать отдельно запись в регистр? А потом уже пусть запускается транзакция.
   Bodrug
 
48 - 14.01.19 - 16:04
(46) Можно ли как-то отменить эту транзакцию, выполнить свой код, а потом начать уже эту транзакцию?
   Ботаник Гарден Меран
 
49 - 14.01.19 - 16:43
В качестве семафора
управляемые блокировки
или
фоновые задания
 
 Рекламное место пустует
   Bodrug
 
50 - 14.01.19 - 17:17
(49) Можно немного подробнее?
   Bodrug
 
51 - 14.01.19 - 17:20
(49) Запуск фонового задания при записи документа?
   vetal5872
 
52 - 14.01.19 - 17:24
(41)
Делаешь свою команду "Провести" вместо стандартной, а в ней:
ЗаписатьВРС(Истина);
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
ЗаписатьВРС(Ложь);
   Bodrug
 
53 - 14.01.19 - 17:26
(52) А если проводят из формы списка? или регламентным заданием?
   vetal5872
 
54 - 14.01.19 - 17:30
(53) В форме списка аналогично, а регламентное задание и так программно проводит. Две строки только дописать.

Как вариант, в транзакции можно накладывать блокировку на регистр и, если данные заблокированы, значит ВыполняетсяРасчет = Истина.
   vetal5872
 
55 - 14.01.19 - 17:31
(53) Или в какую-нибудь внешнюю sql-таблицу запись делать или даже в файл. Вариантов масса.
   Bodrug
 
56 - 14.01.19 - 17:33
(55) опять таки, если писать в файл или во внешнюю таблицу, то это произойдет только по окончании записи документа.
   ДенисЧ
 
57 - 14.01.19 - 17:34
(56) С какого перепою?
   vetal5872
 
58 - 14.01.19 - 17:34
(56) Ваше утверждение ложно
   Bodrug
 
59 - 14.01.19 - 17:35
Вообще, цель задачи в том, при формировании определенного отчета нужно вычислить, проводится ли документ "Расчет себестоимости" в данный момент. Если есть какой-то механизм, то мне и запись в регистр/файл/таблицу не нужен.
   Bodrug
 
60 - 14.01.19 - 17:37
(57) (58) Возможно. Но я думал, что если писать код записи в файл/таблицу в процедуре ПередЗаписью/ПриЗаписи/ОбработкаПроведения, то данные туда запишутся по окончании записи документа.
   Cyberhawk
 
61 - 14.01.19 - 20:20
Стартуй отдельный сеанс (фоновое задание)


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