Имя: Пароль:
1C
1С v8
Блокировка данных регистра при проведении
,
0 Alex_MA
 
20.05.14
09:13
Здравствуйте!

Создал простую конфигурацию для тестирования блокировки:

Документ "Приходная" (Движения - не удалять автоматически)
              "Организация"
              "Склад"
              Таб.часть "Товары"
                   "Номенклатура"
                   "Количество"
                   "Цена"
                   "Сумма"

РегистрНакопления "ТоварыНаСкладах":
                 Измерения: "Организация", "Склад"
                 Ресурсы: "Количество", "Сумма"

В обработке проведения:

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

    ДвижениеТоварыНаСкладах = Движения.ТоварыНаСкладах;  // ТУТ СТАВЛЮ ТОЧКУ ОСТАНОВА
    
    
    Для Каждого ТекСтр Из Товары Цикл
        
        СтрокаДвижения = ДвижениеТоварыНаСкладах.Добавить();
        СтрокаДвижения.Период = Дата;
        СтрокаДвижения.Организация = Организация;
        СтрокаДвижения.Склад = Склад;
        
        ЗаполнитьЗначенияСвойств(СтрокаДвижения, ТекСтр);
        
    КонецЦикла;

В другом сеансе запускаю обработку на чтение в транзакции данных из этого регистра,
указываю склад отличный от склада в документе "Приходная":

        НачатьТранзакцию();
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ТоварыНаСкладах.Период,
                          |    ТоварыНаСкладах.Регистратор,
                          |    ТоварыНаСкладах.НомерСтроки,
                          |    ТоварыНаСкладах.Активность,
                          |    ТоварыНаСкладах.ВидДвижения,
                          |    ТоварыНаСкладах.Склад,
                          |    ТоварыНаСкладах.Организация,
                          |    ТоварыНаСкладах.Номенклатура,
                          |    ТоварыНаСкладах.Количество,
                          |    ТоварыНаСкладах.Сумма
                          |ИЗ
                          |    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
                          |ГДЕ
                          |    ТоварыНаСкладах.Склад = &Склад");
                          
    Запрос.УстановитьПараметр("Склад", Склад);                          
                          
    ТЗ = Запрос.Выполнить().Выгрузить();                          
    Для Каждого ТекСтр Из ТЗ Цикл
        Сообщить(ТекСтр.Склад);
    КонецЦикла;    
    
    ЗафиксироватьТранзакцию();

В результате обработка чтения в транзакции при выполнении запроса встает на ожидание!
Почему ???

Большое спасибо за внимание.
1 neckto
 
20.05.14
09:15
Не озвучен режим работы конфы и Режим управления блокировками.
2 Alex_MA
 
20.05.14
09:17
(1)Управляемый
3 vmv
 
20.05.14
09:28
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();

так заюзай и не парь репу
4 vi0
 
20.05.14
10:39
(2) управляемый в конфигурации?
что тех.журнал говорит?
5 Ненавижу 1С
 
гуру
20.05.14
10:41
если файловая, то так и должно быть
6 Alex_MA
 
20.05.14
11:29
(5)клиент-сервер
MS SQL 2005 Standart
7 Alex_MA
 
20.05.14
11:29
(3)я хочу понять причину такой блокировки
8 vi0
 
20.05.14
11:39
может быть что угодно, вплоть до эскалации
нам не видно твоих данных и т.д.
анализируй инструментами
9 Ненавижу 1С
 
гуру
20.05.14
11:53
еще, если записей с таким набором измерений еще не было, то блокируется вся таблица
10 vi0
 
20.05.14
11:58
(9) это почему?
11 hhhh
 
20.05.14
12:04
(7) однако, причем тут склад "Приходная"?
12 Stepa86
 
20.05.14
12:14
Попробуй склад проиндексировать
13 erp20
 
20.05.14
12:36
(8) Поздравлять с сертификатом?
14 Ненавижу 1С
 
гуру
20.05.14
12:51
(10) ну откуда же я знаю, но ты проверь, сделай новые и не новые
15 hhhh
 
20.05.14
12:56
(12) однако, причем склад, если он ставит точку останова раньше? Когда про склад еще неизвестно.
16 Stepa86
 
20.05.14
12:57
(15) у меня есть подозрение, что запрос делает скан по всем строкам для отбора и натыкается на заблокированные
17 Alex_MA
 
20.05.14
13:21
(8)эскалации точно нет
18 Alex_MA
 
20.05.14
13:31
(16)действительно

SELECT
T1._Period,
T1._RecorderRRef,
T1._LineNo,
T1._Active,
T1._RecordKind,
T1._Fld176RRef,
T1._Fld177RRef,
T1._Fld178RRef,
T1._Fld179,
T1._Fld180
FROM _AccumRg175 T1 WITH(NOLOCK)
WHERE (T1._Fld176RRef = P1)

И
операция по плану запроса IndexScan!! Интересно почему идет сканирование.
19 МихаилМ
 
20.05.14
13:32
(18)
отсутствует подходящий индекс по Fld176RRef
20 Stepa86
 
20.05.14
13:34
(18) строк видимо мало в таблице
21 Alex_MA
 
20.05.14
13:36
(20)точно :))), разобрался
22 Alex_MA
 
20.05.14
13:38
(19) проиндексировал, но все равно индекс скан, т.к. строк в таблице мало SQL выбирает этот способ выборки данных, поэтому блокировки и происходят
23 Alex_MA
 
20.05.14
13:51
А еще оказывается платформа не строит индекс по первому измерению регистра накопления!!!

По регистру сведений строит, а по РН - НЕТ!!!
24 Stepa86
 
20.05.14
13:58
25 fisher
 
20.05.14
13:59
(21) А говорил, что эскалаций нет
(23) Для таблиц итогов - строит
26 vi0
 
20.05.14
14:06
(13) можно
27 vi0
 
20.05.14
14:08
(14) зачем что-то гововорить, если сам не знаешь
примерно также как в этой ветке:
v8: Проверка остатков после проведения
28 vi0
 
20.05.14
14:12
(25) это не эскалация
29 Alex_MA
 
20.05.14
14:45
Создал 1000 документов.
Склад = Основной
с таблице товаров.

Теперь пытаюсь прочитать данные в транзакции по Доп. складу - который не участвует в движениях - Все ОК, данные читаются!
Пытаюсь получить данные в транзакции по Основному складу - ожидание на блокировке!

СУБД же не дурак оказывается - если данных мало - то сканирование таблицы производить - это для него проще сделсть, чем index seek (Но на таких объемах блокировки отрабатывают не в соответствии с инструкциями 1С - происходит скан таблицы -> излишние блокировки).
Создал 1000 документов - блокировки отрабатывают в соответствии с инструкцией 1С.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.