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