Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Блокировки, параллельная работа с дакументами

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

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

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует