Имя: Пароль:
1C
 
Помогите перевести документ на "Управляемые блокировки"
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
Есть какой нибудь визуальный инструмент проверки заблокированных объектов ?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.