Имя: Пароль:
1C
1С v8
Самый быстрый способ найти ссылку по реквизиту
0 ИС-2
 
naïve
03.10.14
07:22
К нашей базе подключается COM объект и создает документ. Перед созданием происходит проверка наличия документа по входящему номеру т.е если он есть, то документ не создается. Проблема в том, что бывают сбои, когда подключается сразу 2 com-объекта и одновременно запускают создание документа. Каждый выгружает с один документ с одинаковым номером XXX
Т.е еще не записался документ  1-го com-объекта, а 2-й уже создает свой документ. Это приводит к тому, что в базе могут оказаться 2 одинаковых объекта.
Вопрос: какой самый быстрый способ записать в базу, что сейчас происходит создание документа с номером XXX, т.е забронировать этот номер и не давать 2-му com-объекту создавать с этим номером.
1 BuHu
 
03.10.14
07:25
они постоянно подключены или после своих операций отваливаются?
2 ChiginAV
 
03.10.14
07:30
(0) Проверяй наличие номера не перед созданием, а перед записью
3 ИС-2
 
naïve
03.10.14
07:39
(1) отваливаются
(2) так и сделано
4 Escander
 
03.10.14
07:39
(0) создай РС где измерения Год и номер объекта и сначало писать в РС а потом, если не отработало исключение - сам документ
5 Escander
 
03.10.14
07:41
а хотя нафига? Включить проверку уникальности номеров у документов и всё
6 ObjectRelation Model
 
03.10.14
07:45
(5) Входящий номер это походу реквизит
7 Escander
 
03.10.14
07:45
(6) тогда см (4)
8 Escander
 
03.10.14
07:46
+ (4) год создавать если у этого реквизита периодичность = Год
9 Галахад
 
гуру
03.10.14
07:50
А запретить работу пользователю в двух сеансах?
10 ИС-2
 
naïve
03.10.14
07:56
(5) (9) это реквизит. Стороняя программа скидывает к нам в базу заказы покупателя
11 Escander
 
03.10.14
07:57
(10) ну так см (4)
12 hhhh
 
03.10.14
08:01
(10) еще можно у ревизита "ВходящийНомер" поставить галочку "Индексировать", чтобы побыстрее искало.
13 ИС-2
 
naïve
03.10.14
08:09
(12) уже сделано
14 vasbur
 
03.10.14
08:12
пусть ком перед созданием блокирует како1-нибудь фиксированный объект - тогда второй процесс отвалится на этапе блокировки
15 BuHu
 
03.10.14
08:12
(3) может как нибудь проверять ,что уже есть одно соединение и в этом случае отваливаться ничего не делая ?
16 Ymryn
 
03.10.14
09:05
(0) как вариант могу предложить записывать в РежимеОбмена.Загрузка = Истина. А потом если уже надо будет нормально отработать, еще раз записывать (проводить).
17 ИС-2
 
naïve
03.10.14
09:28
(15) это идет скидывание заказов с мобильной торговли - не известно у одного агента поднялось 2 соединения или скидывать 2 разных агента
(16) задача в том, чтобы такое вообще не появлялось
18 MiniMuk
 
03.10.14
09:42
Так понимаю что по аналогии с рибом префик агента не прделагать?
19 MiniMuk
 
03.10.14
09:43
Если агент будет писать
документ.создать()
документ.Записать()
Документ.Заполнить(моиданные)
документ.толипровеститолизапсать()
20 PLUT
 
03.10.14
09:43
(0) открой для себя регистр сведений "Соответствия объектов для обмена"
21 PLUT
 
03.10.14
09:44
+(20) там всё просто - сц ылка из базы источника (ЗначениеВСтрокуВнутр()) и сц ылка в базе приемнике
22 DrZombi
 
гуру
03.10.14
09:46
(0) Используй РС для резервирования номера. Так же на основе этого РС нужно предусмотреть Запись, не до запись, это когда номер зарезервировали, но не дописали :)
Так же предусмотреть очищение мертвых резервов, через регламентное задание :)
23 DrZombi
 
гуру
03.10.14
09:48
+(0) Тогда ,если запись в РС есть, то проверяешь, на каком она статусе, если свободна, то захватываешь, если не получилось захватить, то понимаешь ,что облом и другое СОМ соединение должно либо уничтожиться, либо продолжить работу с другими объектами :)
24 ИС-2
 
naïve
03.10.14
12:16
можно сделать что-то через блокирование реквизита? Например так:

           ВЫБРАТЬ
    ЗаказПокупателя.Ссылка
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
    ЗаказПокупателя.UID = &UID

ДЛЯ ИЗМЕНЕНИЯ
?
25 ИС-2
 
naïve
03.10.14
13:22
ап
26 ИС-2
 
naïve
06.10.14
08:20
ап
27 Fragster
 
гуру
06.10.14
08:22
создай константу, перед началом создания ставь на нее исключительную блокировку и все, тогда все "лишние" процессы будут ждать
28 ИС-2
 
naïve
06.10.14
08:29
(27) тогда работа компании встанет
29 wormselfish
 
06.10.14
08:32
(0) как так они одновременно записывают документ и не видят чужой? Может используется длинная транзакция?

А иначе можно в регистр сведений записывать сперва реквизит нового документа, потом записывать документ, потом удалять из регистра значение реквизита. И еще, при каждой новой записи проверять регистр, есть-ли там запись с таким реквизитом, если есть, то значит в данный момент происходит запись другим процессом.
30 wormselfish
 
06.10.14
08:34
(28) Не встанет. Не всем же нужна эта константа.
31 wormselfish
 
06.10.14
08:38
И все таки, почему нельзя сделать разный префикс реквизитов для разных клиентов?
Чтобы первый клиент записывал документ с реквизитом например "А10008", а второй с реквизитом "А20008".
32 Fragster
 
гуру
06.10.14
10:06
(28) встанет только "лишнее" ком соединение
33 ИС-2
 
naïve
06.10.14
10:08
(32) константа же заблокируют всю загрузку - будет обрабатывать по одному com соединению
34 Fragster
 
гуру
06.10.14
10:19
(33) а тебе что надо?
35 wormselfish
 
06.10.14
11:15
(33) Ты же можешь перепрограммировать COM клиентов? Или это сторонние программы?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн