Имя: Пароль:
1C
1С v8
НачатьТранзакцию() в управляемом режиме блокировок
,
0 noxxx
 
17.01.13
17:51
Господа-товарищи! Есть вопрос.

Имеется обработка, которая загружает нечто из xml-файла в базу УПП. Запись каждого объекта ведется в два этапа: запись самого объекта и запись идентификатора внешней базы в регистр сведений. Соответственно, если запись элемента или идентификатора не удалась, то надо откатить обе записи.
Поэтому запись каждого элемента обернули в НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Проблема в том, что элементов много (несколько десятков, иногда сотни тысяч), загрузка длится около 3 минут, и пока эта вакханалия продолжается, почему-то нельзя зайти в элемент справочника "Номенклатура", записать заказ покупателя и т.п.

Отсюда вопросы:

1. Как НачатьТранзакцию() определяет что именно ей блокировать
2. Как ей указать что именно блокировать
3. Почему попытка проведения документа не пролетает в паузу между записями элементов этой нашей обработкой?
1 noxxx
 
17.01.13
17:52
Запись не каждого элемента, а запись каждой пары.
2 ProgAL
 
17.01.13
18:09
Попробуй ПриЗаписи элемента справочника в модуле объекта создавать запись в регистре сведений в попытке. Если внутри попытки исключение отказ = истина. По смыслу все откатится.
3 noxxx
 
17.01.13
23:54
up
4 noxxx
 
18.01.13
10:37
ап-ап-ап
5 noxxx
 
18.01.13
10:38
(2) Эти две записи связаны между собой только в обработке, а в обычной жизни в ПриЗаписи элемента ссылка не пишется.
6 stonewolf
 
18.01.13
10:50
(0) почему-то нельзя зайти в элемент справочника "Номенклатура"
-------------
Неправильно или вообще не наложена блокировка.

Как НачатьТранзакцию() определяет что именно ей блокировать
-------------
БлокировкаДанных (DataLock)
Элементы коллекции:

ЭлементБлокировкиДанных
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы блокировки.
Возможно обращение к элементам блокировки посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0).

Методы:

Добавить (Add)
Заблокировать (Lock)
Количество (Count)
Получить (Get)

Конструкторы:

По умолчанию

Описание:

Предназначен для явной блокировки данных от чтения или изменения другими сессиями.
7 ProgAL
 
18.01.13
21:58
Попробуй такой код по аналогии из БСП.

НачатьТранзакцию();
   Попытка
       
       
       Об = Справочники.Организации.СоздатьЭлемент();
       Об.Наименование = "" + ТекущаяДата();
       Об.Записать();
       
       Блокировка = Новый БлокировкаДанных;
       ЭлементБлокировки = Блокировка.Добавить("Справочник.Организации");
       ЭлементБлокировки.УстановитьЗначение("Ссылка", Об.Ссылка);
       Блокировка.Заблокировать();

       
       
       МенеджерЗаписи = РегистрыСведений.КлючВоВнешнейБД.СоздатьМенеджерЗаписи();
       МенеджерЗаписи.Объект = Об.Ссылка;
       
       МенеджерЗаписи.Прочитать();
       
       МенеджерЗаписи.Объект = Об.Ссылка;
       МенеджерЗаписи.ИД = "555";
               
       МенеджерЗаписи.Записать();
       
       ааа = 1/0;
       
       ЗафиксироватьТранзакцию();
   Исключение
       ОтменитьТранзакцию();
       ВызватьИсключение;
       Сообщить("" + ОписаниеОшибки());
   КонецПопытки;
8 Armando
 
18.01.13
22:38
(0) точно что вся загрузка не выполняется в какой-то другой транзакции?
9 noxxx
 
24.01.13
12:28
Вроде как метод из (7) помог решить проблему! Спасибо!
10 ProgAL
 
24.01.13
12:36
(9) Странно, что у меня и без  

Блокировка = Новый БлокировкаДанных;
       ЭлементБлокировки = Блокировка.Добавить("Справочник.Организации");
       ЭлементБлокировки.УстановитьЗначение("Ссылка", Об.Ссылка);
       Блокировка.Заблокировать();

работало нормально и я мог из 2 сеанса открывать все постронние элементы справочника номенклатура. Возможно, это зависит от режима блокировки в корне конфигурации и в объекте (справочнике номенклатура.).
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший