Имя: Пароль:
1C
1С v8
Как сделать семафор (разделяемая блокировка)
0 Tateossian
 
30.05.18
10:14
Всем привет! Реализован обмен с другой базой 1С с помощью веб-сервиса и универсального обмена данных (через правила конвертации). Обмен идет в текущем режиме через обработчик ожидания глобальный. И валится на блокировке вот в этот месте:

    // Создаем новое сообщение
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
        
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена); <== тут

У меня вопрос: т.о., СоздатьЗаписьСообщения - это функция менеджер ВСЕХ планов обмена, получается, это синглтон, существующий в единственном экземпляре? Ок. Как заставить писать сообщения всех вызовов, предположим, очередью?
1 Tateossian
 
30.05.18
10:27
Текст ошибки такой:  «Ошибка блокировки объекта. Объект уже заблокирован». И справочная информация на юзера, сеанс и прочее.
2 Tateossian
 
30.05.18
10:31
А никто не пробовал обмен делать что-то вроде ПотокВПамяти создать и передать буфер в приемника - com-объекта? Псевдо shared memory в 1С)
3 finik
 
30.05.18
10:37
Сделать регистр сведений с временем добавления и узлами? И последовательно в порядке добавления обрабатывать его по каждому узлу?
4 Tateossian
 
30.05.18
10:38
(3) Зачем, если уже есть таблица изменений плана обмена?
5 finik
 
30.05.18
10:47
Если правильно понял, нужно упорядочить вызовы методов ЗаписьСообщения так, чтобы они не пересекались. РС - для упорядочения этих вызовов. В нем признак с актуально обрабатываемой записью.
6 Wingless
 
30.05.18
10:54
(0) Блокируется узел плана обмена.

>Как заставить писать сообщения всех вызовов, предположим, очередью?

Не обрабатывать один узел в разных сеансах.
7 Tateossian
 
30.05.18
10:56
(6) Логично. Но, 1) как разнести узлы по сеансам? 2) если узел - один?
8 Wingless
 
30.05.18
11:06
1 регламентное задание на 1 узел, очевидно.