Имя: Пароль:
1C
1С v8
Как запретить запуск внешней обработки если она открыта другим пользователем
0 Мимохожий Однако
 
29.08.16
17:03
Обычное приложение. УТ10.3. Может быть, есть ссылки или идеи на этот велосипед?
1 hitodom
 
29.08.16
17:05
делай блокировку какогонибудь элемента справочника
2 Лефмихалыч
 
29.08.16
17:05
блокируй в базе что-нибудь проверяй наличие блокировки перед открытием.

Но лучше расскажи, зачем это надо
3 Мимохожий Однако
 
29.08.16
17:06
Уточню. Я про обработку, хранимую в справочнике Внешние обработки
4 Горогуля
 
29.08.16
17:06
выбрать 0 из РС.ОткрытыеОбработки где РС.Обработка=&Нужная
5 Горогуля
 
29.08.16
17:07
(3) открывается каждый раз разная
6 Лефмихалыч
 
29.08.16
17:07
(4) а потом сеанс был завершен администратороом и с тех пор больше ни кто не может открыть обработку
7 hitodom
 
29.08.16
17:07
(3) тогда уже есть элемент, который можно блокировать
8 Мимохожий Однако
 
29.08.16
17:08
(2) Обработкой могут пользоваться несколько человек, но запускать должен только один из них. Обработка загружает данные, в этой обработке есть промежуточные действия. По итогам действий создаются документы. Надо избежать дублей.
9 hitodom
 
29.08.16
17:08
(6) блокировки вообще то сами снимаются
10 Мимохожий Однако
 
29.08.16
17:10
(4) Такого объекта в типовой УТ10.3 нет.
(7) Фрагмент кода можешь сбросить для примера?
11 Лефмихалыч
 
29.08.16
17:11
(9) смотри в (4) - он предлагает блокировки ХРАНИТЬ в БД

(8) во-первых, если делать, как в (2), то так и будет работать. Во-вторых, говно твоя обработка. Сделай так, чтобы она не делал дублей и всё.
12 Мимохожий Однако
 
29.08.16
17:12
Пока склоняюсь к варианту записывать в регистр сведений Сохраненные настройки запись-флажок при открытии обработки. Если запись уже есть, то закрывать форму с сообщением пользователю что другой уже с этой обработкой работает.
13 Лефмихалыч
 
29.08.16
17:13
(10)
СправочникОбъект.<Имя справочника>.Заблокировать (CatalogObject.<Имя справочника>.Lock)
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
Заблокировать (Lock)
Синтаксис:

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

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

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

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

Попытка
    Объект.Заблокировать();
Исключение
    Предупреждение(НСтр("ru = 'Не удалось заблокировать объект';"
           + " en = 'Can't lock the object'")
           + " '" + Объект + '"!
           |"+ ОписаниеОшибки());
КонецПопытки;
14 Мимохожий Однако
 
29.08.16
17:13
+(12) А при закрытии очищать от этой записи
15 Лефмихалыч
 
29.08.16
17:13
(12) что будет, если сеанс пользователя завершится аварийно до того, как он успеет удалить эту запись?
16 Мимохожий Однако
 
29.08.16
17:16
(15) Плохо будет ))
(13) Хороший метод. Но для этого надо наверное лепить дополнительную подписку на событие при открытии конкретной  обработки.
17 Лефмихалыч
 
29.08.16
17:17
(16) какая в хрен подписка?! Я же в самом начале написал - перед открытием формы обработки это делай и всё!
18 Лефмихалыч
 
29.08.16
17:17
и подписок на события форм не бывает
19 Мимохожий Однако
 
29.08.16
17:18
(17) Спасибо за пинок. Попробую этот вариант.
20 takefive
 
29.08.16
17:27
У меня обработка обмена пишет в текстовый файл историю обмена между узлами. Кто первый открыл - тот и пользуется. Если файл недоступен - остальные идут в сад
21 Мимохожий Однако
 
29.08.16
17:34
(20) Это похоже на вариант с регистром сведений. И, вероятно, работает только для файловых баз.
22 Мимохожий Однако
 
29.08.16
17:37
Фокус в том, что особенностью справочника Внешние обработки является открытие обработки во временном файле и связь с элементом справочника теряется. И не удаётся применить метод Блокировать(). Во всяком случае  я не смог пока реализовать.
23 Лефмихалыч
 
29.08.16
17:39
(22) хоспади, что ж ты такой беспомощный?!
Найди ссылку на элемент справочника по коду или по наименованию
24 Лефмихалыч
 
29.08.16
17:40
можно подумать, если бы не из временного файла открывалось, связь бы не терялась...
25 Мимохожий Однако
 
29.08.16
17:40
(23) К вечеру туплю. По наименованию, это достаточно просто.
26 Мимохожий Однако
 
29.08.16
17:41
(24) Спасибо еще раз
27 Torquader
 
29.08.16
18:40
При регистрации обработки в справочнике присваиваем ей уникальный идентификатор, который в ней же и хранится, находим элемент по этому идентификатору и блокируем его.
Блокировать лучше при открытии, чтобы пользователь видел сообщение о том, что обработка кем-то открыта.
Если в комментарий элемента записать кем открыта, то можно будет также узнать, кто и зачем её открыл.
28 Лефмихалыч
 
29.08.16
19:39
(27) при аварийном завершении это всё превратится в тыкву
29 Torquader
 
29.08.16
19:41
(28) При аварийном завершении блокировка снимется, и тыкву можно будет затереть.
30 breezee
 
29.08.16
20:47
Почему бы не блокировать данные, к которым обращается обработка?
31 Deon
 
29.08.16
21:14
(30) Видать, она новые данные создает. Нечего там блокировать
32 Dmitry77
 
29.08.16
21:33
Можно блокировать файлы из которых идёт загрузка
Или их как нибудь копировать/перемещать
33 Dmitry77
 
29.08.16
21:48
Ну или совсем банально
В неком каталоге создаётся файл (элемент стправочника, константа, запись регистра сведений)
При старте обработки
Проверяется что в файле (справочнике, константе)
Если там есть пользователь - выводиться сообщение
Занято тем-то
При закрытии обработки элемент очищается.
В случае фарс мажера надо открыть и закрыть обработку тем, кто числиться в файле(...)
34 Лефмихалыч
 
29.08.16
21:50
(29) я про блокировку не прочитал, извини


на самом деле надо обработки писать так, чтоб они не ломали ни чего при повторном запуске. Ибо два раза нажать "Выполнить" и один пользователь может
35 Torquader
 
29.08.16
22:40
(33) Не надо закрывать-открывать - обработка открывает файл на запись и пишет в него данные пользователя, а другие - читают. Только писать, видимо, придётся не через 1С, так как она не умеет писать, то что другие читают, и читать, что она пишет.
В 7.7. был объект Scripting.TextStream, который с этой задачей справлялся на ура - видимо - здесь можно также и его использовать, а в Linux-е просто подключить .Net, как тут люди писали.
P.S. файл можно использовать, если обработка не в базе, а открывается через Файл,Открыть. И самое место файла в директории файловой базы, а в случае клиент-сервера - в TEMP для процесса сервера.
36 Torquader
 
29.08.16
22:41
(34) Видимо, автор предполагает, что два пользователя будут делать одно и то же - например - можно один документ вводить сразу на нескольких рабочих местах, только в результате, будет два одинаковых документа.
Программист всегда исправляет последнюю ошибку.