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