![]() |
![]() |
![]() |
|
Помогите перевести документ на "Управляемые блокировки" | ☑ | ||
---|---|---|---|---|
0
Alex_MA
11.10.10
✎
15:58
|
Доброго всем дня!
"Управление торговлей", редакция 10.3 (10.3.13.2) Документ "РеализацияТоваровУслуг". Решил перевести БД на управляемые блокировки. 1.Установил св-во конфигурации "Режим управления блокировкой данных" в значение "Автоматический и упраляемый" (Постепенный переход) 2.Начал с документа "Реализация товаров услуг" (Режим блокировки "Управляемый") 3.У регистров, у которых регистратором является "Реализация товаров услуг" выставил режим блокировки "Управляемый". Дальше возникают вопросы. открываю обработку проведения документа. Что там писать ? Для каждого регистра пишем?: Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Продажди.НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); И так дальше для всех регистров, по которым делаются движения ? Или вот так: //Вставка Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("Последовательность.партионныйУчет.НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КоллекцияДвижений = ЭтотОбъект.Метаданные().Движения; Для Каждого СтрокаДвижения Из КоллекцияДвижений Цикл ИмяРегистра = СтрокаДвижения.ПолноеИмя(); ТипРегистра = ""; Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "регистрНакопления"; Иначе ТипРегистра = "РегистрСведений"; КонецЕсли; Если ТипРегистра <> "" Тогда ЭлементБлокировки = Блокировка.Добавить(ТипРегистра + "." + ИмяРегистра + ".НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КонецЕсли; КонецЦикла; Блокировка.Заблокировать(); //\mas Если мУдалятьДвижения Тогда ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ); КонецЕсли; //\Вставка Кто реализовал данный механизм у себя ? Ай нид хелп. Спасибо уважаемые за внимание. |
|||
1
zyto
11.10.10
✎
16:04
|
ИМХО ход мыслей вполне правильный.
На курсах говорили что нужно ставить исключительные блокировки на те регистры, в которые будем писать, и разделяемые на те, данные которых влияют на движения текущего документа. (типа закладочка) |
|||
2
acsent
11.10.10
✎
16:07
|
Юзай лучше подход из УТ11. Проверка после записи
|
|||
3
zyto
11.10.10
✎
16:08
|
кстати, вот тут ИМХО не верно:
ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); тебе надо блокировку не на регистратор ставить, а на те значения измерений - которые будешь двигать. Можно например для массива номенклатуры и склада установить блокировку, можно добавить отдельную блокировку на каждую пару номенклатура-характеристика и т.д. |
|||
4
DrShad
11.10.10
✎
16:08
|
(0) а ты смелый, только вот вопрос зачем все это? мы уже как то игрались с блокировками на БП КОРП, в модулях все прописано на уровне типовой, но нифига не стало быстрее
|
|||
5
Alex_MA
11.10.10
✎
16:12
|
(4)у нас есть РИБ, когда перепроводится месяц - при выгрузке в филиалы не хотелось бы тормозить работу пользователей
|
|||
6
Alex_MA
11.10.10
✎
16:13
|
(5)+вообщем необходимо
|
|||
7
DrShad
11.10.10
✎
16:15
|
(6) мы тоже игрались когда перепроводили месяц, но имхо пока месяц перепроводится и идет исключительная блокировка регистра бухгалтерии, то тут все курят
|
|||
8
DrShad
11.10.10
✎
16:17
|
выходит что у тебя не юзвери друг другу мешают проводить РН, а перепроведение месяца всех блокирует
|
|||
9
Alex_MA
11.10.10
✎
16:18
|
(8)ну отчасти, юзвери тоже очень себя блокируют
|
|||
10
Живой Ископаемый
11.10.10
✎
16:20
|
2(4) оно и не должно стать "быстрее"
управляемые блокировки не для увеличения скорости.. А для увеличения паралельности |
|||
11
zyto
11.10.10
✎
16:20
|
(7)В том-то и прикол, что правильно настроенные блокировки не блокируют весь регистр, а только конкретные данные (грубо говоря конкретные записи, но это очень грубо).
Поэтому документы, работающие по другим данным могут проводиться. |
|||
12
Alex_MA
11.10.10
✎
16:21
|
получается вот так ?
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Перем Заголовок, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоТаре; Перем ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам; //mas Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("Последовательность.партионныйУчет.НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КоллекцияДвижений = ЭтотОбъект.Метаданные().Движения; Для Каждого СтрокаДвижения Из КоллекцияДвижений Цикл ИмяРегистра = СтрокаДвижения.ПолноеИмя(); ТипРегистра = ""; Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "регистрНакопления"; Иначе ТипРегистра = "РегистрСведений"; КонецЕсли; Если ТипРегистра <> "" Тогда ЭлементБлокировки = Блокировка.Добавить(ТипРегистра + "." + ИмяРегистра + ".НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КонецЕсли; КонецЦикла; Блокировка.Заблокировать(); //\mas Если мУдалятьДвижения Тогда ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ); КонецЕсли; |
|||
13
DrShad
11.10.10
✎
16:22
|
(11) это то и понятно, но какова вероятность что в момент проведения РН, перепроводится другая накладная со схожим набором субконто к примеру? высока
|
|||
14
DrShad
11.10.10
✎
16:23
|
+(13) вот и выходит что управляемые могут помочь, к примеру в торговом зале с несколькими отделами, когда две накладные всегда с разным составом товаров
|
|||
15
Живой Ископаемый
11.10.10
✎
16:25
|
2(13) Ну тогда и ничего страшного не случится - второй юзер получит блокировку таблиц что с управляемыми блокировками, что без них.
|
|||
16
DrShad
11.10.10
✎
16:26
|
(15) вот и смысл из-за этого париться, хотя конечно опыт подрастет
|
|||
17
Alex_MA
11.10.10
✎
16:27
|
(13, 14, 15)согласен. Давайте попробуем реализовать :)
Сделал все как в (12), обновил конфу, зашел в режим предприятия, взял провед. документ. Снимаю проведение. Ошибка: Ошибка при выполнении обработчика - 'ПередЗаписью' по причине: {Документ.РеализацияТоваровУслуг(5624)}: Ошибка при получении значения атрибута контекста (ВидДоговора) по причине: по причине: Ошибка использования Менеджера блокировок Автоматический режим блокировки недопустим в этой транзакции. |
|||
18
NcSteel
11.10.10
✎
16:28
|
(13) Если три позиции товара в организации , то понятно что не спасут , а есле 10000 то вполне.
|
|||
19
Alex_MA
11.10.10
✎
16:33
|
На ИТС практической инфы вообще NULL.
|
|||
20
Dmitrii
гуру
11.10.10
✎
16:37
|
(17) Удаление движений у документа надо указать "Не удалять движения автоматически". Прописать обработчик отмены проведения. В обработке проведения проверять удалены ли все записи регистров.
|
|||
21
Alex_MA
11.10.10
✎
16:46
|
(20)>>Прописать обработчик отмены проведения
Т.е. в ОбработкеПроведения: Если РежимЗаписиДокумента.ОтменаПроведения Тогда //Обработчик отмены проведения КонецЕсли; Как то так ? |
|||
22
Dmitrii
гуру
11.10.10
✎
16:48
|
(21) Нет. :)
Есть предопределенная процедура ОбработкаУдаленияПроведения() |
|||
23
Alex_MA
11.10.10
✎
16:53
|
(22) первым делом заходит в процедуру
// Процедура вызывается перед записью документа // Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) И в ней уже ошибка |
|||
24
Dmitrii
гуру
11.10.10
✎
16:53
|
Посмотри как это сделано в типовых. Там в обработке удаления проведения вызывается из общего модуля универсальная процедурка, которая очищает всех наборов записей регистров по документу.
|
|||
25
Adept
11.10.10
✎
16:55
|
(0) Все просто. Смотришь все выборки данных. Там где то что выбирается то меняется
блокируешь исключительной блокировкой. ЭлементБлокировки = Блокировка.Добавить("Последовательность.партионныйУчет"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Еще одно замечание. Надо руками удалять движения документа, т.к. автоматом при записи пустого набора для удаления заблокируется вся таблица. Тоже с последовательностями. |
|||
26
Dmitrii
гуру
11.10.10
✎
16:55
|
(23) обработкаУдаленияПроведения() прописал?
|
|||
27
Alex_MA
11.10.10
✎
16:56
|
(26)нет
|
|||
28
Alex_MA
11.10.10
✎
16:59
|
(26)вот такая типовая обработка
|
|||
29
Alex_MA
11.10.10
✎
16:59
|
Процедура ОбработкаУдаленияПроведения(Отказ)
ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ); КонецПроцедуры |
|||
30
Adept
11.10.10
✎
17:00
|
(29)- засунь в подписку это что бы с каждым доком не париться
|
|||
31
Alex_MA
12.10.10
✎
08:24
|
(30)В модуле каждого объекта сделано уже.
|
|||
32
Alex_MA
12.10.10
✎
08:34
|
Реализация тов. услуг.
Удаление движений: "Не удалять автоматически" В режиме 1С Предприятие беру проведенный документ, нажимаю отмену проведения, в результате по стеку 1-я процедура "ПередЗаписью" вызывает процедуру УчетНДС.ПроверитьСоответствиеРеквизитовСчетаФактуры(ЭтотОбъект); В ней на строке Если МетаРекв.Найти("Организация") <> Неопределено И СчетФактура.Организация <> ДокОбъект.Организация Тогда Возникает ошибка из (17) |
|||
33
Alex_MA
12.10.10
✎
08:35
|
(32) + Ошибку вызывает СчетФактура.Организация (Если посмотреть это свойство в отладчике, то оно содержит "Ошибка чтения")
|
|||
34
Alex_MA
12.10.10
✎
09:15
|
апну ?
|
|||
35
rsv
12.10.10
✎
09:44
|
(0) Достаньте где нибудь типовую бухию . Это конфа 1Сом уже переведена на управляемые в поставке. Как пример будет.
|
|||
36
rsv
12.10.10
✎
09:47
|
(16) Ну и продолжайте работать на самом верхнем уровне изоляции. Ловите таймауты :)
|
|||
37
Alex_MA
13.10.10
✎
09:04
|
Позволю апнуть.
В чем таки ошибка в (32) |
|||
38
Alex_MA
13.10.10
✎
09:28
|
СчетФактура = НайтиПодчиненныйДокумент( ДокОбъект.Ссылка, ВидДокумента, Ложь); //Получаем счет фактуру
Если СчетФактура = Неопределено Тогда Возврат Истина; КонецЕсли; Текст = ""; структураРеквизиты = новый Структура; Флаг = Истина; МетаРекв = ДокОбъект.Метаданные().Реквизиты; МетаСФ = Метаданные.Документы[ВидДокумента].Реквизиты; Если ДокОбъект.Ссылка.Дата <> ДокОбъект.Дата И НачалоДня(ДокОбъект.Дата) <> НачалоДня(СчетФактура.Дата) Тогда Если Сообщать Тогда Сообщить("Изменена дата документа-основания. Возможно требуется внести изменения в счет-фактуру.", СтатусСообщения.Внимание); КонецЕсли; СтруктураРеквизиты.Вставить("Дата", ДокОбъект.Дата); Флаг = Ложь; КонецЕсли; Если МетаРекв.Найти("Организация") <> Неопределено И СчетФактура.Организация <> ДокОбъект.Организация Тогда ОШИБКА ПРИ: СчетФактура.Организация Т.е. СчетФактура = НайтиПодчиненныйДокумент( ДокОбъект.Ссылка, ВидДокумента, Ложь); Счет фактуру тоже надо блокировать ? |
|||
39
Alex_MA
13.10.10
✎
11:02
|
апну ?
|
|||
40
Alex_MA
13.10.10
✎
14:19
|
// Процедура вызывается перед записью документа
// Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) //mas Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("Последовательность.ПартионныйУчет.НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КоллекцияДвижений = ЭтотОбъект.Метаданные().Движения; Для Каждого СтрокаДвижения Из КоллекцияДвижений Цикл ИмяРегистра = СтрокаДвижения.Имя; ТипРегистра = ""; Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "регистрНакопления"; Иначе ТипРегистра = "РегистрСведений"; КонецЕсли; Если ТипРегистра <> "" Тогда ЭлементБлокировки = Блокировка.Добавить(ТипРегистра + "." + ИмяРегистра + ".НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Регистратор", Ссылка); КонецЕсли; КонецЦикла; Блокировка.Заблокировать(); //\mas Заблокировал все объекты по которым дел. движения. Дальше в теле процедуры есть строка Если Услуги.Количество() > 0 И ДоговорКонтрагента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда //ОШИБКА, т.к в отладчике ДоговорКонтрагента.ВидДоговора = Ошибка чтения Т.е. данный справочник нужно тоже поставить в управл. режим блокировок (В палитре свойств объекта метаданных)? Или как еще ? |
|||
41
Alex_MA
13.10.10
✎
15:06
|
таки опять ап
|
|||
42
Alex_MA
13.10.10
✎
15:30
|
опять утонула - подъем
все грустнее и грустнее |
|||
43
Alex_MA
13.10.10
✎
16:17
|
Поставил свойство "Режим управления блокировкой данных" = Управляемый. Ошибка больше не вылезает на этом месте.
Странно, я ведь не получаю объект "ДоговорКонтрагента" в: Если Услуги.Количество() > 0 И ДоговорКонтрагента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда С какого фига сдесь стартует автоматическая транзакция ????? Сдесь просто анализируется свойство по ссылке. И еще, режим управления блокировками "Управляемый и автом" придуман для плавного перехода на управл. блокировки, однако, анализируя вышеописанный пример могу сказать что это полная ЧЕПУХНЯ. Может я ошибаюсь ? |
|||
44
Alex_MA
13.10.10
✎
17:14
|
Есть какой нибудь визуальный инструмент проверки заблокированных объектов ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |