|
Установка блокировки на регистр при запуске обработки | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
26.03.19
✎
20:09
|
Хочу при открытии обработки установить блокировку на регистр накопления и снять её после закрытия обработки. Как это сделать?
|
|||
1
H A D G E H O G s
26.03.19
✎
20:14
|
Зачем?
|
|||
2
Franchiser
гуру
26.03.19
✎
20:18
|
Планирую в обработке заполнить ТЧ записями регистра с номером записи, и потом по номеру записи выполнить исправление отдельных записей .
|
|||
3
Franchiser
гуру
26.03.19
✎
20:19
|
В типовой обработке дат запрет изменения это как то реализовано.
|
|||
4
H A D G E H O G s
26.03.19
✎
20:19
|
Ну обычным способом не получится, только упр. блокировка на время вызова.
|
|||
5
H A D G E H O G s
26.03.19
✎
20:20
|
Необычно - создать справочник с препопределенными значениями и блокировать их
|
|||
6
Franchiser
гуру
26.03.19
✎
20:20
|
Блокировки я умею ставить в транзакции, а эту блокировку нужно как то к уид формы привязать.
|
|||
7
H A D G E H O G s
26.03.19
✎
20:21
|
Попытка
ЗаблокироватьДанныеДляРедактирования(Справочники.АСФОбъектыБлокировки.ОбменСOmobus); Исключение Ошибка=ИнформацияОбОшибке(); ОписаниеОшибки=Ошибка.Причина.Описание; СтруктураВозврата=Новый Структура; СтруктураВозврата.Вставить("Результат",Ложь); СтруктураВозврата.Вставить("ОписаниеОшибки","Обработка заблокирована и не будет запущена во избежание дублирования загрузки: "+ОписаниеОшибки); ЕстьОшибкаБлокировки=Истина; КонецПопытки; |
|||
8
H A D G E H O G s
26.03.19
✎
20:22
|
Если надо привязать к форме - там есть 3 параметр на УИД
|
|||
9
H A D G E H O G s
26.03.19
✎
20:22
|
ЗаблокироватьДанныеДляРедактирования (LockDataForEdit)
Синтаксис: ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>) |
|||
10
Franchiser
гуру
26.03.19
✎
20:23
|
(5) не, справочник я не буду делать. Мне чисто для интереса. Сейчас у меня сделана блокировка на набор записей
|
|||
11
Cyberhawk
26.03.19
✎
20:23
|
(7) Ну это сработает только если в других местах тоже такая договоренность имеется (пытаться заблокировать элемент справочника)
|
|||
12
Franchiser
гуру
26.03.19
✎
20:25
|
(9) это позволяет блокировать весь регистр, без указания ключа ?
|
|||
13
H A D G E H O G s
26.03.19
✎
20:25
|
(11) Транзакция завершается при завершении серверного вызова, поэтому, либо (7), либо никак.
|
|||
14
H A D G E H O G s
26.03.19
✎
20:26
|
(12) Нет. В документации видно, что может являться ключом блокировки
|
|||
15
Franchiser
гуру
26.03.19
✎
20:28
|
Ладно, потом посмотрю как сделали в обработке редактирования дат запрета, что нельзя писать в другом сеансе в регистр дат запрета. Они как то через ВХ блокировки передают.
|
|||
16
H A D G E H O G s
26.03.19
✎
20:37
|
(15) Через КлючЗаписи РС ДатыЗапретаИзменения и ЗаблокироватьДанныеДляРедактирования()
|
|||
17
Franchiser
гуру
26.03.19
✎
20:39
|
Да нашел:
&НаСервереБезКонтекста Процедура РазблокироватьВсеЗаписиНаСервере(АдресУстановленныхБлокировок) Блокировки = ПолучитьИзВременногоХранилища(АдресУстановленныхБлокировок); ЗначенияКлючаЗаписи = Новый Структура("Раздел, Объект, Пользователь"); Попытка Индекс = Блокировки.Состав.Количество() - 1; Пока Индекс >= 0 Цикл ЗаполнитьЗначенияСвойств(ЗначенияКлючаЗаписи, Блокировки.Состав[Индекс]); КлючЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьКлючЗаписи(ЗначенияКлючаЗаписи); РазблокироватьДанныеДляРедактирования(КлючЗаписи, Блокировки.ИдентификаторФормы); Блокировки.Состав.Удалить(Индекс); Индекс = Индекс - 1; КонецЦикла; Исключение ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок); ВызватьИсключение; КонецПопытки; ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок); КонецПроцедуры &НаСервереБезКонтекста Функция ЗаблокироватьЗаписьНаСервере(ОписаниеКлючаЗаписи, АдресУстановленныхБлокировок) Блокировки = ПолучитьИзВременногоХранилища(АдресУстановленныхБлокировок); ЗначенияКлючаЗаписи = Новый Структура("Раздел, Объект, Пользователь"); ЗаполнитьЗначенияСвойств(ЗначенияКлючаЗаписи, ОписаниеКлючаЗаписи); КлючЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьКлючЗаписи(ЗначенияКлючаЗаписи); ЗаблокироватьДанныеДляРедактирования(КлючЗаписи, , Блокировки.ИдентификаторФормы); БлокировкаДобавлена = Ложь; Если Блокировки.Состав.НайтиСтроки(ЗначенияКлючаЗаписи) = 0 Тогда ЗаполнитьЗначенияСвойств(Блокировки.Состав.Добавить(), ЗначенияКлючаЗаписи); БлокировкаДобавлена = Истина; КонецЕсли; ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок); Возврат БлокировкаДобавлена; КонецФункции |
|||
18
Franchiser
гуру
26.03.19
✎
20:45
|
(16) с регистрами сведений понятно.
А для регистров накопления ЗаблокироватьДанныеДляРедактирования работает? |
|||
19
Cyberhawk
26.03.19
✎
20:47
|
(13) Насчет "никак" это ты погорячился. Что мешает удерживать транзакцию сколько нужно (например, внутри нее крутить цикл с условием выхода)?
|
|||
20
H A D G E H O G s
26.03.19
✎
20:48
|
(19) Ясное и незамутненное мутотней восприятие реальности.
|
|||
21
H A D G E H O G s
26.03.19
✎
20:49
|
(18) Вряд ли, в СП только РС. Но, если у вас получится, напишите сюда.
|
|||
22
Franchiser
гуру
26.03.19
✎
21:02
|
Можно попробовать установить блокировку на регистраторы.
Вот пример с ИТС: &НаСервере Функция ПримерМодификации() ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000001"); Попытка ЗаблокироватьДанныеДляРедактирования(ТоварСсылка); // Можно выполнять модификацию данных объекта // ... ТоварОбъект = ТоварСсылка.ПолучитьОбъект(); ТоварОбъект.Наименование = "Новое наименование"; ТоварОбъект.Записать(); Возврат Истина; Исключение // Нельзя модифицировать данные объекта Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Данные объекта уже заблокированы"; Сообщение.Сообщить(); Возврат Ложь; КонецПопытки; КонецФункции |
|||
23
palsergeich
26.03.19
✎
21:11
|
(19) а то что потом люди что бы как то работать в базе ставят ожидание 600 секунд.
Прямо сейчас я в такой базе копаюсь, у меня просто горит, а самое главное, то что там наху..верчено, совершенно бессмысленно. |
|||
24
palsergeich
26.03.19
✎
21:12
|
Я не говорю что это невозможно, но архитектурное решение под эту задачу выбрано неверно. У одного обработка открыта, он пошел пить чай, остальные работать не могут.
Круче только вопрос в обработке проведения задавать. |
|||
25
palsergeich
26.03.19
✎
21:14
|
(22) уже лучше, но все равно не торт
|
|||
26
palsergeich
26.03.19
✎
21:18
|
Но объектная блокировка - это последнее дело.
|
|||
27
palsergeich
26.03.19
✎
21:24
|
Самый тупой способ реализации этой задачи:
Создается РС. при старте обработки он заполняется. При закрытии как то очищается. + Подписка на событие записи этого регистра. отказ, когда такая запись в служебном регистре есть. Нормально этот регистр будет пустой, влияние на производительность должно быть минимальным. |
|||
28
Franchiser
гуру
26.03.19
✎
21:25
|
Да у меня вообще разовая обработка, не буду я регистры создавать
|
|||
29
palsergeich
26.03.19
✎
21:25
|
(28) Все вы так говорите
|
|||
30
palsergeich
26.03.19
✎
21:27
|
А потом эта разовая обработка вызывается раз в 5 минут, вся база в управляемых блокировках, таймаут 600 секунд выкручен.
В таком виде мне одна база досталась вчера. |
|||
31
Cyberhawk
26.03.19
✎
21:27
|
(24) "У одного обработка открыта, он пошел пить чай, остальные работать не могут" // Так это ж "проектное решение" из сабжа - пока обработка открыта
|
|||
32
Cyberhawk
26.03.19
✎
21:28
|
Чем отличается плане невозможности работы других от (27) - хз
|
|||
33
palsergeich
26.03.19
✎
21:28
|
(31) Ну дык установи монопольный режим и не ипи мозги)
В БСП же ща шикарная выгонялка, одному в базе остаться - 2 клика |
|||
34
Franchiser
гуру
26.03.19
✎
21:29
|
я блокирую только документ операция определенного типа, загруженные автоматически, их никто и не открывает кроме меня
|
|||
35
Cyberhawk
26.03.19
✎
21:30
|
А зачем тебе блокировать при открытии, а не при нажатии кнопки, когда собственно что-то и начнет происходить?
|
|||
36
palsergeich
26.03.19
✎
21:30
|
(32) тем что при этом сценарии не будет эскалации на управляемой блокировки, что при большом количестве регистраторов словить как нечего делать
|
|||
37
palsergeich
26.03.19
✎
21:31
|
(34) Монопольный режим чем не устраивает?
Просто ты блокируешь конкретные записи, а сервер раз и эскалацию на все пространство имен захотел и наложил. |
|||
38
Franchiser
гуру
26.03.19
✎
21:32
|
На форме обработки есть ТЧ, которая будет заполнена данными регистра и номерами записей регистра. За время заполнения ТЧ и нажатия кнопки исправления регистра есть время когда что-то может быть кем-то испорчено в теории.
|
|||
39
palsergeich
26.03.19
✎
21:32
|
Я в 8.2 ловил эскалацию на 2000 записей, хотя по мануалам это число должно быть куда как больше.
|
|||
40
Cyberhawk
26.03.19
✎
21:32
|
(38) Ну так после нажатия кнопки проверь, что ничего не испорчено
|
|||
41
palsergeich
26.03.19
✎
21:33
|
(40) Кстати да
|
|||
42
Franchiser
гуру
26.03.19
✎
21:33
|
(40) ну ок, нет так нет
|
|||
43
Franchiser
гуру
26.03.19
✎
21:34
|
(41) ну что, ну предположим испорчено, тогда ошибка. А я хочу блокировку. Такой вариант я тоже сейчас учитываю.
|
|||
44
Franchiser
гуру
26.03.19
✎
21:37
|
Я не прошу помощи в реализации, а интересно можно ли сделать блокировку регистра накопления при открытии формы обработки без транзакций или нет.
|
|||
45
palsergeich
26.03.19
✎
21:38
|
(44) По самой постановке задачи ответ нет.
Блокировка = транзакция |
|||
46
palsergeich
26.03.19
✎
21:40
|
Уточню транзакция без блокировки возможна, а блокировка без транзакции - нет.
Костыль с объектной блокировкой - это не настоящая блокировка просто) она своим названием вводит в заблуждение) |
|||
47
Franchiser
гуру
26.03.19
✎
21:41
|
А как же блокировка по ключу записи регистра сведений?
|
|||
48
palsergeich
26.03.19
✎
21:41
|
(47) ну наложи ее вне транзакции, попробуй
|
|||
49
Franchiser
гуру
26.03.19
✎
21:45
|
(48) я не говорю про объект Блокировка.
|
|||
50
palsergeich
26.03.19
✎
21:46
|
(49) а про что?
|
|||
51
Franchiser
гуру
26.03.19
✎
21:54
|
(50) про метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
|
|||
52
palsergeich
26.03.19
✎
21:57
|
(51) Это объектная блокировка, по сути реализация (27) на уровне сервера 1С
К транзакции и блокировке не имеет отношения никакого. |
|||
53
palsergeich
26.03.19
✎
21:58
|
Просто запись что под таким то сеансом такой то идентификатор такой то версии захвачен.
Отваливается сеанс и только дергать сервер, для того что бы с этим объектом работать снова можно было) |
|||
54
palsergeich
26.03.19
✎
22:00
|
Они кстати на обучении говорят что для объектной блокировки слово блокировка зря выбрали. Очень много у неокрепших умов путаницы из-за этого.
Но мануалы написаны, а фарш обратно не провернешь |
|||
55
Garykom
гуру
26.03.19
✎
22:04
|
(38) Забей и делай просто пост контроль, после исправления регистра.
Если кем то испорчено то откатывайся и снова. |
|||
56
palsergeich
26.03.19
✎
22:05
|
(55) Согласен, по мне самый разумный вариант.
|
|||
57
Franchiser
гуру
26.03.19
✎
22:29
|
(55) (56) я думал есть более красивый вариант, но нет так нет
|
|||
58
Garykom
гуру
26.03.19
✎
22:35
|
(57) Тебе блокировать надо от исправления старых документов которые проводки/записи сделали или от новых?
|
|||
59
Franchiser
гуру
26.03.19
✎
23:33
|
(58) Старых
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |