|
Блокировка Данных в1С | ☑ | ||
---|---|---|---|---|
0
nlira
17.10.13
✎
13:17
|
В автообмене есть процедура ЗагрузкаНоменклатуры()
1С файловая версия 8.1. |
|||
1
nlira
17.10.13
✎
13:18
|
как мне сделать приоритетной в загрузке в блокировках автообмен? Чтобы пользователи не могли записывать номенклатуру и ед изм?
|
|||
2
Maxus43
17.10.13
✎
13:20
|
обмен, блокировка номенклатуры, приоритет... помоему слова не связаны в логическую цепь, задай вопрос на пальцах, кто что когда не должен куда
|
|||
3
nlira
17.10.13
✎
13:22
|
Хотелось бы автообмен сделать приоритетным в записях. Чтобы пользователи не могли записывать номенклатуру в тот момент когда идет загрузка номенклатуры в автообмене
|
|||
4
nlira
17.10.13
✎
13:23
|
так как у меня файловая версия, все время при загрузке номенклатуры автообмена вылетает с ошибкой блокировка транзакций
|
|||
5
nlira
17.10.13
✎
13:23
|
так как несколько пользователей тоже работают в это время.
|
|||
6
Maxus43
17.10.13
✎
13:23
|
уже лучше.
в транзакции загрузки можно принудительно заблокировать весь справочник номенклатуры, юзая ДЛЯ ИЗМЕНЕНИЯ в запросе |
|||
7
nlira
17.10.13
✎
13:24
|
А мне хочется чтобы когда автообмен доходит до процедуры ЗагрузкаНоменклатуры() пользователи не могли записывать номенклатуру, не смогли прервать автообмен
|
|||
8
nlira
17.10.13
✎
13:26
|
что я делаю:
Попытка НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Блокировка = Новый БлокировкаДанных; элБлокировки = Блокировка.Добавить("Справочники.Номенклатура"); элБлокировки = Блокировка.Добавить("Справочники.ЕдиницыИзмерения"); элБлокировки = Блокировка.Добавить("РегистрыСведений.Выгрузка"); элБлокировки = Блокировка.Добавить("РегистрыСведений.НоменклатураКЗагрузке"); элБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ЗагрузкаНоменклатуры(); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); Сообщить(ОписаниеОшибки()); КонецПопытки; |
|||
9
nlira
17.10.13
✎
13:26
|
такое прокатит?
|
|||
10
Maxus43
17.10.13
✎
13:27
|
блокировки то какие? управляемые или автоматические?
|
|||
11
nlira
17.10.13
✎
13:30
|
делаю управляемой 2 строчка
Начать транзакцию(РежимуправленияБлокировкойДанных.управляемый) |
|||
12
Spieluhr
17.10.13
✎
13:32
|
(11) в конфигурации какие блокировки?
|
|||
13
nlira
17.10.13
✎
13:34
|
Это где посмотреть?
|
|||
14
nlira
17.10.13
✎
13:34
|
Автоматический
|
|||
15
nlira
17.10.13
✎
13:34
|
В конфигурации - Автоматический
|
|||
16
Maxus43
17.10.13
✎
13:34
|
(15) тогда управляемые не наложишь
|
|||
17
nlira
17.10.13
✎
13:36
|
надо поставить управляемый и автоматический?
|
|||
18
Maxus43
17.10.13
✎
13:36
|
после начала транзакции запрос сделай,
ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ДЛЯ ИЗМЕНЕНИЯ |
|||
19
Maxus43
17.10.13
✎
13:36
|
(17) не надо ставить, просто по другому делать
|
|||
20
nlira
17.10.13
✎
13:38
|
(18) для чего?
|
|||
21
Sabbath
17.10.13
✎
13:39
|
(0)
Есть такие методы глобального контекста ЗаблокироватьДанныеДляРедактирования() РазблокироватьДанныеДляРедактирования() |
|||
22
nlira
17.10.13
✎
13:39
|
(18) тогда и ед изм надо также сделать получается
|
|||
23
nlira
17.10.13
✎
13:39
|
(21) уже интересно.сейчас почитаю
|
|||
24
nlira
17.10.13
✎
13:40
|
в 8. в справке такого нет
|
|||
25
nlira
17.10.13
✎
13:40
|
в 8.1
|
|||
26
Maxus43
17.10.13
✎
13:40
|
и в попытку пихать транзакцию не надо, общий план такой:
ЕстьОшибки = Ложь; НачатьТранзакцию(); //Запрос для блокировки (18) //в процедуре загрузки: Попытка Номенклатура.Записать(); Исключение ЕстьОшибки = Истина; Возврат; КонецПопытки; //После процедуры загрузки Если ЕСтьОшибки Тогда ОтменитьТранзакцию(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; |
|||
27
nlira
17.10.13
✎
13:42
|
(26) хотелось бы 100% загрузку с первого раза, блокируя пользователей
|
|||
28
nlira
17.10.13
✎
13:42
|
а тут то ли записалоь,то ли нет
|
|||
29
Sabbath
17.10.13
✎
13:42
|
(25) ах, ну да, в 8.2 это
|
|||
30
Maxus43
17.10.13
✎
13:47
|
(28) если пользователь заблокировал номенклатуру ДО начала обмена, как ты это хочешь сделать?
|
|||
31
Maxus43
17.10.13
✎
13:54
|
и кстати, ДЛЯ ИЗМЕНЕНИЯ в 8.1 есть вобще?)
|
|||
32
Sabbath
17.10.13
✎
13:54
|
(31) есть
|
|||
33
nlira
17.10.13
✎
13:57
|
есть
|
|||
34
nlira
17.10.13
✎
13:57
|
а что сделать при изменении?
|
|||
35
Spieluhr
17.10.13
✎
13:57
|
(28) в (26) тебе уже все разжевали и готовый код дали
|
|||
36
Maxus43
17.10.13
✎
14:03
|
(34) ДЛЯ ИЗМЕНЕНИЯ в запросе - блокирует данные попавшие в выборку от изменения в других сеансах и транзакциях, т.е. то что вам нужно
|
|||
37
Maxus43
17.10.13
✎
14:10
|
(36) + конечно внутри транзакции запрос должен быть и на автоматических блокировках конфа
|
|||
38
nlira
17.10.13
✎
14:13
|
и что при изменении номенклатуры? Поставлю я при записи проверку в транзакции. Процедура загрузкаНоменклатура() в ней записываются ед изм еще.
Ситуация: в автообмене записалась номенклатура, 2) пишется ед изм номенклатуры INR 3) тут воткнулся пользователь - заблокировал таблицы 4) в автообмене ед из УПК не смог записать - вылетел с ошибкой Итог: номенклатура записалась с ед изм только ШТК. а УПК и ПАЛ не записались. Косячная номенклатура |
|||
39
Sabbath
17.10.13
✎
14:17
|
(38) ну так по идее если ты будешь блокировать, как сказал Maxus43, то пользователь не воткнется и не заблокирует, это он вылетит с ошибкой, а не обмен
|
|||
40
nlira
17.10.13
✎
14:18
|
ну тогда попробую ,спс вам всем
|
|||
41
nlira
17.10.13
✎
14:20
|
Есть в форме Номенклатуры приИзмененииДанных() я как понимаю здесь надо?
|
|||
42
Sabbath
17.10.13
✎
14:22
|
(41) не, номенклатуру то зачем трогать, где обмен прописан там и делай наподобие (26)
|
|||
43
nlira
17.10.13
✎
14:26
|
а сработает транзакция для всей процедуры ЗагрузкаНоменклатуры()? Почему спрашиваю - внутри процедуры не хочется в каждом месте записи писать(26).
|
|||
44
nlira
17.10.13
✎
14:27
|
(43) потому что Записалась номенклатура, теперь пишется ед измерения шт, упк, пал. Если вылетела в этот момент, то от моей (26) толку нет
|
|||
45
nlira
17.10.13
✎
14:27
|
и вот это куда надо не поняла:
(18) Запрос.текст =ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ДЛЯ ИЗМЕНЕНИЯ Результат - Запрос.Выполнить().Выгрузить(); Что с этим результатом в итоге мне делатЬ? |
|||
46
nlira
17.10.13
✎
14:30
|
(45) не надо потом разблокировать?
или Результат обнулить и тогда сам разблокируется? |
|||
47
nlira
17.10.13
✎
14:32
|
Если вот так напишу:
Попытка НачатьТранзакцию(); Запрос.текст =ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ДЛЯ ИЗМЕНЕНИЯ Результат - Запрос.Выполнить().Выгрузить(); ЗагрузкаНоменклатуры(); ЗафиксироватьТранзакцию(); исключение ОтменитьТранзакцию(); Конецпопытки; |
|||
48
nlira
17.10.13
✎
14:33
|
или после зафиксироватьТранзакцию() надо Результат = "";
|
|||
49
nlira
17.10.13
✎
14:33
|
Если так сделаю сработает?
|
|||
50
nlira
17.10.13
✎
14:35
|
в 1 транзакции будет и загрузка номенклатуры, и ед изм, и все все все,что происходит внутри процедуры. Если с ошибкой вылетит то откатится транзакция полностью. Это в идеале я так думаю,но не факт что сработает
|
|||
51
Maxus43
17.10.13
✎
14:37
|
Запрос просто выполнить, без выгрузить. ничего с ним больше не делать.
Я уже говорил, не надо в Попытку пихать Транзакцию. в запрос можешь добавить выборку единиц измерения ещё, раз не уверена сработает ли |
|||
52
Sabbath
17.10.13
✎
14:38
|
(45) Результат, может и не нужен, и выгружать не обязательно, достаточно выполнить. Если в транзакции, то заблокируется до того, пока транзакиця не закончится. Заблокируются все таблицы, которые в запросе ,если не указать явно, какие. Но кстати заблокируются именно на чтение
(43) для всей процедуры сработает, в том и смысл. |
|||
53
Sabbath
17.10.13
✎
14:39
|
||||
54
nlira
17.10.13
✎
14:45
|
(53) а если форма эл-та справочника уже была открыта пользователем в блокировке на чтение?
|
|||
55
nlira
17.10.13
✎
14:45
|
открыл пользователь номенклатуру и пошел курить, а в это время автообмен грузит номенклатуру
|
|||
56
nlira
17.10.13
✎
14:47
|
(52) доступно - спасибо
|
|||
57
Sabbath
17.10.13
✎
14:50
|
(55) Если он открыл, то читать можно. По идее пользователь не сможет потом записать открытый элемент, т.к. он был изменен.
В транзакции открыл - это вряд ли :). Если просто открыл там транзакции нет, просто оптимистическая блокировка будет работать. |
|||
58
Sabbath
17.10.13
✎
14:54
|
+(57) веренй можно даже писать, если он не изменил и записал в этот момент
Вот мне интересно, что будет, если он открыл, потом ты считываешь и блокируешь на чтение, а потом он запсывает. По идее тогда ты не сможешь записать, если я правильно понимаю суть. Короче тут мне не понятен только случай, если он откроет раньше обмена, а запишет во время, но когда ты еще не записал. В теории ДЛЯ ИЗМЕНЕНИЯ не помешает ему записать до тебя |
|||
59
Sabbath
17.10.13
✎
14:57
|
С другой стороны можно это в попытке делать и не записывать такую номенклатуру. Если подумать, то даже это правильно. Все равно что если ты перегрузил, а потом пользователь изменил данные. Это же не обмен виноват)
|
|||
60
nlira
18.10.13
✎
14:25
|
Maxus43,Sabbath спасибо большое.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |