Имя: Пароль:
1C
1С v8
Порядок проведения влияет на упр блокировку
0 break
 
28.02.14
10:36
взвел конфу и нужные объекты в режим управляемых блокировок. Прописал в документе следующий код

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Детали");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Деталь", Деталь);
ЭлементБлокировки.УстановитьЗначение("Партия", Партия);

Блокировка.Заблокировать();

Движение = Движения.Детали.Добавить();
Движение.ВидДвижения  = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Деталь = Деталь;
Движение.Партия = Партия;
Движение.Количество = Количество;

Предупреждение("1");
Движения.Детали.Записать();
Предупреждение("2");
//проверяем на отриц остатки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ДеталиОстатки.КоличествоОстаток КАК Количество
|ИЗ
|    РегистрНакопления.Детали.Остатки(
|    &ТочкаИтогов,
|    Деталь = &Деталь
|       И Партия = &Партия) КАК ДеталиОстатки
|ГДЕ
|    ДеталиОстатки.КоличествоОстаток < 0";

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

теперь если провести документ №1 с партией №1 И деталью №1 от 20.02.14, остановиться на предупреждение №2, а потом потом провести документ №2 с партией №2 И деталью №1 от 21.02.14, то док №2 проводится. Если же поменять порядок проведения док-ов (застопорить док №2, провести док №1), то док №1 отваливается с таймаутом ожидания на запросе получения отрицательных остатков. Не могу понять, почему так происходит, пространство блокировок ведь разное.

База на MSSQL 2008.
1 break
 
28.02.14
10:38
".., а потом потом провести документ №2 с партией №2 И деталью №1 ..."  => опечатка читать как "..., а потом потом провести документ №2 с партией №2 И деталью №2.."
2 ptiz
 
28.02.14
10:42
ПЕРЕпроведение тут не мешается? Удаление движений - не автоматическое?
3 break
 
28.02.14
10:44
да я перепровожу, удаление -  Удалять автоматически при отмене проведения
4 ptiz
 
28.02.14
10:45
(3) Переписывай на ручное удаление движений. См. как в типовых.
5 ptiz
 
28.02.14
10:45
Сначала можешь убедиться, что при проведении (не ПЕРЕпроведении) всё работает как надо.
6 break
 
28.02.14
10:47
(5) да при проведении все отрабатывает, перед установкой блокировки такой код

Движения.Детали.Записывать = Истина;
Движения.Детали.Очистить();

Блокировка = Новый БлокировкаДанных;
7 break
 
28.02.14
10:54
установил свойство "Удаление движений" в Не удалять автоматически, все равно блокируется
8 ptiz
 
28.02.14
11:03
(6) Не так.
Так ты движения из базы не удалил и при запросах они будут мешать.
Сделай так:
Движения.Детали.Очистить();
Движения.Детали.Записать();
9 GROOVY
 
28.02.14
11:22
Тут объект блокировка не нужен. Достаточно указать
Движения.Детали.БлокироватьДляИзменения = Истина;
10 GROOVY
 
28.02.14
11:24
Движения.Детали.Очистить();
Движения.Детали.Записывать = Истина;
Движения.Детали.БлокироватьДляИзменения = Истина;

Движение = Движения.Детали.Добавить();
Движение.ВидДвижения  = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Деталь = Деталь;
Движение.Партия = Партия;
Движение.Количество = Количество;

Движения.Записать();

Запрос = Новый Запрос;
...
11 break
 
28.02.14
12:03
(8) не сработало ((

(10) а регистр тогда должен быть с включенным разделителем итогов? сейчас он выключен и использование

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

все равно дает "Превышено время ожидания запроса на блокировку"