Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Глобальная переменная для всех пользователей и сеансов

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

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

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

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

(5) Если файл на сервере - то он и будет общий. Но есть нюанс: вот проверил ты - файла нет. И другой пользователь проверил - файла нет. И тут оба одновременно создали файл и спокойно работают. А потом один переписывает результат работы второго.
   VladVons
 
10 - 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) в базе наверняка уже есть регистр с хранимыми значениями для различных объектов. Можно использовать его.
   acht
 
14 - 23.11.20 - 13:00
(11) Имеется в виду времен между "если файл не существует", и "создать файл" в потрохах на 1С.
При этом реализация "создать файл" зависит от радиуса рук, обычно он тупо переписывается.
   dmpl
 
15 - 23.11.20 - 13:10
(11) Какой еще NTFS? Обычный 1С. Там уже добавили механизм блокировки файлов?

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

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

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.