|
Глобальная переменная для всех пользователей и сеансов | ☑ | ||
---|---|---|---|---|
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) не выборка.Следующий отрежеться вот тут
Если РезультатЗапроса.Пустой() Тогда Возврат Истина; КонецЕсли; Но вообще Выборку надо выбирать из РезультатаЗапроса, недостаток. и чего два раза ошибку получаешь? Сначала была первая версия от ОписаниеОшибки, остался кусочек |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |