Имя: Пароль:
1C
1С v8
Не работают управляемые блокировки по новой методике проведения
0 pitbul
 
02.06.15
10:25
Доброго времени суток!
Подскажите почему у меня блокируется вся таблица регистра на чтение, после записи набора. Вываливается ошибка SQL при выполнении запроса на остатки во второй транзакции. Номенклатура разная в документах. Первую транзакцию останавливаю по точке останова на строке
Выборка = Результат.Выбрать();
Платформа 8.2.17.169, SQL 2008 R2
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();  
    Для Каждого ТекСтр Из Товары Цикл
        Движение = Движения.ОстаткиНоменклатуры.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        //Движение.Склад = ТекСтр.Склад;
        Движение.Номенклатура = ТекСтр.Номенклатура;
        Движение.Количество = ТекСтр.Количество;
        Движение.Сумма = ТекСтр.Сумма;
    КонецЦикла;
    //Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
    //Движения.ОстаткиНоменклатуры.Записать();
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    Движения.Записать();
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                   |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток
                   |ИЗ
                   |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                   |            &МоментВремени,
                   |            Номенклатура В (&Номенклатура)
                   |                ) КАК ОстаткиНоменклатурыОстатки";
    //Номенклатура = ;
    
    //Запрос.УстановитьПараметр("Склад", Склад);
    //Запрос.УстановитьПараметр("Ссылка", ссылка);
    Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая));
    Запрос.УстановитьПараметр("Номенклатура", Товары.ВыгрузитьКолонку("Номенклатура"));
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.КоличествоОстаток);
        Если Выборка.КоличествоОстаток < 0 Тогда
            //Сообщить("Недостаточно номенклатуры " + Выборка.Номенклатура + " Документ не проведен");
            Отказ = Истина;
        КонецЕсли;
        
        Если Отказ Тогда
            Продолжить;
        КонецЕсли;
        
        Если Выборка.КоличествоОстаток = 0 Тогда
            Продолжить;
        КонецЕсли;
        

    
КонецЦикла;
1 MrKartez
 
02.06.15
10:48
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();  

Удали
2 MrKartez
 
02.06.15
10:48
И где у тебя разная номенклатура, когда ты её из одно и той же ТЧ берешь
3 pitbul
 
02.06.15
10:53
Удалил, не помогло, но теперь ошибка SQL вываливается и не факт, что на выполнении запроса. До удаления номер строки кода 1С указывалась
Я имею ввиду сами позиции номенклатуры в двух документах разные
4 MrKartez
 
02.06.15
11:06
Да черт его знает :)
Могу только сказать, что ты блокировку по новой методике не так ставишь

//Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

    //Движения.ОстаткиНоменклатуры.Записать();

у тебя должна сначала запись идти, а уже только потом накладывается блокировка
5 H A D G E H O G s
 
02.06.15
11:09
1) Блокировка руками не нужна
2)

Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая));

заменить на

Запрос.УстановитьПараметр("МоментВремени", ЭтотОбъект.Дата);

и попробовать.
6 MrKartez
 
02.06.15
11:12
(5) Нет, у него именно граница должна быть в параметрах. Иначе движения в минус, которые выполняет этот документ, просто не будет видно.
7 H A D G E H O G s
 
02.06.15
11:14
(6) Ты просто попробуй этот вариант и будет ли ошибка.
8 H A D G E H O G s
 
02.06.15
11:15
(6) Ай, ты не автор, ошибся. Пусть автор попробует.
9 pitbul
 
02.06.15
11:15
Попробовал, ошибка есть. Без изменений
10 pitbul
 
02.06.15
11:15
Мож в скуле еще чего настроить надо?
11 pitbul
 
02.06.15
11:16
Хотя если сначала читаешь - потом пишешь - все отрабатывает четко
12 H A D G E H O G s
 
02.06.15
11:16
(10) Попробуй вообще Дату из запроса убрать, бери оперативные остатки.
13 pitbul
 
02.06.15
11:18
(12) не помогло
14 Легат
 
02.06.15
11:21
Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Записать();
Их можно друг за другом ? ..
15 pitbul
 
02.06.15
11:22
(14) Почему нет?
16 Fragster
 
гуру
02.06.15
11:23
если вываливается ошибка _SQL_, значит управляемые блокировки не используются, есличо
17 Зеленый пень
 
02.06.15
11:24
(0) В свойствах конфигурации какой Режим управления блокировкой выбран?
18 pitbul
 
02.06.15
11:25
(16) и куда копать, подскажешь?
19 СРКД
 
02.06.15
11:25
Управляемые блокировки что это можете вкратце описать?)
20 pitbul
 
02.06.15
11:25
(17) управляемый
21 Легат
 
02.06.15
11:27
22 alexlap
 
02.06.15
11:27
А структура регистра какая? Индекс по номенклатуре есть?
Живой? Строк в табилчной части много?
23 pitbul
 
02.06.15
11:29
(22) структура Измерение номенклатура, р-сы Сумма, количество
Индекс есть.
строк в самой ТЧ у одного дока 1, у другого 16
На сайте ИТС нашел, что если записей в регистре мало, то блокируется весь регистр - сделал записей более 10000
Что значит живой?
24 H A D G E H O G s
 
02.06.15
11:47
"сделал записей более 10000 "

И?
25 pitbul
 
02.06.15
11:48
(24) Без изменений
26 H A D G E H O G s
 
02.06.15
11:49
(25) Давай подключусь, гляну
27 pitbul
 
02.06.15
11:55
(26) может лучше dt-шник выложу, а то на работе.
28 alexlap
 
02.06.15
11:57
(23) Живой значит может использоваться. Не отключен например.
А где записи то сделал 10 000? Надо в таблице остатков.
29 pitbul
 
02.06.15
12:00
(28) тоже подумал об этом. Щас создам номенклатуры много позиций
30 pitbul
 
02.06.15
12:00
(28) и как проверить индекс, что он используется?
31 H A D G E H O G s
 
02.06.15
12:03
(30) ms sql profiler
32 H A D G E H O G s
 
02.06.15
12:03
(27) выкладывай
33 ssh2006
 
02.06.15
12:37
(0) Чтобы не ставить ручную блокировку нужно раскомментировать
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
34 ssh2006
 
02.06.15
12:50
Видимо при чтении во второй транзакции запрос "цепляет" незафиксированные данные первой и выскакивает в тайм аут ожидания. А на уровне менеджера блокировок 1С все нормально - номенклатура разная.
35 pitbul
 
02.06.15
12:51
В общем, создал остатков больше 10000 записей и все стало отрабатывать четко.
Всем большое спасибо за оказанную помощь. Очень оперативно)
36 pitbul
 
02.06.15
12:52
(33) да точно, если нужно блокировать записи
37 ssh2006
 
02.06.15
12:55
(36) Блокируются они автоматически в момент записи в любом случае . Только нужно отключить разделитель итогов, чтобы блокировка была без его учета, что и делает БлокироватьДляИзменения
38 H A D G E H O G s
 
02.06.15
12:57
(34) Индексный скан из за малого числа записей. Вот и все.
39 Fragster
 
гуру
02.06.15
12:58
(38) включи ему read committed snapshot
40 ssh2006
 
02.06.15
13:37
(39) кстати, да, на 8.3 такой ситуации бы не возникло
41 Fragster
 
гуру
02.06.15
13:38
(40) можно и на 8.2 включить. только после реструктуризации иногда перевключать пришлось бы