Имя: Пароль:
1C
1С v8
Блокировки, параллельная работа с дакументами
,
0 roman2
 
18.01.13
15:08
Уважаемы знатоки, внимание вопрос).
В цикле запускается пакетная обработка документов. Изменяется реквизит и  записывается (проводится).
Одновременно с этим работает обмен, которые обрабатывает те же документы .
Как грамотно сделать, чтобы все документы обработались?
Я решал эту проблему криво. В цикле делал попытку до тех пор, пока документ наконец не запишется без ошибки.

Кто что предложит?
1 Bober
 
18.01.13
15:10
либо в попытке до упора, либо переписывать выгрузку данных
2 roman2
 
18.01.13
15:15
(1) А переписывать то куда копать? Я как раз про это, как это решается по методике 1С?
3 ОчкарикСлава
 
18.01.13
15:15
пауза поставь в обработках..
4 Нуф-Нуф
 
18.01.13
15:16
остановить обмен
5 Maxus43
 
18.01.13
15:17
заблокируй документы (например запрос с ДЛЯ ИЗМЕНЕНИЯ в транзакции). в это время обмен будет стоять
6 roman2
 
18.01.13
15:20
(5) Это особенность платформы? У нас обмен самописный.
7 pavig
 
18.01.13
15:20
(0) организуй работу так, чтобы сначала был обмен, потом пакетная обработка, или наборот.
если и то и другое запускается по расписанию, то, например, организуй что-то типа очередей: например, свой РС, в который записывай очередность доступа: сначала обработка, потом обмен (или наоборот), в зависимоти от очередности пусть либо обработка ждем завершения обмена, либо наоборот
может не очень конечно вариант, но первое что пригло в голову...
(5) а обмен в этом случае не вылетит с исключениями? если нет то попробуй и так.... только если режим блокировок = Управляемый, блокировку надо будет установить по-другому, не через запрос, да и ДЛЯ ИЗМЕНЕНИЯ сработает только внутри транзакции записи....
8 Maxus43
 
18.01.13
15:21
(7) обмен вылетит, дак в след раз пошлёт. а долбить запись дока попыткой об блокировки обмена - вобще криво...
9 roman2
 
18.01.13
15:22
Еще вопрос. А нельзя ли как-то узнать, что объект заблокирован, до того как я буду его перезаписывать?
10 Maxus43
 
18.01.13
15:22
(9) нет
11 pumbaEO
 
18.01.13
15:25
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Заблокировать (Lock)
Синтаксис:

Заблокировать()
Описание:

Выполняет блокировку объекта от изменения другими режимами или пользователями.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Попытка
   НовДокумент.Заблокировать();
Исключение
   Текст = "ru = ""Невозможно заблокировать документ."";"
    + " en = ""Can't lock the document.""";
   Предупреждение(НСтр(Текст));
КонецПопытки;
12 roman2
 
18.01.13
15:27
Я придумал решение.
Делаю регистр сведений "ЗаблокированныеДокументы". Обмен его заполняет своими доками. Как все сделает, очищает.
Пакетная обработка проверяет, если документ есть в регистре, работает со следующим доком. А текущий заносит в очередь. В конце очередь рекурсивно пытается рассосаться.
Как-то так..))
13 Maxus43
 
18.01.13
15:27
(11) смысла нет, при обмене не сможет заблокировать
14 Maxus43
 
18.01.13
15:28
(12) обмен часто?
15 Maxus43
 
18.01.13
15:29
если там всё самописно так - сделай все свои операции До или После обмена, используя тоже фоновое задание. Короче пусть последовательно всё делает
16 roman2
 
18.01.13
15:35
Всем спасибо! Особые благодарности Maxus43 - респект!
17 Maxus43
 
18.01.13
15:40
(16) чо сделал то?
18 Maxus43
 
18.01.13
15:42
(7) Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.

Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции. (с)

т.е. не в транзакции записи, а в транзакции вобще
19 pumbaEO
 
18.01.13
15:43
(13)  (11) ->(9)
20 Maxus43
 
18.01.13
15:45
(19) в попытке опять же? иначе вылетит
21 pavig
 
18.01.13
15:45
(18) ну или явно указывать транзакцию, не суть
суть - что в транзакции, а не просто так как могло показаться ТСу прочитай он твоё сообщение
22 Maxus43
 
18.01.13
15:46
(21) > (5) "ДЛЯ ИЗМЕНЕНИЯ в транзакции" - я не забыл указать)
23 ssh2012
 
18.01.13
15:50
ДЛЯ ИЗМЕНЕНИЯ заблокирует от чтения только запросами с такой же конструкцией
24 Maxus43
 
18.01.13
15:51
(23) с чего вдруг? выбранные запросом данные становятся недоступны в других сессиях
25 Bober
 
18.01.13
15:51
(2) вся проблема в методах обмена выбрать изменения и прочитать изменения
первый блокирует объект при вызове Следующий()
второй блокирует при записи через параметр количество элементов в транзакции.
26 Bober
 
18.01.13
15:53
(25) Первый лечится свой выборкой и сериализацией (ЗаписатьXML), второй своим чтением xml (ПрочитатьXML).
27 ssh2012
 
18.01.13
15:56
(24) другой запрос в  параллельной в транзакции с ДЛЯ ИЗМЕНЕНИЯ не выполнится, без ДЛЯ ИЗМЕНЕНИЯ выполнится. Изменить данные до конца первой транзакции нельзя будет независимо от наличия ДЛЯ ИЗМЕНЕНИЯ. Вроде так.
28 pavig
 
18.01.13
15:57
(22) сорри, я был невнимателен
29 ssh2012
 
18.01.13
16:24
(25) если ВыбратьИзменения выполнен в транзакции, то сразу после выполнения метода заблокировано все попавшее в выборку
30 Maxus43
 
18.01.13
16:32
ибо блокируются таблицы Изменений обхектов
31 Bober
 
18.01.13
16:35
(30) поэтому типовой обмен РИб такой проблемный.