Имя: Пароль:
1C
1С v8
Блокировка Данных в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 спасибо большое.