Имя: Пароль:
1C
1С v8
Методы блокировки объектов
0 Septera
 
23.04.12
15:43
Решил навести порядок в фоновой обработке некоторых документов, помня примерно как это делается приступил к тестированию на SQL базе двух вариантов:
1. Заблокировать()
2. "ВЫБРАТЬ ДЛЯ ИЗМЕНЕНИЯ"

По сабжу что лучше то?
1 Maxus43
 
23.04.12
15:45
1. хз, помоему он не работает как хочется
2. работает в рамках транзакции
2 rs_trade
 
23.04.12
15:47
(0) Заблокировать()    это ты чей метод имеешь ввиду? так на всякий случай.
3 Septera
 
23.04.12
15:51
(1) тестил сейчас Заблокировать() на объектах документа, все отлично работает, параллельно с других компов добавлял новые документы, а то что транзакция нужна для второго варианта это да, но впринципе не страшно, главное результат))
(2) объект документа
4 Septera
 
23.04.12
16:08
Методика тестирования:
- на первом ПК запускаем:

ДокОбъект = Документы.ЗаказПокупателя.НайтиПоНомеру("УТ000034632", ТекущаяДата()).ПолучитьОбъект();
ДокОбъект.Заблокировать();
Секунды = 15;
СтрокаЗапроса = "ping -n 1 -w "+Строка(Формат(1000*Секунды, "ЧГ=0"))+" 127.255.255.255";
Соединение = Новый COMОбъект("WScript.Shell");
Соединение.Run(СтрокаЗапроса, 0, -1);

- на втором ПК через 5 секунд запускаем:

ДокОбъект = Документы.ЗаказПокупателя.НайтиПоНомеру("УТ000034632", ТекущаяДата()).ПолучитьОбъект();
ДокОбъект.Заблокировать();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Результат: на втором ПК исключение: "Не удалось заблокировать запись."
5 Фауст
 
23.04.12
16:10
Ты теплое с мягким сравниваешь. Эти методы разные задачи решают они не взаимозаменяемые. У тебя задача какая ?
6 Reset
 
23.04.12
16:11
Порадовал метод получения паузы в 15 сек
7 Septera
 
23.04.12
16:12
(5) блокировать объект на время его использования и корректно отслеживать это на остальных пк
8 Фауст
 
23.04.12
16:20
Это что обработка которая документы проводит ? Чего боишся ? блокировкой от чего защитится хочешь ?
9 Septera
 
23.04.12
16:28
(8) прямо допрос)
1. обработка создает документы
2. дедлоков
3. от дедлоков
10 Фауст
 
23.04.12
16:33
Просто мало инфы чтобы тебе ответить...
Если от дедлоков то про Заблокировть() забуть, это вообще из другой оперы. Тебе нужно использовать "ДЛЯ ИЗМЕНЕНИЯ" И не в самой обработке, а в модуле проведения, это если их там еще нет, обычно если не самописка они там уже есть.
11 Septera
 
23.04.12
16:38
(10) "ДЛЯ ИЗМЕНЕНИЯ" уже полгода использую на одном очень агрессивном узле и там этот метод блокировки показал хороший результат, но подумал может есть лучший вариант, к примеру программная (поверхностная) блокировка объектов
12 Фауст
 
23.04.12
16:47
Не, так не получится, у тебя он не будет ждать пока блокировка снимется, просто отвалится, если наткнется. Ты блокируешь только документы но не регистры- дедлоки все равно не вылечатся. А один и тот же документ все равно одновременно нельзя записать разным пользователям, так что смысла не имеет.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший