Имя: Пароль:
1C
 
Вопрос по движениям документа.
,
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
Стартуй отдельный сеанс (фоновое задание)