Имя: Пароль:
1C
1С v8
Как запретить одновременное открытие отдельных внешних обработок?
0 Мимохожий Однако
 
15.12.17
07:52
КА 1.1. Есть несколько внешних обработок. Примерно 15 пользователей. Потребовалось запретить одновременное открытие и запуск некоторых из них. Например, Петров открыл, а Сидоров при открытии получает сообщение (предупреждение) "Эта обработка открыта Петровым? С него и спрашивай".
Идеи есть?
1 Гипервизор
 
15.12.17
07:59
Писать куда-нибудь по факту открытия и закрытия обработки. В регистр, в ЖР, в спортлото.
2 Dotoshin
 
15.12.17
08:00
(0) Ну заведи регистр и в него пиши при открытии обработки, кто открыл. А перед записью проверяй открыл кто-то или нет, ну а при выходе удаляй запись о входе или делай запись о выходе.
3 бомболюк
 
15.12.17
08:02
лучше заведи справочник, и при открытии блокируй элемент справочника методом Заблокировать - если проканало, значит путь свободен. Из плюсов, что блокировка снимается в случае нештатного выхода, а всякие записи в регистры естественно не удаляются сами собой.
4 Aleksey
 
15.12.17
08:05
(3) так внешние обработк и так справочник. Зачем ещё один?
5 бомболюк
 
15.12.17
08:08
(4) ну собственно да, можно его самого для этого использовать
6 бомболюк
 
15.12.17
08:09
только определить элемент для блокировки придется из тела самой обработки, а вот это по моему затруднительно.
7 1Сергей
 
15.12.17
08:27
(6) ещё до сохранения-открытия проверять
8 Мимохожий Однако
 
15.12.17
08:42
Особенность справочника ВнешниеОбработки в том, что при выборе из списка создаётся временный файл и из него открывается обработка. Хотелось бы использовать код обработки, которая лежит в реквизите ХранилищеВнешнейОбработки.
Пока выбираю из трёх вариантов:
1. Регистр сведений
2. Глобальная переменная
3. Поместить код блокировки в форму вызываемой обработки.
Первые 2 понятны.
9 1Сергей
 
15.12.17
08:47
(8) посоветовали же. Блокируй эл-т справочника Внешние обработки
10 бомболюк
 
15.12.17
08:48
(8) а глобальная переменная то тут каким боком?
11 Мимохожий Однако
 
15.12.17
09:03
В форму внешней обработки, которую подключаю в справочник Внешние обработки, добавил следующий код:
..

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Спр=Справочники.ВнешниеОбработки.НайтиПоНаименованию(ЭтотОбъект.Метаданные().Представление());
    НайдОбъект=Спр.ПолучитьОбъект();
    Попытка
        НайдОбъект.Заблокировать();
    Исключение
        Предупреждение("Обработка "+НайдОбъект+"уже открыта ранее");// + "!"+ ОписаниеОшибки());
        Отказ=Истина;
    КонецПопытки;
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Попытка
        НайдОбъект.Разблокировать();
    Исключение
        //Предупреждение("Не удалось разблокировать объект "
        //+НайдОбъект + "!"+ ОписаниеОшибки());
    КонецПопытки;    
КонецПроцедуры
12 Мимохожий Однако
 
15.12.17
09:03
(11) Вроде работает. Надо только отслеживать, чтобы не было одинаковых наименований для разных обработок в справочнике.
13 1Сергей
 
15.12.17
09:03
(11) >> Спр=Справочники.ВнешниеОбработки.НайтиПоНаименованию(ЭтотОбъект.Метаданные().Представление());

Это что за фигня?
14 1Сергей
 
15.12.17
09:04
а... понял
15 бомболюк
 
15.12.17
09:04
Из фрагмента не видно, но НайдОбъект надо "держать", сделай его переменной модуля формы.
16 бомболюк
 
15.12.17
09:05
а ваще то да, ты его уже сделал, звиняй
17 Мимохожий Однако
 
15.12.17
09:05
(13) При подключении новой обработки в справочник представление обработки подкидывается в наименование элемента.
18 Мимохожий Однако
 
15.12.17
09:06
(15) Забыл добавить что добавил переменную формы НайдОбъект
19 1Сергей
 
15.12.17
09:07
Наименование же не всегда равно Представлению обработки
20 Мимохожий Однако
 
15.12.17
09:10
(19) Конечно. Но в первом приближении подходит. Другого способа поиска элемента справочника Внешние обработки я пока не придумал.
21 Ёпрст
 
15.12.17
09:15
(11) разблокировать лишне в коде, блокировка сама отвалится при закрытии
22 Mort
 
15.12.17
09:46
(0) А зачем?
23 Мимохожий Однако
 
15.12.17
09:51
(22) У Заказчика есть обработка, которая скачивай по команде пользователя заказы. При одновременном открытии и запуске иногда дублируются заказы. Случается не часто, но их напрягает.
24 Мимохожий Однако
 
15.12.17
09:51
*скачивает
25 Mort
 
15.12.17
10:05
(23) Имхо блокировка тут должна быть пониже уровня. Например курить в сторону управляемых блокировок и свойства документа "Поля блокировки данных".
26 Mort
 
15.12.17
10:07
ЭлементБлокировкиДанных.УстановитьЗначение (DataLockItem.SetValue)
ЭлементБлокировкиДанных (DataLockItem)
УстановитьЗначение (SetValue)  + вот это в СП
27 Мимохожий Однако
 
15.12.17
14:01
(26) У меня стояла задача, не меняя конфигурацию заблокировать повторное открытие обработки из справочника Внешние обработки. И всё. Если есть пример, как это сделать по-другому - подскажи кодом.