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

Установка блокировки на регистр при запуске обработки

Установка блокировки на регистр при запуске обработки
Я
   Franchiser
 
26.03.19 - 20:09
Хочу при открытии обработки установить блокировку на регистр накопления и снять её после закрытия обработки. Как это сделать?
 
 
   H A D G E H O G s
 
1 - 26.03.19 - 20:14
Зачем?
   Franchiser
 
2 - 26.03.19 - 20:18
Планирую в обработке заполнить ТЧ записями регистра с номером записи, и потом по номеру записи выполнить исправление отдельных записей .
   Franchiser
 
3 - 26.03.19 - 20:19
В типовой обработке дат запрет изменения это как то реализовано.
   H A D G E H O G s
 
4 - 26.03.19 - 20:19
Ну обычным способом не получится, только упр. блокировка на время вызова.
   H A D G E H O G s
 
5 - 26.03.19 - 20:20
Необычно - создать справочник с препопределенными значениями и блокировать их
   Franchiser
 
6 - 26.03.19 - 20:20
Блокировки я умею ставить в транзакции, а эту блокировку нужно как то к уид формы привязать.
   H A D G E H O G s
 
7 - 26.03.19 - 20:21
Попытка
        ЗаблокироватьДанныеДляРедактирования(Справочники.АСФОбъектыБлокировки.ОбменСOmobus);
    Исключение
        Ошибка=ИнформацияОбОшибке();
        ОписаниеОшибки=Ошибка.Причина.Описание;
        СтруктураВозврата=Новый Структура;
        СтруктураВозврата.Вставить("Результат",Ложь);
        СтруктураВозврата.Вставить("ОписаниеОшибки","Обработка заблокирована и не будет запущена во избежание дублирования загрузки: "+ОписаниеОшибки);
        ЕстьОшибкаБлокировки=Истина;
        
    КонецПопытки;
   H A D G E H O G s
 
8 - 26.03.19 - 20:22
Если надо привязать к форме - там есть 3 параметр на УИД
   H A D G E H O G s
 
9 - 26.03.19 - 20:22
ЗаблокироватьДанныеДляРедактирования (LockDataForEdit)
Синтаксис:

ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>)
   Franchiser
 
10 - 26.03.19 - 20:23
(5) не, справочник я не буду делать. Мне чисто для интереса. Сейчас у меня сделана блокировка на набор записей
   Cyberhawk
 
11 - 26.03.19 - 20:23
(7) Ну это сработает только если в других местах тоже такая договоренность имеется (пытаться заблокировать элемент справочника)
   Franchiser
 
12 - 26.03.19 - 20:25
(9) это позволяет блокировать весь регистр, без указания ключа ?
   H A D G E H O G s
 
13 - 26.03.19 - 20:25
(11) Транзакция завершается при завершении серверного вызова, поэтому, либо (7), либо никак.
   H A D G E H O G s
 
14 - 26.03.19 - 20:26
(12) Нет. В документации видно, что может являться ключом блокировки
   Franchiser
 
15 - 26.03.19 - 20:28
Ладно, потом посмотрю как сделали в обработке редактирования дат запрета, что нельзя писать в другом сеансе в регистр дат запрета. Они как то через ВХ блокировки передают.
   H A D G E H O G s
 
16 - 26.03.19 - 20:37
(15) Через КлючЗаписи РС ДатыЗапретаИзменения и ЗаблокироватьДанныеДляРедактирования()
   Franchiser
 
17 - 26.03.19 - 20:39
Да нашел:

&НаСервереБезКонтекста
Процедура РазблокироватьВсеЗаписиНаСервере(АдресУстановленныхБлокировок)
    
    Блокировки = ПолучитьИзВременногоХранилища(АдресУстановленныхБлокировок);
    ЗначенияКлючаЗаписи = Новый Структура("Раздел, Объект, Пользователь");
    Попытка
        Индекс = Блокировки.Состав.Количество() - 1;
        Пока Индекс >= 0 Цикл
            ЗаполнитьЗначенияСвойств(ЗначенияКлючаЗаписи, Блокировки.Состав[Индекс]);
            КлючЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьКлючЗаписи(ЗначенияКлючаЗаписи);
            РазблокироватьДанныеДляРедактирования(КлючЗаписи, Блокировки.ИдентификаторФормы);
            Блокировки.Состав.Удалить(Индекс);
            Индекс = Индекс - 1;
        КонецЦикла;
    Исключение
        ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок);
        ВызватьИсключение;
    КонецПопытки;
    ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаблокироватьЗаписьНаСервере(ОписаниеКлючаЗаписи, АдресУстановленныхБлокировок)
    
    Блокировки = ПолучитьИзВременногоХранилища(АдресУстановленныхБлокировок);
    ЗначенияКлючаЗаписи = Новый Структура("Раздел, Объект, Пользователь");
    ЗаполнитьЗначенияСвойств(ЗначенияКлючаЗаписи, ОписаниеКлючаЗаписи);
    КлючЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьКлючЗаписи(ЗначенияКлючаЗаписи);
    ЗаблокироватьДанныеДляРедактирования(КлючЗаписи, , Блокировки.ИдентификаторФормы);
    БлокировкаДобавлена = Ложь;
    Если Блокировки.Состав.НайтиСтроки(ЗначенияКлючаЗаписи) = 0 Тогда
        ЗаполнитьЗначенияСвойств(Блокировки.Состав.Добавить(), ЗначенияКлючаЗаписи);
        БлокировкаДобавлена = Истина;
    КонецЕсли;
    ПоместитьВоВременноеХранилище(Блокировки, АдресУстановленныхБлокировок);
    
    Возврат БлокировкаДобавлена;
    
КонецФункции
   Franchiser
 
18 - 26.03.19 - 20:45
(16) с регистрами сведений понятно.
А для регистров накопления ЗаблокироватьДанныеДляРедактирования работает?
   Cyberhawk
 
19 - 26.03.19 - 20:47
(13) Насчет "никак" это ты погорячился. Что мешает удерживать транзакцию сколько нужно (например, внутри нее крутить цикл с условием выхода)?
   H A D G E H O G s
 
20 - 26.03.19 - 20:48
(19) Ясное и незамутненное мутотней восприятие реальности.
   H A D G E H O G s
 
21 - 26.03.19 - 20:49
(18) Вряд ли, в СП только РС. Но, если у вас получится, напишите сюда.
   Franchiser
 
22 - 26.03.19 - 21:02
Можно попробовать установить блокировку на регистраторы.
Вот пример с ИТС:
&НаСервере
Функция ПримерМодификации()
    ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000001");
    Попытка
        ЗаблокироватьДанныеДляРедактирования(ТоварСсылка);
        // Можно выполнять модификацию данных объекта

        // ...

        ТоварОбъект = ТоварСсылка.ПолучитьОбъект();
        ТоварОбъект.Наименование = "Новое наименование";
        ТоварОбъект.Записать();
        Возврат Истина;
    Исключение
        // Нельзя модифицировать данные объекта

        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Данные объекта уже заблокированы";
        Сообщение.Сообщить();
        Возврат Ложь;
    КонецПопытки;
КонецФункции
   palsergeich
 
23 - 26.03.19 - 21:11
(19) а то что потом люди что бы как то работать в базе ставят ожидание 600 секунд.
Прямо сейчас я в такой базе копаюсь, у меня просто горит, а самое главное, то что там наху..верчено, совершенно бессмысленно.
   palsergeich
 
24 - 26.03.19 - 21:12
Я не говорю что это невозможно, но архитектурное решение под эту задачу выбрано неверно. У одного обработка открыта, он пошел пить чай, остальные работать не могут.
Круче только вопрос в обработке проведения задавать.
   palsergeich
 
25 - 26.03.19 - 21:14
(22) уже лучше, но все равно не торт
   palsergeich
 
26 - 26.03.19 - 21:18
Но объектная блокировка - это последнее дело.
   palsergeich
 
27 - 26.03.19 - 21:24
Самый тупой способ реализации этой задачи:
Создается РС.
при старте обработки он заполняется.
При закрытии как то очищается.
+ Подписка на событие записи этого регистра. отказ, когда такая запись в служебном регистре есть.
Нормально этот регистр будет пустой, влияние на производительность должно быть минимальным.
   Franchiser
 
28 - 26.03.19 - 21:25
Да у меня вообще разовая обработка, не буду я регистры создавать
   palsergeich
 
29 - 26.03.19 - 21:25
(28) Все вы так говорите
   palsergeich
 
30 - 26.03.19 - 21:27
А потом эта разовая обработка вызывается раз в 5 минут, вся база в управляемых блокировках, таймаут 600 секунд выкручен.
В таком виде мне одна база досталась вчера.
 
 Рекламное место пустует
   Cyberhawk
 
31 - 26.03.19 - 21:27
(24) "У одного обработка открыта, он пошел пить чай, остальные работать не могут" // Так это ж "проектное решение" из сабжа - пока обработка открыта
   Cyberhawk
 
32 - 26.03.19 - 21:28
Чем отличается  плане невозможности работы других от (27) - хз
   palsergeich
 
33 - 26.03.19 - 21:28
(31) Ну дык установи монопольный режим и не ипи мозги)
В БСП же ща шикарная выгонялка, одному в базе остаться - 2 клика
   Franchiser
 
34 - 26.03.19 - 21:29
я блокирую только документ операция определенного типа, загруженные автоматически, их никто и не открывает кроме меня
   Cyberhawk
 
35 - 26.03.19 - 21:30
А зачем тебе блокировать при открытии, а не при нажатии кнопки, когда собственно что-то и начнет происходить?
   palsergeich
 
36 - 26.03.19 - 21:30
(32) тем что при этом сценарии не будет эскалации на управляемой блокировки, что при большом количестве регистраторов словить как нечего делать
   palsergeich
 
37 - 26.03.19 - 21:31
(34) Монопольный режим чем не устраивает?
Просто ты блокируешь конкретные записи, а сервер раз и эскалацию на все пространство имен захотел и наложил.
   Franchiser
 
38 - 26.03.19 - 21:32
На форме обработки есть ТЧ, которая будет заполнена данными регистра и номерами записей регистра. За время заполнения ТЧ и нажатия кнопки исправления регистра есть время когда что-то может быть кем-то испорчено в теории.
   palsergeich
 
39 - 26.03.19 - 21:32
Я в 8.2 ловил эскалацию на 2000 записей, хотя по мануалам это число должно быть куда как больше.
   Cyberhawk
 
40 - 26.03.19 - 21:32
(38) Ну так после нажатия кнопки проверь, что ничего не испорчено
   palsergeich
 
41 - 26.03.19 - 21:33
(40) Кстати да
   Franchiser
 
42 - 26.03.19 - 21:33
(40) ну ок, нет так нет
   Franchiser
 
43 - 26.03.19 - 21:34
(41) ну что, ну предположим испорчено, тогда ошибка. А я хочу блокировку. Такой вариант я тоже сейчас учитываю.
   Franchiser
 
44 - 26.03.19 - 21:37
Я не прошу помощи в реализации, а интересно можно ли сделать блокировку регистра накопления при открытии формы обработки без транзакций или нет.
   palsergeich
 
45 - 26.03.19 - 21:38
(44) По самой постановке задачи ответ нет.
Блокировка = транзакция
   palsergeich
 
46 - 26.03.19 - 21:40
Уточню транзакция без блокировки возможна, а блокировка без транзакции - нет.
Костыль с объектной блокировкой - это не настоящая блокировка просто) она своим названием вводит в заблуждение)
   Franchiser
 
47 - 26.03.19 - 21:41
А как же блокировка по ключу записи регистра сведений?
   palsergeich
 
48 - 26.03.19 - 21:41
(47) ну наложи ее вне транзакции, попробуй
   Franchiser
 
49 - 26.03.19 - 21:45
(48) я не говорю про объект Блокировка.
   palsergeich
 
50 - 26.03.19 - 21:46
(49) а про что?
   Franchiser
 
51 - 26.03.19 - 21:54
(50) про метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
   palsergeich
 
52 - 26.03.19 - 21:57
(51) Это объектная блокировка, по сути реализация (27) на уровне сервера 1С
К транзакции и блокировке не имеет отношения никакого.
   palsergeich
 
53 - 26.03.19 - 21:58
Просто запись что под таким то сеансом такой то идентификатор такой то версии захвачен.
Отваливается сеанс и только дергать сервер, для того что бы с этим объектом работать снова можно было)
   palsergeich
 
54 - 26.03.19 - 22:00
Они кстати на обучении говорят что для объектной блокировки слово блокировка зря выбрали. Очень много у неокрепших умов путаницы из-за этого.
Но мануалы написаны, а фарш обратно не провернешь
   Garykom
 
55 - 26.03.19 - 22:04
(38) Забей и делай просто пост контроль, после исправления регистра.
Если кем то испорчено то откатывайся и снова.
   palsergeich
 
56 - 26.03.19 - 22:05
(55) Согласен, по мне самый разумный вариант.
   Franchiser
 
57 - 26.03.19 - 22:29
(55) (56) я думал есть более красивый вариант, но нет так нет
   Garykom
 
58 - 26.03.19 - 22:35
(57) Тебе блокировать надо от исправления старых документов которые проводки/записи сделали или от новых?
   Franchiser
 
59 - 26.03.19 - 23:33
(58) Старых


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.