Имя: Пароль:
1C
1С v8
Глобальная переменная для всех пользователей и сеансов
,
0 VladVons
 
23.11.20
12:22
Есть обработка, которую может запустить любой пользователь.
Вопрос в том как исключить одновременный запуск от нескольких пользователей одновременно?
В начале обработки надо КУДА-ТО записать значение семафора "обработка занята", а в конце обработки записать значение "обробка свободна".

Можно конечно извращатся созданием константы, регистра ведомостей, файла на диске итд.
Не феншуйно как-то
1 acht
 
23.11.20
12:27
> Не феншуйно как-то
Твоя глобальная переменная еще больше нефеншуйная.

Будь мужиком, напиши обработку так, чтобы она работала без ошибок, с блокировками данными, подкидным дураком и поэтессами.
2 Василий Алибабаевич
 
23.11.20
12:28
(0) "регистра ведомостей" оно конечно таки да "Не феншуйно как-то".
Но чем константа не угодила? Или запись в регистре свдений? В РС можно прописать не только что "оно занято и его не трогать". Но и кто занял и когда (может в середине прошлого года и пользователь уже уволился нафик...).
3 Малыш Джон
 
23.11.20
12:31
>> а в конце обработки записать значение "обробка свободна"

а конца не было, т.к. сервер перезагрузили - и что тогда?
4 БаксПо90
 
23.11.20
12:31
не знаю, я в похожей ситуации использую файл на диске .. и проверяю его время создания .. если время не в интервале , то переписываю , если в интервале то считаю его живым и пользуюсь им
5 Малыш Джон
 
23.11.20
12:33
(4) файл плох тем, что должен быть ресурс с общим для всех пользователей доступом
6 H A D G E H O G s
 
23.11.20
12:35
Функция УстановитьСнятьБлокировку(ТранспортныйМодуль,ОбластьБлокировки,ИдентификаторФормы,ЭтоСнятиеБлокировки) Экспорт
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    АСФОбъектыВариантовОбменаДляБлокировки.Ссылка КАК Ссылка,
    |    АСФОбъектыВариантовОбменаДляБлокировки.ОбластьБлокировки КАК ОбластьБлокировки
    |ИЗ
    |    Справочник.АСФОбъектыВариантовОбменаДляБлокировки КАК АСФОбъектыВариантовОбменаДляБлокировки
    |ГДЕ
    |    АСФОбъектыВариантовОбменаДляБлокировки.ТранспортныйМодуль = &ТранспортныйМодуль
    |    И АСФОбъектыВариантовОбменаДляБлокировки.ОбластьБлокировки = &ОбластьБлокировки";
    Запрос.УстановитьПараметр("ТранспортныйМодуль",ТранспортныйМодуль);
    Запрос.УстановитьПараметр("ОбластьБлокировки",ОбластьБлокировки);
    РезультатЗапроса=Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Справочники.АСФОбъектыВариантовОбменаДляБлокировки.ЗаполнитьСправочникОбъектовВариантовОбменаДляБлокировки();
        РезультатЗапроса=Запрос.Выполнить();
    КонецЕсли;
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Истина;
    КонецЕсли;
    Выборка=Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    ОбъектБлокировки=Выборка.Ссылка;
    
    Если ЭтоСнятиеБлокировки Тогда
        РазблокироватьДанныеДляРедактирования(ОбъектБлокировки,ИдентификаторФормы);
        Возврат Истина;
    КонецЕсли;
    
    СоответствиеОбластиБлокировкиИСообщения=Новый Соответствие;
    СоответствиеОбластиБлокировкиИСообщения.Вставить(0,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки ТТН и АКТОВ: ");
    СоответствиеОбластиБлокировкиИСообщения.Вставить(1,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки ТТН: ");
    СоответствиеОбластиБлокировкиИСообщения.Вставить(2,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки АКТОВ: ");
    
    ЕстьОшибкаБлокировки=Ложь;
    Попытка
        ЗаблокироватьДанныеДляРедактирования(ОбъектБлокировки,,ИдентификаторФормы);
    Исключение
        Ошибка=ОписаниеОшибки();
        Ошибка=ИнформацияОбОшибке();
        ОписаниеОшибки=Ошибка.Причина.Описание;
        АСФОбщегоНазначенияКлиентСервер.СообщитьПользователю(СоответствиеОбластиБлокировкиИСообщения.Получить(ОбластьБлокировки)+ОписаниеОшибки);
        ЕстьОшибкаБлокировки=Истина;
    КонецПопытки;
    Если ЕстьОшибкаБлокировки=Истина Тогда
        РазблокироватьДанныеДляРедактирования(ОбъектБлокировки,ИдентификаторФормы);
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции
7 Aleksey
 
23.11.20
12:37
раньше делали через блокировку константы.
Т.е. некая константа.Заблокировать()
8 VladVons
 
23.11.20
12:42
Пробовал ХранилищеОбщихНастроек.Сохранить() где последним параметром указывается пользователь.
Фмшка работает в том случае, если пользователь имеет полные права, иначе ошибка доступа.
9 dmpl
 
23.11.20
12:49
(0) Судя по 1С феншуйно - через регистр сведений, где уже указывать, что именно заблокировано. Соответственно, пока можно "все заблокировано", а затем, при необходимости добавляешь измерение - и уже

(5) Если файл на сервере - то он и будет общий. Но есть нюанс: вот проверил ты - файла нет. И другой пользователь проверил - файла нет. И тут оба одновременно создали файл и спокойно работают. А потом один переписывает результат работы второго.
10 VladVons
 
23.11.20
12:54
из того что летает в эфире связка Рагистр Сведений + Дата наиболее приемлемая.
хотя любопытсво не исчерпано.
11 Василий Алибабаевич
 
23.11.20
12:56
(9) "И тут оба одновременно создали файл" Птля... В NTFS? Я хочу это видеть.
12 Малыш Джон
 
23.11.20
12:58
(9) >>Если файл на сервере - то он и будет общий

Обеспечивать общую папку - лишний гемморой

>>Но есть нюанс: вот проверил ты - файла нет. И другой пользователь проверил - файла нет. И тут оба одновременно создали файл и спокойно работают.

Ну тут как раз просто: после запуска обработки - ещё раз проверять наличие другого файла; если свое время раньше, чем в чужом файле - то все норм, если позже - завершать обработку.
13 Малыш Джон
 
23.11.20
12:59
(10) в базе наверняка уже есть регистр с хранимыми значениями для различных объектов. Можно использовать его.
14 acht
 
23.11.20
13:00
(11) Имеется в виду времен между "если файл не существует", и "создать файл" в потрохах на 1С.
При этом реализация "создать файл" зависит от радиуса рук, обычно он тупо переписывается.
15 dmpl
 
23.11.20
13:10
(11) Какой еще NTFS? Обычный 1С. Там уже добавили механизм блокировки файлов?

(12) А если одинаково? А если обе обработки прочитают время последнего созданного файла?
16 Малыш Джон
 
23.11.20
13:15
(15) >>А если одинаково?

Если одинаковое время, то значит приоритет надо добавлять: главбух МарьСтепанна главнее стажерки Светочки. Ну или завершать обработку(каждый сеанс - свою). Перезапустят.

(16)>> А если обе обработки прочитают время последнего созданного файла?

Как последнего? Каждый сеанс естественно какой-то свой идентификатор пишет и понимает, какой файл его, а какой нет.
17 vova1122
 
23.11.20
13:17
Давно на семерке подобное также делал через файл. Мне нужно было проверять какие печатные формы чаще используются. Какраз там заметил что иногда при одновременной печати иногда данные в файл не дописывались. Но меня это устроило (в пределах погрешности). Так что файлом ненадежно
18 acht
 
23.11.20
13:17
(16) > Если одинаковое время
ТЫ еще про часовой пояс вспомни
19 Serg_1960
 
23.11.20
13:39
Хех, я бы регистр сведений использовал для ведения протокола работы обработки - сама по себе полезная информация. И эти-же записи в регистре можно использовать для реализации проверки "уникальности" запуска обработки.
20 VladVons
 
23.11.20
14:14
(13) имя его назовите
21 Salimbek
 
23.11.20
14:21
(20) ЗначенияСвойствОбъектов?
22 TormozIT
 
гуру
23.11.20
14:34
(7) У констант нет объектных блокировок. А сама идея использования объектных блокировок в качестве мютекса - годная.
Можно создать фиктивный справочник и назвать "Мютексы" с предопределенными элементами для красоты.

СправочникОбъект.<Имя справочника> (CatalogObject.<Catalog name>)
Заблокировать (Lock)
Синтаксис:
Заблокировать()
Описание:
Выполняет блокировку объекта от изменения другими режимами или пользователями.
23 Малыш Джон
 
23.11.20
14:48
(20) Что имя... Роза пахнет розой,
хоть розой назови, хоть нет...
24 acht
 
23.11.20
16:17
(22) > А сама идея использования объектных блокировок в качестве мютекса - годная.

Ровно до того момента, пока в базу не придет какой-нибудь автообмен с намерением поправить обрабатываемые данные, который про ваши мьютексы и знать не знает.
25 TormozIT
 
гуру
23.11.20
16:29
(24) Крайне маловероятный сценарий. Чувствуется, что ты сильно тужился, но не придумав весомого аргумента против, видимо решил написать это.
Зачем включить справочник "Мютексы" в состав планов обмена или загружаемые/выгружаемые данные?
26 acht
 
23.11.20
16:41
(25) И чем отсутствие справочника мьютексов в плане обмена спасет, например, от изменения данных через сеанс odata?
27 mikecool
 
23.11.20
17:44
(6) а если не выборка.Следующий?
и чего два раза ошибку получаешь?
28 Lexandr
 
23.11.20
18:51
С РС меня смущает вариант, когда клиент 1С "вылетит" и запись останется, что объект заблокирован. Если тока обновлять запись с определенным таймингом - прошло 10 сек, значит все умерли, можно работать.
29 H A D G E H O G s
 
23.11.20
19:21
(27) не выборка.Следующий отрежеться вот тут
Если РезультатЗапроса.Пустой() Тогда
        Возврат Истина;
    КонецЕсли;

Но вообще Выборку надо выбирать из РезультатаЗапроса, недостаток.

и чего два раза ошибку получаешь?

Сначала была первая версия от ОписаниеОшибки, остался кусочек