Имя: Пароль:
1C
1С v8
Установка блокировки на регистр при запуске обработки
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) Старых