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

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

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

Можно конечно извращатся созданием константы, регистра ведомостей, файла на диске итд.
Не феншуйно как-то
 
 Партнерская программа EFSOL Oblako
   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 или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.